我正在尝试,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
。(如这图形)
POSTROUTUNG
cain,这将适用后正如我的 dmesg 输出中所述, ChainOUTPUT
无法处理 DNAT
x_tables: ip_tables: DNAT target: used from hooks POSTROUTING, but only usable from PREROUTING/OUTPUT
所以我猜你的要求不是能够履行因为对于防火墙来说,数据包总是会前往端口 80,但在出去的时候,端口 80 被链拒绝了OUTPUT
。