我有一个运行 Ubuntu 服务器 16.04 的裸机,带有 KVM 和 3 个 NIC,它们通过桥 br1、br2 和 br3 连接到也运行 Ubuntu 服务器 16.04 的来宾 VM。
第一个 NIC - br1 - 连接到互联网,其路由器地址被定义为访客的默认网关。
我有一个代码在我的来宾上运行,需要侦听 br2 和 br3 收到的数据包,该代码应该只侦听 1 个网卡,
我尝试将流量从 en2 (通过 br2 桥接的来宾网卡的名称)转发到 en3 (与 br3 相同)按照此:
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
sudo tpcdump -i en3
然而,在使用并向 NIC2 发送 ping 消息时没有记录任何内容(而如果我运行,sudo tpcdump -i en2
我可以看到 ping 消息)
我在这里缺少什么?有没有更好的方法让我得到我想要的结果(我的代码将监听 1 个 NIC 并获得两个 NIC 的流量)?
答案1
要专门监听转发的流量,最好创建一个nflog
规则/接口。
所以你将创建一个nflog
界面:
sudo iptables -t filter -I FORWARD -j NFLOG --nflog-group 6
然后听一下:
sudo tcpdump -s 0 -n -i nflog:6
解决这个问题的方法是使用iptables框架中的nflog接口,来准确获取我们感兴趣的数据包。
nflog 规则记录到内核内部多播组,该组由 0 - 2^16-1 范围内的整数标识。仅捕获框架看到的数据报部分。对于 iptables 来说,这是一个 IPv4 数据包。
使用 nflog 转储数据包会强制您对 tcpdump 和wireshark 使用特殊的接口语法。您必须使用 nflog:groupnumber 作为接口。
由于 nflog 规则是普通的 iptables 规则,因此规则需要正确的匹配和目标部分,以便您准确获得所需的流量。您还必须将规则放入正确的位置,以便它获取您感兴趣的数据包。