* [v5 PATCH 0/1] netfilter: "fail-open" feature support for NFQUEUE @ 2012-05-24 13:56 Krishna Kumar 2012-05-24 13:56 ` [v5 PATCH 1/1] netfilter: Add fail-open support Krishna Kumar 0 siblings, 1 reply; 4+ messages in thread From: Krishna Kumar @ 2012-05-24 13:56 UTC (permalink / raw) To: kaber, pablo; +Cc: vivk, svajipay, fw, netfilter-devel, Krishna Kumar, sri Many users of an IBM security product, which uses netfilter's NFQUEUE target to process packets in userspace, face a problem of dropped connections during heavy load. Incoming packets are queued and processed by the security module, which does deep packet analysis to decide whether to accept or reject them. However during heavy load, the queue fills up and connections fail when large number of packets get dropped. This patch implements a "failopen" support for NFQUEUE to help keep connections open during such failures. This is achieved by allowing acceptance of packets temporarily when the queue is full, which enables existing connections to be kept open. Failopen is enabled/disabled using a new call - nfq_set_flags(qh, mask, flags), which makes use of two new netlink attributes: NFQA_CFG_MASK - Specifies which flags are being modified. NFQA_CFG_FLAGS - Set/reset the bits for each of those flags. Tests done: ------------ - netperf TCP_STREAM. - 64 netperf stress testing to ensure there are no memory leaks. - icmp ping. - enabling/disabling failopen in the middle of existing connections. - checksum verification of transferred files using scp. - different flag/mask values to check that code handling NFQA_CFG_MASK works as expected. Test results: ------------- Server: ------- # iptables -A INPUT -p tcp -m mac --mac-source 00:00:C9:C6:4F:22 \ -j NFQUEUE --queue-num 0 # Run interceptor program with 50ms delay between packet processing, and also sets qlen to 16. After every read system call, this program tests and read's a config file's contents and calls nfq_set_flags(qh, mask, flags). Client: ------- ---> failopen is disabled on server at this time # netperf -v0 -H 10.0.4.1 TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.0.4.1 (10.0.4.1) port 0 AF_INET 0.16 ---> failopen is enabled on server at this time # netperf -v0 -H 10.0.4.1 TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.0.4.1 (10.0.4.1) port 0 AF_INET 2292.82 ---> failopen is disabled on server at this time # scp FILE 10.0.4.1:/tmp FILE 0% 2960KB 88.4KB/s 12:19:37 ETA ---> Enable failopen on server at this time FILE 21% 809MB 44.2MB/s 01:08 ETA ---> Disable failopen on server at this time FILE 23% 903MB 157.4KB/s 5:18:01 ETA ---> Enable failopen on server at this time FILE 100% 3835MB 24.1MB/s 02:39 Changes from rev4: ------------------ 1. Localize all changes to net/netfilter/nfnetlink_queue.c, which helps remove GSO handling and other code in core. Changes from rev3: ------------------ 1. Changed flags/mask to big-endian. 2. Use nla_get_be32 instead of nla_data to access flags/masks. 3. Cleaned up some comments. Changes from rev2: ------------------ 1. Changed NFQA_CFG_FAIL_OPEN to generic NFQA_CFG_FLAGS and NFQA_CFG_MASK to support new flags/options in future. 2. Enqueue handler changed to return -ENOSPC on queue-full condition. 3. Do not invoke okfn on -ENOSPC, but process all hooks first. nf_hook_slow has code to handle failopen. Please review. Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com> Signed-off-by: Vivek Kashyap <vivk@us.ibm.com> Signed-off-by: Sridhar Samudrala <samudrala@us.ibm.com> --- ^ permalink raw reply [flat|nested] 4+ messages in thread
* [v5 PATCH 1/1] netfilter: Add fail-open support 2012-05-24 13:56 [v5 PATCH 0/1] netfilter: "fail-open" feature support for NFQUEUE Krishna Kumar @ 2012-05-24 13:56 ` Krishna Kumar 2012-05-24 20:42 ` Florian Westphal 2012-06-05 23:46 ` Pablo Neira Ayuso 0 siblings, 2 replies; 4+ messages in thread From: Krishna Kumar @ 2012-05-24 13:56 UTC (permalink / raw) To: kaber, pablo; +Cc: vivk, svajipay, fw, netfilter-devel, Krishna Kumar, sri Implement a new "fail-open" mode where packets are not dropped upon queue-full condition. This mode can be enabled/disabled per queue using netlink NFQA_CFG_FLAGS & NFQA_CFG_MASK attributes. Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com> Signed-off-by: Vivek Kashyap <vivk@us.ibm.com> Signed-off-by: Sridhar Samudrala <samudrala@us.ibm.com> --- include/linux/netfilter/nfnetlink_queue.h | 5 ++ net/netfilter/nfnetlink_queue.c | 40 ++++++++++++++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff -ruNp org/include/linux/netfilter/nfnetlink_queue.h new/include/linux/netfilter/nfnetlink_queue.h --- org/include/linux/netfilter/nfnetlink_queue.h 2012-05-24 15:47:52.361984483 +0530 +++ new/include/linux/netfilter/nfnetlink_queue.h 2012-05-24 16:06:29.123911109 +0530 @@ -84,8 +84,13 @@ enum nfqnl_attr_config { NFQA_CFG_CMD, /* nfqnl_msg_config_cmd */ NFQA_CFG_PARAMS, /* nfqnl_msg_config_params */ NFQA_CFG_QUEUE_MAXLEN, /* __u32 */ + NFQA_CFG_MASK, /* identify which flags to change */ + NFQA_CFG_FLAGS, /* value of these flags (__u32) */ __NFQA_CFG_MAX }; #define NFQA_CFG_MAX (__NFQA_CFG_MAX-1) +/* Flags for NFQA_CFG_FLAGS */ +#define NFQA_CFG_F_FAIL_OPEN (1 << 0) + #endif /* _NFNETLINK_QUEUE_H */ diff -ruNp org/net/netfilter/nfnetlink_queue.c new/net/netfilter/nfnetlink_queue.c --- org/net/netfilter/nfnetlink_queue.c 2012-05-24 15:47:52.366985562 +0530 +++ new/net/netfilter/nfnetlink_queue.c 2012-05-24 18:12:04.695509859 +0530 @@ -52,6 +52,7 @@ struct nfqnl_instance { u_int16_t queue_num; /* number of this queue */ u_int8_t copy_mode; + u_int32_t flags; /* Set using NFQA_CFG_FLAGS */ /* * Following fields are dirtied for each queued packet, * keep them in same cache line if possible. @@ -406,6 +407,7 @@ nfqnl_enqueue_packet(struct nf_queue_ent struct nfqnl_instance *queue; int err = -ENOBUFS; __be32 *packet_id_ptr; + int failopen = 0; /* rcu_read_lock()ed by nf_hook_slow() */ queue = instance_lookup(queuenum); @@ -431,9 +433,14 @@ nfqnl_enqueue_packet(struct nf_queue_ent goto err_out_free_nskb; } if (queue->queue_total >= queue->queue_maxlen) { - queue->queue_dropped++; - net_warn_ratelimited("nf_queue: full at %d entries, dropping packets(s)\n", - queue->queue_total); + if (queue->flags & NFQA_CFG_F_FAIL_OPEN) { + failopen = 1; + err = 0; + } else { + queue->queue_dropped++; + net_warn_ratelimited("nf_queue: full at %d entries, dropping packets(s)\n", + queue->queue_total); + } goto err_out_free_nskb; } entry->id = ++queue->id_sequence; @@ -455,6 +462,8 @@ err_out_free_nskb: kfree_skb(nskb); err_out_unlock: spin_unlock_bh(&queue->lock); + if (failopen) + nf_reinject(entry, NF_ACCEPT); err_out: return err; } @@ -858,6 +867,31 @@ nfqnl_recv_config(struct sock *ctnl, str spin_unlock_bh(&queue->lock); } + if (nfqa[NFQA_CFG_FLAGS]) { + __u32 flags, mask; + + if (!queue) { + ret = -ENODEV; + goto err_out_unlock; + } + + if (!nfqa[NFQA_CFG_MASK]) { + /* A mask is needed to specify which flags are being + * changed. + */ + ret = -EINVAL; + goto err_out_unlock; + } + + flags = ntohl(nla_get_be32(nfqa[NFQA_CFG_FLAGS])); + mask = ntohl(nla_get_be32(nfqa[NFQA_CFG_MASK])); + + spin_lock_bh(&queue->lock); + queue->flags &= ~mask; + queue->flags |= flags & mask; + spin_unlock_bh(&queue->lock); + } + err_out_unlock: rcu_read_unlock(); return ret; ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [v5 PATCH 1/1] netfilter: Add fail-open support 2012-05-24 13:56 ` [v5 PATCH 1/1] netfilter: Add fail-open support Krishna Kumar @ 2012-05-24 20:42 ` Florian Westphal 2012-06-05 23:46 ` Pablo Neira Ayuso 1 sibling, 0 replies; 4+ messages in thread From: Florian Westphal @ 2012-05-24 20:42 UTC (permalink / raw) To: Krishna Kumar; +Cc: kaber, pablo, vivk, svajipay, netfilter-devel, sri Krishna Kumar <krkumar2@in.ibm.com> wrote: > Implement a new "fail-open" mode where packets are not dropped > upon queue-full condition. This mode can be enabled/disabled per > queue using netlink NFQA_CFG_FLAGS & NFQA_CFG_MASK attributes. > > Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com> > Signed-off-by: Vivek Kashyap <vivk@us.ibm.com> > Signed-off-by: Sridhar Samudrala <samudrala@us.ibm.com> > --- > include/linux/netfilter/nfnetlink_queue.h | 5 ++ > net/netfilter/nfnetlink_queue.c | 40 ++++++++++++++++++-- > 2 files changed, 42 insertions(+), 3 deletions(-) Looks good to me. Thanks for your patience! ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [v5 PATCH 1/1] netfilter: Add fail-open support 2012-05-24 13:56 ` [v5 PATCH 1/1] netfilter: Add fail-open support Krishna Kumar 2012-05-24 20:42 ` Florian Westphal @ 2012-06-05 23:46 ` Pablo Neira Ayuso 1 sibling, 0 replies; 4+ messages in thread From: Pablo Neira Ayuso @ 2012-06-05 23:46 UTC (permalink / raw) To: Krishna Kumar; +Cc: kaber, vivk, svajipay, fw, netfilter-devel, sri On Thu, May 24, 2012 at 07:26:44PM +0530, Krishna Kumar wrote: > Implement a new "fail-open" mode where packets are not dropped > upon queue-full condition. This mode can be enabled/disabled per > queue using netlink NFQA_CFG_FLAGS & NFQA_CFG_MASK attributes. Applied, thanks Florian and Krishna. ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-06-05 23:46 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-05-24 13:56 [v5 PATCH 0/1] netfilter: "fail-open" feature support for NFQUEUE Krishna Kumar 2012-05-24 13:56 ` [v5 PATCH 1/1] netfilter: Add fail-open support Krishna Kumar 2012-05-24 20:42 ` Florian Westphal 2012-06-05 23:46 ` Pablo Neira Ayuso
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox