netfilter: nf_defrag: Skip defrag if NOTRACK is set
Subsystems (2)
PATCH v3 1/1 netfilter: nf_defrag: Skip defrag if NOTRACK is set
conntrack defrag is needed only if some module like CONNTRACK or NAT explicitly requests it. For plain forwarding scenarios, defrag is not needed and can be skipped if NOTRACK is set in a rule.
Since conntrack defrag is currently higher priority than raw table, setting NOTRACK is not sufficient. We need to move raw to a higher priority for iptables only.
This is achieved by introducing a module parameter which allows to modify the priority. By default, the priority is NF_IP_PRI_RAW to support legacy behavior.
v1->v2: Instead of modifying NF_IP_PRI_RAW itself, use a module parameter to pass in the priority during module load as suggested by Pablo. Also update commit text.
v2->v3: Implement similar functionality for IPv6 as well
--- net/ipv4/netfilter/iptable_raw.c | 14 +++++++++++++- net/ipv4/netfilter/nf_defrag_ipv4.c | 2 +- net/ipv6/netfilter/ip6table_raw.c | 14 +++++++++++++- net/ipv6/netfilter/nf_defrag_ipv6_hooks.c | 3 +++ 4 files changed, 30 insertions(+), 3 deletions(-)
net/ipv4/netfilter/iptable_raw.c +13 -1
@@ -12,7 +12,11 @@static int __net_init iptable_raw_table_init (struct net *net); -static const struct xt_table packet_raw = { +static int priority__read_mostly =NF_IP_PRI_RAW ; +MODULE_PARM_DESC (priority,"Priority of IPv4 raw table (NF_IP_PRI_RAW)" ); +module_param (priority, int,0000 ); + +static struct xt_table packet_raw = { .name ="raw" , .valid_hooks =RAW_VALID_HOOKS , .me =THIS_MODULE ,
@@ -70,6 +74,14 @@ static int __init iptable_raw_init(void) {int ret; +if (priority <NF_IP_PRI_CONNTRACK_DEFRAG && + priority >NF_IP_PRI_FIRST ) { + packet_raw.priority = priority; + +pr_info ("iptable_raw: Using custom rule priority=%d\n" , + packet_raw.priority); + } + rawtable_ops =xt_hook_ops_alloc (&packet_raw, iptable_raw_hook);if (IS_ERR (rawtable_ops))return PTR_ERR (rawtable_ops);
net/ipv4/netfilter/nf_defrag_ipv4.c +1 -1
@@ -80,7 +80,7 @@ static unsigned int ipv4_conntrack_defrag(void *priv,#endif #endif /* Gather fragments. */ -if (ip_is_fragment (ip_hdr (skb))) { +if (skb->_nfct !=IP_CT_UNTRACKED &&ip_is_fragment (ip_hdr (skb))) {enum ip_defrag_users user =nf_ct_defrag_user (state->hook, skb);
net/ipv6/netfilter/ip6table_raw.c +13 -1
@@ -11,7 +11,11 @@static int __net_init ip6table_raw_table_init (struct net *net); -static const struct xt_table packet_raw = { +static int priority__read_mostly =NF_IP6_PRI_RAW ; +MODULE_PARM_DESC (priority,"Priority of IPv6 raw table (NF_IP6_PRI_RAW)" ); +module_param (priority, int,0000 ); + +static struct xt_table packet_raw = { .name ="raw" , .valid_hooks =RAW_VALID_HOOKS , .me =THIS_MODULE ,
@@ -63,6 +67,14 @@ static int __init ip6table_raw_init(void) {int ret; +if (priority <NF_IP6_PRI_CONNTRACK_DEFRAG && + priority >NF_IP6_PRI_FIRST ) { + packet_raw.priority = priority; + +pr_info ("ip6table_raw: Using custom rule priority=%d\n" , + packet_raw.priority); + } +/* Register hooks */ rawtable_ops =xt_hook_ops_alloc (&packet_raw, ip6table_raw_hook);if (IS_ERR (rawtable_ops))
net/ipv6/netfilter/nf_defrag_ipv6_hooks.c +3 -0
@@ -65,6 +65,9 @@ static unsigned int ipv6_defrag(void *priv,return NF_ACCEPT ;#endif +if (skb->_nfct ==IP_CT_UNTRACKED ) +return NF_ACCEPT ; + err =nf_ct_frag6_gather (state->net, skb,nf_ct6_defrag_user (state->hook, skb));/* queued */
Signature · 1 line
1.9.1
Pablo Neira Ayuso
maintainerHi Subash,
One more concern before this gets upstream.
Quoted 31 lines · Subash Abhinov Kasiviswanathan
conntrack defrag is needed only if some module like CONNTRACK or NAT explicitly requests it. For plain forwarding scenarios, defrag is not needed and can be skipped if NOTRACK is set in a rule.
Since conntrack defrag is currently higher priority than raw table, setting NOTRACK is not sufficient. We need to move raw to a higher priority for iptables only.
This is achieved by introducing a module parameter which allows to modify the priority. By default, the priority is
NF_IP_PRI_RAWto support legacy behavior.
v1->v2: Instead of modifyingNF_IP_PRI_RAWitself, use a module parameter to pass in the priority during module load as suggested by Pablo. Also update commit text.
v2->v3: Implement similar functionality for IPv6 as wellSigned-off-by Subash Abhinov Kasiviswanathan <[email protected]>--- net/ipv4/netfilter/iptable_raw.c | 14 +++++++++++++- net/ipv4/netfilter/nf_defrag_ipv4.c | 2 +- net/ipv6/netfilter/ip6table_raw.c | 14 +++++++++++++- net/ipv6/netfilter/nf_defrag_ipv6_hooks.c | 3 +++ 4 files changed, 30 insertions(+), 3 deletions(-)net/ipv4/netfilter/iptable_raw.c +0
-0
net/ipv4/netfilter/iptable_raw.c line 17
Quoted 7 lines
net/ipv4/netfilter/iptable_raw.c +3
-1@@ -12,7 +12,11 @@static int __net_init iptable_raw_table_init (struct net *net); -static const struct xt_table packet_raw = { +static int priority__read_mostly =NF_IP_PRI_RAW ; +MODULE_PARM_DESC (priority,"Priority of IPv4 raw table (NF_IP_PRI_RAW)" ); +module_param (priority, int,0000 );
Do you think we can turn this into an on/off knob instead?
I mean, I think it's good if you add a new NF_IP_PRI_RAW_BEFORE_DEFRAG and we place it into uapi.
I'm just worried about follow up patches from people asking to making this flexible in all other existing tables, I would like this does not happen :-).
Quoted 6 lines
net/ipv4/netfilter/iptable_raw.c +2
-0+ +static struct xt_table packet_raw = { .name ="raw" , .valid_hooks =RAW_VALID_HOOKS , .me =THIS_MODULE ,
net/ipv4/netfilter/iptable_raw.c static int __init iptable_raw_init(void) · line 81
Quoted 8 lines
net/ipv4/netfilter/iptable_raw.c +5
-0@@ -70,6 +74,14 @@ static int __init iptable_raw_init(void) {int ret; +if (priority <NF_IP_PRI_CONNTRACK_DEFRAG && + priority >NF_IP_PRI_FIRST ) { + packet_raw.priority = priority; + + pr_info("iptable_raw: Using custom rule priority=%d\n",
^^^^^^^^^^^^
Probably better if you add:
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
in this patch while on this.
Thanks for your patience, we're almost there.
Quoted 29 lines · Pablo Neira Ayuso
Hi Subash,
One more concern before this gets upstream.
Do you think we can turn this into an on/off knob instead?
I mean, I think it's good if you add a new
NF_IP_PRI_RAW_BEFORE_DEFRAGand we place it into uapi.I'm just worried about follow up patches from people asking to making this flexible in all other existing tables, I would like this does not happen :-).
Quoted 6 lines
net/ipv4/netfilter/iptable_raw.c +2
-0+ +static struct xt_table packet_raw = { .name ="raw" , .valid_hooks =RAW_VALID_HOOKS , .me =THIS_MODULE ,net/ipv4/netfilter/iptable_raw.c static int __init iptable_raw_init(void) · line 81
Quoted 8 lines
net/ipv4/netfilter/iptable_raw.c +5
-0@@ -70,6 +74,14 @@ static int __init iptable_raw_init(void) {int ret; +if (priority <NF_IP_PRI_CONNTRACK_DEFRAG && + priority >NF_IP_PRI_FIRST ) { + packet_raw.priority = priority; + + pr_info("iptable_raw: Using custom rule priority=%d\n",^^^^^^^^^^^^
Quoted 7 lines
Probably better if you add:
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmtin this patch while on this.
Thanks for your patience, we're almost there.
Hi Pablo
Sure, I can update these.
Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project