我在完全理解如何使用点击设备时遇到问题。
我创建了一个 Tap 设备并将其启动并运行。用户空间程序打开其文件描述符并接收发送到设备的以太网帧。 Tap 设备获取 IP 地址和网络掩码 10.254.0.1/24。
到目前为止,效果很好。我做了一个echo "test" | netcat -uq0 10.254.0.2 12345
,程序接收数据包并通过另一种通信方法将其转发到另一台机器。
但相反的方法根本不起作用:
用户空间程序将有效的以太网帧写入 Tap 设备的文件描述符。但anetcat -ul 12345
没有收到任何东西。与 相同socat
。我还尝试创建一个桥并向其添加分接设备,但这也不起作用。
我很困惑,因为如果我用 Wireshark 监控 Tap 设备,我可以看到每个数据包,并且每个数据包都是正确的。命令的
计数器随着用户空间程序写入 Tap 设备的每一帧而增加。 ARP 被禁用,因为现在只处理 IP 数据包。tx packets: XY
ifconfig
ip link set dev tap0 arp off
您可以将我的设置想象如下:
host1 (some channel) host2
netcat --> tap0 --> prog ---------------> prog --> tap0 --> netcat
<=============== works ========================================>| does not work
您知道我如何在 Tap 设备的“另一端”接收数据包吗?或者我可以在哪里进一步阅读?
编辑2:删除了编辑。 (错误的测试得出错误的结论。校验和有问题。现在数据包有效,但也没有收到。)
答案1
一些进一步的调查netstat -s
帮助我找到了原因:反向路径过滤器丢弃了我的数据包。 (到现在我还没完全明白为什么......)
将分接头设备上的过滤器设置为宽松模式使其工作:
sudo sysctl -w net.ipv4.conf.tap0.rp_filter=2
(通过将其设置为0
did来禁用它不是为我工作。)