有一套行之有效的规则:
iptables -A FORWARD -i $lan_if -o $nat_if -j NFQUEUE --queue-num 0
iptables -A FORWARD -i $nat_if -o $lan_if -j NFQUEUE --queue-num 0
iptables -t nat -A PLACEMENT -o $nat_if -j MASQUERADE
然而在 NFQUEUE 之后它需要 REDIRECT,我添加了一条规则:
iptables -A FORWARD -i $lan_if -o $nat_if -j NFQUEUE --queue-num 0
iptables -A FORWARD -i $nat_if -o $lan_if -j NFQUEUE --queue-num 0
iptables -t nat -A PREROUTING -p tcp -s $pc_ip -j REDIRECT --to-port 8081
iptables -t nat -A PLACEMENT -o $nat_if -j MASQUERADE
但是 NFQUEUE 停止工作,这是因为 PREROUTING 发生在 NFQUEUE 之前。
如何使流量首先经过 NFQUEUE,然后再经过 REDIRECT?
尝试用 PREROUTING 替换 FORWARD 失败:
iptables -I INPUT -i $lan_if -m conntrack --ctstate DNAT -j NFQUEUE --queue-num 0
和
iptables -t mangle -A PREROUTING -i $lan_if -j NFQUEUE --queue-num 0
不是那样的
对于数据包,您需要构建以下路由:
- 从 $lan_if 接口,数据包应该进入 NFQUEUE --queue-num 0 队列(监控)
- 此后,数据包应该转到 REDIRECT --to-port 8081 (代理)
我想找到一个有效的示例代码,其中 NFQUEUE 在 REDIRECT 之前工作
也许我需要以某种方式将流拆分成按顺序执行的不同队列。我不擅长使用 iptables,所以我不知道如何正确执行。
答案1
根据IPTables结构:https://en.wikipedia.org/wiki/Netfilter#/media/File:Netfilter-packet-flow.svg
PREROUTING
filter
链在表链之前处理FORWARD
。因此该规则首先执行。
要使用NFQUEUE
before处理数据包REDIRECT
,必须将跳转至放在规则之前的链NFQUEUE
中。PREROUTING
REDIRECT
但是,您使用的应用程序NFQUEUE
可能会因此设置而产生不同的效果。