Lines 261-267
Link Here
|
261 |
const struct pf_addr *, const struct pf_addr *, |
261 |
const struct pf_addr *, const struct pf_addr *, |
262 |
u_int16_t, u_int16_t, u_int32_t, u_int32_t, |
262 |
u_int16_t, u_int16_t, u_int32_t, u_int32_t, |
263 |
u_int8_t, u_int16_t, u_int16_t, u_int8_t, int, |
263 |
u_int8_t, u_int16_t, u_int16_t, u_int8_t, int, |
264 |
u_int16_t, struct ether_header *, struct ifnet *); |
264 |
u_int16_t, struct ether_header *, struct ifnet *, |
|
|
265 |
struct route *route_to_ro); |
265 |
static void pf_send_icmp(struct mbuf *, u_int8_t, u_int8_t, |
266 |
static void pf_send_icmp(struct mbuf *, u_int8_t, u_int8_t, |
266 |
sa_family_t, struct pf_rule *); |
267 |
sa_family_t, struct pf_rule *); |
267 |
void pf_detach_state(struct pf_state *); |
268 |
void pf_detach_state(struct pf_state *); |
Lines 1570-1576
Link Here
|
1570 |
cur->key[PF_SK_WIRE]->port[1], |
1571 |
cur->key[PF_SK_WIRE]->port[1], |
1571 |
cur->key[PF_SK_WIRE]->port[0], |
1572 |
cur->key[PF_SK_WIRE]->port[0], |
1572 |
cur->src.seqhi, cur->src.seqlo + 1, |
1573 |
cur->src.seqhi, cur->src.seqlo + 1, |
1573 |
TH_RST|TH_ACK, 0, 0, 0, 1, cur->tag, NULL, NULL); |
1574 |
TH_RST|TH_ACK, 0, 0, 0, 1, cur->tag, NULL, NULL, NULL); |
1574 |
} |
1575 |
} |
1575 |
#ifdef __FreeBSD__ |
1576 |
#ifdef __FreeBSD__ |
1576 |
RB_REMOVE(pf_state_tree_id, &V_tree_id, cur); |
1577 |
RB_REMOVE(pf_state_tree_id, &V_tree_id, cur); |
Lines 2265-2271
Link Here
|
2265 |
const struct pf_addr *saddr, const struct pf_addr *daddr, |
2266 |
const struct pf_addr *saddr, const struct pf_addr *daddr, |
2266 |
u_int16_t sport, u_int16_t dport, u_int32_t seq, u_int32_t ack, |
2267 |
u_int16_t sport, u_int16_t dport, u_int32_t seq, u_int32_t ack, |
2267 |
u_int8_t flags, u_int16_t win, u_int16_t mss, u_int8_t ttl, int tag, |
2268 |
u_int8_t flags, u_int16_t win, u_int16_t mss, u_int8_t ttl, int tag, |
2268 |
u_int16_t rtag, struct ether_header *eh, struct ifnet *ifp) |
2269 |
u_int16_t rtag, struct ether_header *eh, struct ifnet *ifp, struct route *route_to_ro) |
2269 |
{ |
2270 |
{ |
2270 |
struct mbuf *m; |
2271 |
struct mbuf *m; |
2271 |
int len, tlen; |
2272 |
int len, tlen; |
Lines 2442-2452
Link Here
|
2442 |
if (eh == NULL) { |
2443 |
if (eh == NULL) { |
2443 |
#ifdef __FreeBSD__ |
2444 |
#ifdef __FreeBSD__ |
2444 |
PF_UNLOCK(); |
2445 |
PF_UNLOCK(); |
2445 |
ip_output(m, (void *)NULL, (void *)NULL, 0, |
2446 |
ip_output(m, (void *)NULL, route_to_ro, 0, |
2446 |
(void *)NULL, (void *)NULL); |
2447 |
(void *)NULL, (void *)NULL); |
2447 |
PF_LOCK(); |
2448 |
PF_LOCK(); |
2448 |
#else /* ! __FreeBSD__ */ |
2449 |
#else /* ! __FreeBSD__ */ |
2449 |
ip_output(m, (void *)NULL, (void *)NULL, 0, |
2450 |
ip_output(m, (void *)NULL, route_to_ro, 0, |
2450 |
(void *)NULL, (void *)NULL); |
2451 |
(void *)NULL, (void *)NULL); |
2451 |
#endif |
2452 |
#endif |
2452 |
} else { |
2453 |
} else { |
Lines 3681-3687
Link Here
|
3681 |
#endif |
3682 |
#endif |
3682 |
pd->src, th->th_dport, th->th_sport, |
3683 |
pd->src, th->th_dport, th->th_sport, |
3683 |
ntohl(th->th_ack), ack, TH_RST|TH_ACK, 0, 0, |
3684 |
ntohl(th->th_ack), ack, TH_RST|TH_ACK, 0, 0, |
3684 |
r->return_ttl, 1, 0, pd->eh, kif->pfik_ifp); |
3685 |
r->return_ttl, 1, 0, pd->eh, kif->pfik_ifp, NULL); |
3685 |
} |
3686 |
} |
3686 |
} else if (pd->proto != IPPROTO_ICMP && af == AF_INET && |
3687 |
} else if (pd->proto != IPPROTO_ICMP && af == AF_INET && |
3687 |
r->return_icmp) |
3688 |
r->return_icmp) |
Lines 3990-3996
Link Here
|
3990 |
pf_send_tcp(r, pd->af, pd->dst, pd->src, th->th_dport, |
3991 |
pf_send_tcp(r, pd->af, pd->dst, pd->src, th->th_dport, |
3991 |
#endif |
3992 |
#endif |
3992 |
th->th_sport, s->src.seqhi, ntohl(th->th_seq) + 1, |
3993 |
th->th_sport, s->src.seqhi, ntohl(th->th_seq) + 1, |
3993 |
TH_SYN|TH_ACK, 0, s->src.mss, 0, 1, 0, NULL, NULL); |
3994 |
TH_SYN|TH_ACK, 0, s->src.mss, 0, 1, 0, NULL, NULL, NULL); |
3994 |
REASON_SET(&reason, PFRES_SYNPROXY); |
3995 |
REASON_SET(&reason, PFRES_SYNPROXY); |
3995 |
return (PF_SYNPROXY_DROP); |
3996 |
return (PF_SYNPROXY_DROP); |
3996 |
} |
3997 |
} |
Lines 4445-4451
Link Here
|
4445 |
th->th_sport, ntohl(th->th_ack), 0, |
4446 |
th->th_sport, ntohl(th->th_ack), 0, |
4446 |
TH_RST, 0, 0, |
4447 |
TH_RST, 0, 0, |
4447 |
(*state)->rule.ptr->return_ttl, 1, 0, |
4448 |
(*state)->rule.ptr->return_ttl, 1, 0, |
4448 |
pd->eh, kif->pfik_ifp); |
4449 |
pd->eh, kif->pfik_ifp, NULL); |
4449 |
src->seqlo = 0; |
4450 |
src->seqlo = 0; |
4450 |
src->seqhi = 1; |
4451 |
src->seqhi = 1; |
4451 |
src->max_win = 1; |
4452 |
src->max_win = 1; |
Lines 4566-4571
Link Here
|
4566 |
struct pf_state_peer *src, *dst; |
4567 |
struct pf_state_peer *src, *dst; |
4567 |
struct pf_state_key *sk; |
4568 |
struct pf_state_key *sk; |
4568 |
|
4569 |
|
|
|
4570 |
/* A route information is required for route-to and synproxy state combination. */ |
4571 |
struct route route_to_ro; |
4572 |
struct rtentry route_to_rt; |
4573 |
struct sockaddr_in route_to_gw; |
4574 |
struct route *route_to_ro0 = NULL; |
4575 |
|
4569 |
key.af = pd->af; |
4576 |
key.af = pd->af; |
4570 |
key.proto = IPPROTO_TCP; |
4577 |
key.proto = IPPROTO_TCP; |
4571 |
if (direction == PF_IN) { /* wire side, straight */ |
4578 |
if (direction == PF_IN) { /* wire side, straight */ |
Lines 4614-4620
Link Here
|
4614 |
pd->src, th->th_dport, th->th_sport, |
4621 |
pd->src, th->th_dport, th->th_sport, |
4615 |
(*state)->src.seqhi, ntohl(th->th_seq) + 1, |
4622 |
(*state)->src.seqhi, ntohl(th->th_seq) + 1, |
4616 |
TH_SYN|TH_ACK, 0, (*state)->src.mss, 0, 1, |
4623 |
TH_SYN|TH_ACK, 0, (*state)->src.mss, 0, 1, |
4617 |
0, NULL, NULL); |
4624 |
0, NULL, NULL, NULL); |
4618 |
REASON_SET(reason, PFRES_SYNPROXY); |
4625 |
REASON_SET(reason, PFRES_SYNPROXY); |
4619 |
return (PF_SYNPROXY_DROP); |
4626 |
return (PF_SYNPROXY_DROP); |
4620 |
} else if (!(th->th_flags & TH_ACK) || |
4627 |
} else if (!(th->th_flags & TH_ACK) || |
Lines 4630-4635
Link Here
|
4630 |
(*state)->src.state = PF_TCPS_PROXY_DST; |
4637 |
(*state)->src.state = PF_TCPS_PROXY_DST; |
4631 |
} |
4638 |
} |
4632 |
if ((*state)->src.state == PF_TCPS_PROXY_DST) { |
4639 |
if ((*state)->src.state == PF_TCPS_PROXY_DST) { |
|
|
4640 |
/* When running a combination of route-to and synproxy state, |
4641 |
the SYN packet going to route-to target must use the target interface |
4642 |
and gateway stored in connection state instead of standard route table lookup */ |
4643 |
if ( (*state)->rt_kif ) { |
4644 |
/* Assign gateway interface and flags */ |
4645 |
route_to_rt.rt_flags = RTF_UP|RTF_HOST|RTF_GATEWAY; |
4646 |
route_to_rt.rt_ifp = (*state)->rt_kif->pfik_ifp; |
4647 |
route_to_rt.rt_ifa = (*state)->rt_kif->pfik_ifp->if_addr; |
4648 |
route_to_rt.rt_rmx.rmx_mtu = (*state)->rt_kif->pfik_ifp->if_mtu; |
4649 |
|
4650 |
/* Assign gateway address. */ |
4651 |
route_to_gw.sin_family = AF_INET; |
4652 |
route_to_gw.sin_len = sizeof(struct sockaddr_in); |
4653 |
route_to_gw.sin_addr = (*state)->rt_addr.v4; |
4654 |
|
4655 |
/* Assign destination address. */ |
4656 |
((struct sockaddr_in*)&route_to_ro.ro_dst)->sin_family = AF_INET; |
4657 |
((struct sockaddr_in*)&route_to_ro.ro_dst)->sin_len = sizeof(struct sockaddr_in); |
4658 |
((struct sockaddr_in*)&route_to_ro.ro_dst)->sin_addr = sk->addr[pd->didx].v4; |
4659 |
|
4660 |
/* Glue things together */ |
4661 |
route_to_ro.ro_lle = NULL; |
4662 |
route_to_rt.rt_gateway = (struct sockaddr*)&route_to_gw; |
4663 |
route_to_ro.ro_rt = &route_to_rt; |
4664 |
route_to_ro0 = &route_to_ro; |
4665 |
} |
4666 |
|
4633 |
if (direction == (*state)->direction) { |
4667 |
if (direction == (*state)->direction) { |
4634 |
if (((th->th_flags & (TH_SYN|TH_ACK)) != TH_ACK) || |
4668 |
if (((th->th_flags & (TH_SYN|TH_ACK)) != TH_ACK) || |
4635 |
(ntohl(th->th_ack) != (*state)->src.seqhi + 1) || |
4669 |
(ntohl(th->th_ack) != (*state)->src.seqhi + 1) || |
Lines 4648-4654
Link Here
|
4648 |
&sk->addr[pd->sidx], &sk->addr[pd->didx], |
4682 |
&sk->addr[pd->sidx], &sk->addr[pd->didx], |
4649 |
sk->port[pd->sidx], sk->port[pd->didx], |
4683 |
sk->port[pd->sidx], sk->port[pd->didx], |
4650 |
(*state)->dst.seqhi, 0, TH_SYN, 0, |
4684 |
(*state)->dst.seqhi, 0, TH_SYN, 0, |
4651 |
(*state)->src.mss, 0, 0, (*state)->tag, NULL, NULL); |
4685 |
(*state)->src.mss, 0, 0, (*state)->tag, NULL, NULL, route_to_ro0); |
4652 |
REASON_SET(reason, PFRES_SYNPROXY); |
4686 |
REASON_SET(reason, PFRES_SYNPROXY); |
4653 |
return (PF_SYNPROXY_DROP); |
4687 |
return (PF_SYNPROXY_DROP); |
4654 |
} else if (((th->th_flags & (TH_SYN|TH_ACK)) != |
4688 |
} else if (((th->th_flags & (TH_SYN|TH_ACK)) != |
Lines 4667-4673
Link Here
|
4667 |
pd->src, th->th_dport, th->th_sport, |
4701 |
pd->src, th->th_dport, th->th_sport, |
4668 |
ntohl(th->th_ack), ntohl(th->th_seq) + 1, |
4702 |
ntohl(th->th_ack), ntohl(th->th_seq) + 1, |
4669 |
TH_ACK, (*state)->src.max_win, 0, 0, 0, |
4703 |
TH_ACK, (*state)->src.max_win, 0, 0, 0, |
4670 |
(*state)->tag, NULL, NULL); |
4704 |
(*state)->tag, NULL, NULL, NULL); |
4671 |
#ifdef __FreeBSD__ |
4705 |
#ifdef __FreeBSD__ |
4672 |
pf_send_tcp(NULL, (*state)->rule.ptr, pd->af, |
4706 |
pf_send_tcp(NULL, (*state)->rule.ptr, pd->af, |
4673 |
#else |
4707 |
#else |
Lines 4677-4683
Link Here
|
4677 |
sk->port[pd->sidx], sk->port[pd->didx], |
4711 |
sk->port[pd->sidx], sk->port[pd->didx], |
4678 |
(*state)->src.seqhi + 1, (*state)->src.seqlo + 1, |
4712 |
(*state)->src.seqhi + 1, (*state)->src.seqlo + 1, |
4679 |
TH_ACK, (*state)->dst.max_win, 0, 0, 1, |
4713 |
TH_ACK, (*state)->dst.max_win, 0, 0, 1, |
4680 |
0, NULL, NULL); |
4714 |
0, NULL, NULL, route_to_ro0); |
4681 |
(*state)->src.seqdiff = (*state)->dst.seqhi - |
4715 |
(*state)->src.seqdiff = (*state)->dst.seqhi - |
4682 |
(*state)->src.seqlo; |
4716 |
(*state)->src.seqlo; |
4683 |
(*state)->dst.seqdiff = (*state)->src.seqhi - |
4717 |
(*state)->dst.seqdiff = (*state)->src.seqhi - |