act_ct: support asymmetric conntrack
[ Upstream commit95219afbb9
] The act_ct TC module shares a common conntrack and NAT infrastructure exposed via netfilter. It's possible that a packet needs both SNAT and DNAT manipulation, due to e.g. tuple collision. Netfilter can support this because it runs through the NAT table twice - once on ingress and again after egress. The act_ct action doesn't have such capability. Like netfilter hook infrastructure, we should run through NAT twice to keep the symmetry. Fixes:b57dc7c13e
("net/sched: Introduce action ct") Signed-off-by: Aaron Conole <aconole@redhat.com> Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
411fdb9752
commit
4e57c23391
@ -329,6 +329,7 @@ static int tcf_ct_act_nat(struct sk_buff *skb,
|
||||
bool commit)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_NF_NAT)
|
||||
int err;
|
||||
enum nf_nat_manip_type maniptype;
|
||||
|
||||
if (!(ct_action & TCA_CT_ACT_NAT))
|
||||
@ -359,7 +360,17 @@ static int tcf_ct_act_nat(struct sk_buff *skb,
|
||||
return NF_ACCEPT;
|
||||
}
|
||||
|
||||
return ct_nat_execute(skb, ct, ctinfo, range, maniptype);
|
||||
err = ct_nat_execute(skb, ct, ctinfo, range, maniptype);
|
||||
if (err == NF_ACCEPT &&
|
||||
ct->status & IPS_SRC_NAT && ct->status & IPS_DST_NAT) {
|
||||
if (maniptype == NF_NAT_MANIP_SRC)
|
||||
maniptype = NF_NAT_MANIP_DST;
|
||||
else
|
||||
maniptype = NF_NAT_MANIP_SRC;
|
||||
|
||||
err = ct_nat_execute(skb, ct, ctinfo, range, maniptype);
|
||||
}
|
||||
return err;
|
||||
#else
|
||||
return NF_ACCEPT;
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user