这是一个重置 iptables 的简单脚本
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -I INPUT -p tcp --dport 8000 -j ACCEPT
iptables -I OUTPUT -p tcp --dport 8000 -j ACCEPT
在此之后如果我
curl another-machine:8000/filename
连接挂起,似乎发生了 DROP 而不是 ACCEPT。如果我
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
那么上述curl
命令就起作用了。
但端口8000
显然设置为ACCEPT
即使DROP
是策略也是如此。
那么为什么连接无法接通呢?
答案1
这偏僻的港口和目的地端口不是一回事。如果传出的数据包以 8000 作为其目标端口,那么传入的回复将以它作为来源端口(即镜像):
local remote
src 192.168.1.71:36932 --OUTPUT--> 151.101.1.69:8000 dest TCP [SYN]
dest 192.168.1.71:36932 <--INPUT--- 151.101.1.69:8000 src TCP [SYN, ack]
换句话说,只会-A INPUT -p tcp --sport 8000
匹配它。
处理这个问题更常见的方式是使用有状态的防火墙:
-A INPUT -m state --state ESTABLISHED -j ACCEPT