我正在开发基于 FPGA 的数据包捕获和时间戳设备。为了测试它,我想尝试通过它进行 ping 操作。我的计算机安装了两个双端口 10G NIC,并且我连接了 3 个端口 - 一个是“受监控”端口,可从两个方向捕获数据包;一个是连接到“受监控”端口的“直通”端口;第三个是“转储”端口,可从该端口发送捕获的带时间戳的数据包。
删除不相关信息的 ip addr 输出:
3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
link/ether 00:60:dd:xx:xx:f8 brd ff:ff:ff:ff:ff:ff
inet 192.168.99.1/24 scope global enp4s0
valid_lft forever preferred_lft forever
inet6 fe80::260:ddff:fexx:xxf8/64 scope link
valid_lft forever preferred_lft forever
5: enp6s0f0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 90:e2:ba:xx:xx:e0 brd ff:ff:ff:ff:ff:ff
inet6 fe80::92e2:baff:fexx:xxe0/64 scope link
valid_lft forever preferred_lft forever
6: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
link/ether 00:60:dd:xx:xx:f9 brd ff:ff:ff:ff:ff:ff
inet 192.168.99.2/24 scope global enp5s0
valid_lft forever preferred_lft forever
inet6 fe80::260:ddff:fexx:xxf9/64 scope link
valid_lft forever preferred_lft forever
7: enp6s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 90:e2:ba:xx:xx:e1 brd ff:ff:ff:ff:ff:ff
inet6 fe80::92e2:baff:fexx:xxe1/64 scope link
valid_lft forever preferred_lft forever
enp4s0 和 enp5s0 是受监控和通过端口,enp6s0f1 是捕获端口。我已将地址 192.168.99.1/24 和 192.168.99.2/24 分配给 enp4s0 和 enp5s0 接口。我运行了 3 个 Wireshark 实例,每个接口一个。
如果我在 Python 中打开原始套接字并发送一些数据,我会在所有 3 个 wireshark 实例中看到预期结果。但是,当我运行 ping(ping -I enp4s0 192.168.99.2)时,它“工作正常”(没有数据包丢失),但在任何 wireshark 实例中都没有显示任何内容。我尝试使用正确的接口将地址添加到 ARP 表中,但仍然没有成功。我的假设是,由于内核可以在另一个接口上看到目标地址,因此数据包实际上从未发送到 NIC 以通过网络传输出去。有没有简单的方法可以强制数据包通过网络传输出去,而不必经历 500 个麻烦并摆弄 iptables、NAT 等?