我有 2 个使用本地地址(192.168.1.1
和192.168.1.2
)运行 Ubuntu 的虚拟机来运行一些测试,iptables
因为我是这个工具的新手。
我希望.2
机器丢弃该接口上的所有传入数据包。
我在 上制定了以下规则.2
:iptables -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 和通用网络中的数据包流原理图了解一下(点击查看大图):
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转储自己的过滤器)。