简介
基于iptables的内核通讯大杀器,使用nfnetlink协议与内核通信。
他可以通过iptables定义的规则去拦截相应的网络报文,他可以基于iptables前或者后去自定义拦截这些报文,也可以通过解析这些报文做一些审计之类的工作,也可以通过这些报文来形成一个阻断功能
NFQUEU 的源代码分为 nf_queue
和 nfnetlink_queue
两部分。nf_queue
是 iptables
的一部分,nfnetlink_queue
是netfilter
的一个子模块。
nfnetlink_queue
是 nf_queue
跟用户程序之间的桥梁,是基于 nfnetlink
的专门用于 NFQUEUE 的通信机制;而 nfnetlink
是一套基于 netlink的专门用于 netfilter
的通信机制。
安全性
nfqueue是一个队列,程序通过队列的形式来处理报文,默认这个队列的长度是1024,超出此队列的报文默认会丢弃,正常环境下,要控制好这些流量。在内核 3.6 之后,可以使用 --fail-open
选项将这默认丢包改为默认接收。在 /proc/net/netfilter/nfnetlink_queue
中可以看到丢包统计。
NFQUEUE 很容易地为任意入队的包做包重排序。然而,需要注意的是内核是使用链式列表来排队包的;所以,乱序判决会带来一定的损耗。
配置
按照iptables的四表五链配置规则即可
例如:
1 | iptables -t raw -I PREROUTING -p tcp --syn -j NFQUEUE --queue-num=1 --queue-bypass |
- –queue-num 代表队列号
- –queue-bypass 默认情况下,如果没有用户空间程序正在监听 NFQUEUE,那么将丢弃所有要排队的数据包。使用此选项时,NFQUEUE 规则的行为类似于 ACCEPT,数据包将转移到下一个表。但此规则要求 内核 >= 2.6.39,iptables >= 1.4.11
同时,为了防止丢包,也有负载均衡的配置
--queue-balance
是 NFQUEUE 选项,由 Florian Westphal 实现,实现了同一条 iptables 规则的网络包负载均衡到多个队列。用法非常简单。比如,负载均衡 INPUT 流量到 0-3 队列的规则如下,注意,负载均衡是基于流实现的(made with respect to the flow),一条流的所有网络包会发送到同一个队列。但此规则要求 Linux 内核 >= 2.6.31,iptables >= 1.4.5
1 | iptables -A INPUT -j NFQUEUE --queue-balance 0:3 |
其他iptables配置可以参照 iptables 配置
代码参考
1 | package main |