我正在 NFQUEUE 上开发一个应用程序,该应用程序应该根据主机名丢弃特定的 HTTP 连接。出于性能原因,我想告诉 netfilter 发送我的应用程序数据包,直到得出判决(通过或丢弃)。当发生这种情况时,我的基于 NFQUEUE 的应用程序将使用 nfq_set_verdict2() 设置标记。不幸的是,netfilter 即使在标记数据包后也会将其发送到 NFQUEUE,并且从用户空间我看到传入数据包始终带有标记 0,即使先前的连接数据包已正确标记为非零值。
这是我的配置:
iptables -A OUTPUT -t mangle -j CONNMARK --restore-mark iptables -A OUTPUT -t mangle -m mark --mark 1 -j ACCEPT iptables -A OUTPUT -t mangle -m mark --mark 2 -j DROP iptables -A OUTPUT -t mangle -m mark --mark 0 -p tcp --destination-port 80 -j NFQUEUE --queue-num 0 iptables -A OUTPUT -t mangle -j CONNMARK --save-mark
我究竟做错了什么?
答案1
NFQUEUE 是终端,因此OUTPUT
当您发出 nfq_set_verdict 时,数据包会离开链。因此数据包不会到达保存标记。常见的解决方案是将标记保存在POSTROUTING
mangle 中。
iptables -A OUTPUT -t mangle -j CONNMARK --restore-mark
iptables -A OUTPUT -m mark --mark 1 -j ACCEPT
iptables -A OUTPUT -m mark --mark 2 -j DROP
iptables -A OUTPUT -m mark --mark 0 -p tcp --destination-port 80 -j NFQUEUE --queue-num 0
iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark
答案2
此链OUTPUT
不适用于此活动。您必须在数据包离开主机之前对其进行标记。
使用链POSTROUTING
(在路由决策之后标记数据包)或FORWARD
链(在初始路由决策之后但在数据包发出之前做出的最后一个路由决策之前标记数据包)。
尝试这个:
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -t mangle -j CONNMARK --restore-mark
iptables -A FORWARD -t mangle -m mark --mark 1 -j ACCEPT
iptables -A FORWARD -t mangle -m mark --mark 2 -j DROP
iptables -A FORWARD -t mangle -j CONNMARK --save-mark
iptables -A FORWARD -t mangle -m mark --mark 0 -p tcp --destination-port 80 -j NFQUEUE --queue-num 0