forked from Minki/linux
act_ct: support asymmetric conntrack
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>
This commit is contained in:
parent
5d50aa83e2
commit
95219afbb9
@ -329,6 +329,7 @@ static int tcf_ct_act_nat(struct sk_buff *skb,
|
|||||||
bool commit)
|
bool commit)
|
||||||
{
|
{
|
||||||
#if IS_ENABLED(CONFIG_NF_NAT)
|
#if IS_ENABLED(CONFIG_NF_NAT)
|
||||||
|
int err;
|
||||||
enum nf_nat_manip_type maniptype;
|
enum nf_nat_manip_type maniptype;
|
||||||
|
|
||||||
if (!(ct_action & TCA_CT_ACT_NAT))
|
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 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
|
#else
|
||||||
return NF_ACCEPT;
|
return NF_ACCEPT;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user