: [NETFILTER]: Use conntrack information to determine if packet was NATed
Subsystems (3)
PATCH 8/10 : [NETFILTER]: Use conntrack information to determine if packet was NATed
[NETFILTER]: Use conntrack information to determine if packet was NATed
Preparation for full IPsec support for NAT:
Use conntrack information instead of saving the saving and comparing the addresses to determine if a packet was NATed and needs to be rerouted to make it easier to extend the key.
Signed-off-by Patrick McHardy <[email protected]>
---
commit 351bc1c8a9c5c5e4aa48c153f0050f0a8b979201
tree 9f8a0f9472ed609beba69bf653fa7833d61db339
parent 909b664477ab16fc04f2bf24ef92676117ccbc26
author Patrick McHardy <[email protected]> Fri, 11 Nov 2005 03:04:28 +0100 committer Patrick McHardy <[email protected]> Fri, 11 Nov 2005 03:04:28 +0100
net/ipv4/netfilter/ip_nat_standalone.c | 34 ++++++++++++++++++-------------- 1 files changed, 19 insertions(+), 15 deletions(-)
net/ipv4/netfilter/ip_nat_standalone.c +19 -15
@@ -162,18 +162,20 @@ ip_nat_in(unsigned int hooknum,const struct net_device *out, int (*okfn)(struct sk_buff *)) { - u_int32_t saddr, daddr; + struct ip_conntrack *ct; +enum ip_conntrack_info ctinfo;unsigned int ret; - saddr = (*pskb)->nh.iph->saddr; - daddr = (*pskb)->nh.iph->daddr; - ret =ip_nat_fn (hooknum, pskb, in, out, okfn);if (ret !=NF_DROP && ret !=NF_STOLEN - && ((*pskb)->nh.iph->saddr != saddr - || (*pskb)->nh.iph->daddr != daddr)) { -dst_release ((*pskb)->dst); - (*pskb)->dst =NULL ; + && (ct =ip_conntrack_get (*pskb, &ctinfo)) !=NULL ) { +enum ip_conntrack_dir dir =CTINFO2DIR (ctinfo); + +if (ct->tuplehash[dir].tuple.src.ip != + ct->tuplehash[!dir].tuple.dst.ip) { +dst_release ((*pskb)->dst); + (*pskb)->dst =NULL ; + } }return ret; }
@@ -202,7 +204,8 @@ ip_nat_local_fn(unsigned int hooknum,const struct net_device *out, int (*okfn)(struct sk_buff *)) { - u_int32_t saddr, daddr; + struct ip_conntrack *ct; +enum ip_conntrack_info ctinfo;unsigned int ret;/* root is playing with raw sockets. */
@@ -210,14 +213,15 @@ ip_nat_local_fn(unsigned int hooknum, || (*pskb)->nh.iph->ihl * 4 < sizeof(struct iphdr))return NF_ACCEPT ; - saddr = (*pskb)->nh.iph->saddr; - daddr = (*pskb)->nh.iph->daddr; - ret =ip_nat_fn (hooknum, pskb, in, out, okfn);if (ret !=NF_DROP && ret !=NF_STOLEN - && ((*pskb)->nh.iph->saddr != saddr - || (*pskb)->nh.iph->daddr != daddr)) -return ip_route_me_harder (pskb) ==0 ? ret :NF_DROP ; + && (ct =ip_conntrack_get (*pskb, &ctinfo)) !=NULL ) { +enum ip_conntrack_dir dir =CTINFO2DIR (ctinfo); + +if (ct->tuplehash[dir].tuple.dst.ip != + ct->tuplehash[!dir].tuple.src.ip) +return ip_route_me_harder (pskb) ==0 ? ret :NF_DROP ; + }return ret; }