Mat*_*evy 6 linux networking debian iptables tcpdump
我有一台运行 Ubuntu 服务器 16.04 的裸机,带有 KVM 和 3 个网卡,它们通过桥接器 br1、br2 和 br3 连接到运行 Ubuntu 服务器 16.04 的来宾 VM。
第一个 NIC - br1 - 连接到互联网,它的路由器地址被定义为来宾的默认网关。
我的来宾上运行了一个代码,需要监听 br2 和 br3 收到的数据包,代码应该只监听 1 个网卡,
我试图从转发由EN2 EN3到(与BR3相同)(客户NIC是通过BR2桥接的名称)的流量以下这个:
sudo nano /etc/sysctl.conf
uncomment net.ipv4.ip_forward = 1
sudo sysctl -p
sudo iptables -t nat -A POSTROUTING --out-interface en3 -j MASQUERADE
sudo iptables -A FORWARD --in-interface en2 --out-interfac en3 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
然而,在使用sudo tpcdump -i en3并向 NIC2 发送 ping 消息时没有记录任何内容(而如果我运行,sudo tpcdump -i en2我可以看到 ping 消息)
我在这里缺少什么?有没有更好的方法来获得我想要的结果(我的代码将监听 1 个 NIC 并获得两个 NIC 的流量)?
要专门侦听转发的流量,最好创建一个nflog规则/接口。
所以你将创建一个nflog接口:
sudo iptables -t filter -I FORWARD -j NFLOG --nflog-group 6
Run Code Online (Sandbox Code Playgroud)
然后听听:
sudo tcpdump -s 0 -n -i nflog:6
Run Code Online (Sandbox Code Playgroud)
问题的解决方案,就是使用iptables框架中的nflog接口,准确获取我们感兴趣的数据包。
nflog 规则记录到内核内部多播组,该组由 0 - 2^16-1 范围内的整数标识。只有框架看到的那部分数据报将被捕获。对于作为 IPv4 数据包的 iptables。
使用 nflog 转储数据包会强制您对 tcpdump 和 wireshark 使用特殊的接口语法。您必须使用 nflog:groupnumber 作为接口。
因为 nflog 规则是普通的 iptables 规则,所以规则需要适当的匹配和目标部分,以便您准确获得所需的流量。您还必须将规则放在正确的位置,以便它获取您感兴趣的数据包。