我一直在为一个项目开发 iptables。iptables 是通过自定义规则链为不同的接口实现的。由于接受规则的声明,INPUT 的默认策略设置为 DROP。现在我的问题是:即使规则应该匹配,流量似乎也没有通过。如果我将相应的规则放入 INPUT 链,它似乎可以工作。所以我对自定义链中 drop 的解释有点困惑。
以下是不起作用的示例(我删除了不必要的信息):
Chain INPUT (policy DROP)
target prot opt source destination
LOINPUT all -- 0.0.0.0/0 0.0.0.0/0
M2M_INPUT all -- 0.0.0.0/0 0.0.0.0/0
NE_INPUT all -- 0.0.0.0/0 0.0.0.0/0
Chain NE_INPUT (1 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 10.196.95.208 state RELATED,ESTABLISHED
....
ACCEPT tcp -- 10.196.95.74 10.196.95.208 tcp dpt:22
....
当 ssh 从 10.196.95.74 向 10.196.95.208 进行时,它不起作用。
为了进一步测试,我添加了从 NE_INPUT 到 INPUT 的行,并且它可以正常工作。
Chain INPUT (policy DROP)
num target prot opt source destination
LOINPUT all -- 0.0.0.0/0 0.0.0.0/0
M2M_INPUT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 10.196.95.74 10.196.95.208 tcp dpt:22
NE_INPUT all -- 0.0.0.0/0 0.0.0.0/0
据我所知,当没有规则匹配时,DROP 策略将“激活”。因此,我预计 iptables 将解析每个规则(在每个规则链中),并且如果没有规则匹配,则将激活 DROP 策略。
但就我的测试而言,DROP 策略无需解析每个规则链(在我的情况下是 NE_INPUT)即可激活。
有任何提示/解释吗?提前致谢。
[更新日期:15/06]:好的,经过进一步分析,我确认 DROP 工作正常,但问题似乎与自定义链更相关。
[更新日期:6 月 16 日]: 似乎自定义链的声明是导致错误行为的原因。当声明相应网络接口 (-i eth1) 的链时,它不起作用 (NE_INPUT 链的 ping NOK / ssh NOK) 但是如果我声明分配给此接口的 IP 地址而不是接口,ping 效果会更好。
挪威克朗:
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
3 0 0 NE_INPUT all -- eth1 * 0.0.0.0/0 0.0.0.0/0
好的:
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
3 5 420 NE_INPUT all -- * * 0.0.0.0/0 10.196.95.208
那么数据包是如何通过 iptables 进行解释的呢?正常情况下,到达接口 eth1 的数据包应该由 NE_INPUT 处理,而不是被丢弃。因此,当通过目标 IP 寻址时,这些数据包似乎得到了正确的处理。
[更新日期:17/06]:遵循 ip link & ip address 的输出
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:50:56:8e:17:33 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:50:56:8e:9a:f9 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:50:56:8e:2e:9b brd ff:ff:ff:ff:ff:ff
5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:50:56:8e:de:03 brd ff:ff:ff:ff:ff:ff
# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:50:56:8e:17:33 brd ff:ff:ff:ff:ff:ff
inet 10.196.95.207/24 brd 10.196.95.255 scope global eth0
inet6 fe80::250:56ff:fe8e:1733/64 scope link valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:50:56:8e:9a:f9 brd ff:ff:ff:ff:ff:ff
inet 10.196.95.208/24 brd 10.196.95.255 scope global eth1
inet6 fe80::250:56ff:fe8e:9af9/64 scope link valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:50:56:8e:2e:9b brd ff:ff:ff:ff:ff:ff
inet 10.109.197.207/24 brd 10.109.197.255 scope global eth2
inet6 fe80::250:56ff:fe8e:2e9b/64 scope link valid_lft forever preferred_lft forever
5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:50:56:8e:de:03 brd ff:ff:ff:ff:ff:ff
inet 10.79.105.207/24 brd 10.79.105.255 scope global eth3
inet6 fe80::250:56ff:fe8e:de03/64 scope link valid_lft forever preferred_lft forever
答案1
您的推理是正确的:如果在自定义链中匹配 DROP 规则,则数据包将被丢弃并且不会返回到内置链(在您的情况下为 INPUT)。
我怀疑您删除的那些“非必要”行可能出了问题。
尝试在尝试 ssh 到您的机器时使用 来调试防火墙iptables -L -v -t filter
。它将为您提供每条规则匹配次数的计数器。
您的 nat 和 mangle 表是否为空,并且在所有内置链中都有 ACCEPT 策略?
答案2
对于自定义链,我看到的情况是,如果链中没有匹配项,则自定义链将采用默认策略。