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:
Родитель
5d50aa83e2
Коммит
95219afbb9
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче