iptables 规则不起作用

iptables 规则不起作用

我有 2 个使用本地地址(192.168.1.1192.168.1.2)运行 Ubuntu 的虚拟机来运行一些测试,iptables因为我是这个工具的新手。

我希望.2机器丢弃该接口上的所有传入数据包。

我在 上制定了以下规则.2iptables -I INPUT 1 -i eth0 -j DROP

iptables -S给我吗

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i eth0 -j DROP

iptables -L

Chain INPUT(policy ACCEPT)
target  prot  opt   source     destination
DROP    all   --    anywhere   anywhere

为了查看规则是否有效,我首先使用 ping 机器.2,所有数据包都丢失,这看起来很正常,然后我在机器.1上执行以下操作.1

echo -n "Hello world" > /dev/udp/192.168.1.2/3636

并在.2机器上tcpdump -u -i eth0 port 3636

数据包被捕获,我不明白为什么。我缺少什么?

有没有办法捕获所有 iptables 规则阻止的数据包?

答案1

网络堆栈有不同的部分。当数据包到达时,它会沿着连续的网络层逐步遍历这些部分。tcp转储只是在此路径中最先看到传入数据包的人之一,也是最后看到传出数据包的人之一。

你可以看到这个Netfilter 和通用网络中的数据包流原理图了解一下(点击查看大图):

Netfilter 和通用网络中的数据包流

tcp转储的默认捕获发生在 AF_PACKET 处,而 DROP 规则位于过滤器/INPUT 中。

这意味着即使tcp转储捕获数据包,iptables之后仍然会丢弃它,但在任何进程有机会接收它之前。

您可以通过执行以下操作来验证这一点iptables-save -c,并检查中看到的每个数据包tcp转储[1:39]在 DROP 规则之前,您会在计数器中获得增量(如附加的)。

现在捕获丢弃的数据包iptables你可以使用神经网络日志日志记录规则就在 DROP 规则之前,具有完全相同的过滤器(您可以使用用户链来避免重复,但这只是一个示例)。您可以在 DROP 规则之前插入此规则:

iptables -I INPUT -i eth0 -j NFLOG --nflog-group 10

并捕获它得到的内容:

tcpdump -n -e -i nflog:10

日志:10这是一个伪接口tcp转储检索这些日志(在所选组 10 上。可以使用 找到所有可能的接口tcpdump -D)。因为它不是以太网而是 IPv4,尽管-e不会有 MAC 地址等以太网信息可用。你可以选择不同的--nflog-组如果您想轻松分离多个捕获(但您也可以使用tcp转储自己的过滤器)。

相关内容