iptables 使用 nat 在阻塞端口上发送数据包

iptables 使用 nat 在阻塞端口上发送数据包

我正在尝试,curl --request GET http://10.0.0.4:80/path但存在一条规则会删除端口 80 上的输出。

iptables -A OUTPUT -d 10.0.0.0/8 -p tcp --dport 80 -j DROP

为了解决这个问题,我尝试通过端口 8888 发送 curl 请求,绕过 iptables 输出链,然后创建 iptables nat 规则iptables -t nat -A OUTPUT -o lo -p tcp --dport 8888 -j REDIRECT --to-port 80 将目标端口更改为 80,但我得到了

Failed to connect to 10.0.0.4 port 8888: Connection refused 我如何才能绕过规则来发送查询并且不创建删除规则的例外。

iptables -L

Chain OUTPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere 10.0.0.0/8 tcp dpt:http

iptables -L -t nat

Chain OUTPUT (policy ACCEPT) target prot opt source destination DNAT tcp -- anywhere 10.0.0.4 tcp dpt:8888 tcp to:10.0.0.4:80

答案1

我现在有时间并测试了一下

iptables -t nat -A OUTPUT -d 10.0.0.1 -p tcp --dport 8888 -m tcp -j DNAT --to-destination 10.0.0.1:80

缺点是它只能针对单个目标 IP 地址/端口(目标匹配可以是整个子网,但 DNAT 地址必须是单个地址)

编辑:

我明白了。
我们的连接的问题在于,输出规则是 iptables 中的最后阶段之一,因此它总是会在评估之后匹配数据包DNAT。(如图形)

POSTROUTUNGcain,这将适用正如我的 dmesg 输出中所述, ChainOUTPUT无法处理 DNAT x_tables: ip_tables: DNAT target: used from hooks POSTROUTING, but only usable from PREROUTING/OUTPUT

所以我猜你的要求不是能够履行因为对于防火墙来说,数据包总是会前往端口 80,但在出去的时候,端口 80 被链拒绝了OUTPUT

相关内容