从机器 192.168.1.2,我有以下 iptables 配置:
$ hostname -I
192.168.1.2
$ iptables -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- eth0 * 192.168.1.3 0.0.0.0/0 tcp dpt:6379
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 * 0.0.0.0/0 0.0.0.0/0
943 118K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
20 988 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy DROP 5 packets, 300 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 160 packets, 18263 bytes)
pkts bytes target prot opt in out source destination
当我尝试通过端口 6379 从 192.168.1.3 连接到上述机器时,它会挂起,直到我将其终止:
$ hostname -I
192.168.1.3
$ nc -z 192.168.1.2 6379
^C
我做错了什么,不允许我通过端口 6379 从 192.168.1.3 连接到 192.168.1.2?
答案1
您可能在连接尝试发生后不久添加了 ACCEPT 规则,但该规则被策略丢弃。如果是这种情况,则可能已为包含过滤决策的流创建了连接跟踪条目。连接跟踪表充当 netfilter 的一种缓存;它不会评估所有数据包的所有规则。如果有匹配的连接跟踪条目,它将查阅该条目。
务必删除您尝试使用新规则匹配的流量的 conntrack 条目,例如使用 conntrack(8) 工具。对于您的情况,您可以执行类似以下操作
conntrack -D -s 192.168.1.3
答案2
我重置了 iptables,然后更改了脚本中设置此特定 iptables 规则的行:
iptables -A INPUT -s 192.168.1.3 -i eth0 -p tcp -m tcp --dport 6379 -j ACCEPT
更改为:
iptables -A INPUT -i eth0 -p tcp --dport 6379 -s 192.168.1.3 -j ACCEPT
现在它神奇地开始工作了,尽管iptables -L -n -v
看起来和以前一模一样:
$ iptables -L -n -v
Chain INPUT (policy DROP 6 packets, 360 bytes)
pkts bytes target prot opt in out source destination
1 60 ACCEPT tcp -- eth0 * 192.168.1.3 0.0.0.0/0 tcp dpt:6379
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 * 0.0.0.0/0 0.0.0.0/0
311 544K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
1 60 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 255 packets, 28839 bytes)
pkts bytes target prot opt in out source destination
不过,我不能说这不是我以前在 iptables 中没见过的行为。
编辑:对于任何好奇的人,我实际上正在使用iptables-persistent
,这是我一直在使用的完整文件:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i eth0 -p tcp --dport 6379 -s 192.168.1.3 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i docker0 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT