为什么我的 iptables 配置不接受来自指定源 iP 的连接?

为什么我的 iptables 配置不接受来自指定源 iP 的连接?

从机器 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

相关内容