netfilter: nat: fix spurious connection timeouts
Sander Eikelenboom bisected a NAT related regression down
to the l4proto->manip_pkt indirection removal.
I forgot that ICMP(v6) errors (e.g. PKTTOOBIG) can be set as related
to the existing conntrack entry.
Therefore, when passing the skb to nf_nat_ipv4/6_manip_pkt(), that
ended up calling the wrong l4 manip function, as tuple->dst.protonum
is the original flows l4 protocol (TCP, UDP, etc).
Set the dst protocol field to ICMP(v6), we already have a private copy
of the tuple due to the inversion of src/dst.
Reported-by: Sander Eikelenboom <linux@eikelenboom.it>
Tested-by: Sander Eikelenboom <linux@eikelenboom.it>
Fixes: faec18dbb0
("netfilter: nat: remove l4proto->manip_pkt")
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
c4c07b4d6f
commit
8303b7e8f0
|
@ -215,6 +215,7 @@ int nf_nat_icmp_reply_translation(struct sk_buff *skb,
|
|||
|
||||
/* Change outer to look like the reply to an incoming packet */
|
||||
nf_ct_invert_tuplepr(&target, &ct->tuplehash[!dir].tuple);
|
||||
target.dst.protonum = IPPROTO_ICMP;
|
||||
if (!nf_nat_ipv4_manip_pkt(skb, 0, &target, manip))
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -226,6 +226,7 @@ int nf_nat_icmpv6_reply_translation(struct sk_buff *skb,
|
|||
}
|
||||
|
||||
nf_ct_invert_tuplepr(&target, &ct->tuplehash[!dir].tuple);
|
||||
target.dst.protonum = IPPROTO_ICMPV6;
|
||||
if (!nf_nat_ipv6_manip_pkt(skb, 0, &target, manip))
|
||||
return 0;
|
||||
|
||||
|
|
Loading…
Reference in New Issue