让我来描述一下我的设置。
使用Debian。我已将eth0连接到我的家用路由器。从eth0创建MACVLAN(名为m0)。使用tunctl创建TAP设备(名为tap0)。最后,使用bridge-utils创建一个桥(名为br0),并且m0和tap0都连接到桥。
使用ping,我能够从tcpdump捕获示例ICMP请求。首先,我使用dhclient从家庭路由器获取br0一个IP地址。接下来,我从br0 ping路由器。然后我在tcpdump中捕获此数据包。
接下来,我在Python中写入tap0接口。获得文件对象后,我从之前复制示例ICMP请求(它具有从br0到192.168.1.1的IP地址,即家庭路由器),将其转换为二进制,然后将其写入文件对象。
使用tcpdump,我可以看到我在Python中写入文件对象的数据包与预期一样 - 一个ICMP回应请求。我可以在链中的每个接口上看到这个数据包(tap0,br0,m0,eth0)。
这是我正在努力解决的问题。我可以在链中的每个接口上看到ICMP echo reply ,除了使用tcpdump的tap0(br0,m0,eth0)。理想情况下,我想从Python中的文件对象中读取以查看ICMP echo回复。有意义的是,我所拥有的功能不起作用,因为桥接器是在回复数据包中具有IP地址的桥接器。如何修改此设置,以便我可以从tap0读取和写入?
但是,dhclient不适用于tap0。我能想象这种工作的唯一方法是以某种方式找到一种方法来为tap0提供路由器已知的IP地址。我希望我不必在Python中实现通过tap0文件对象写入的dhclient。
此设置的灵感来自VM中所需的网络。我正在尝试使用用户空间程序将数据写入线路并能够从线路读取数据所需的系统基础结构。
感谢您的回复,并对有些冗长的帖子感到抱歉。
从终端到:
的命令sudo ip link add link eth0 m0 type macvlan
sudo tunctl -u root
sudo ip addr add 0.0.0.0 dev m0/tap0
sudo ip link set dev m0/tap0 promisc on
sudo brctl addbr br0
sudo brctl addif br0 tap0/m0
sudo ip link set dev br0 up
sudo dhclient br0
在Python中,我正在做类似于https://gist.github.com/glacjay/585369
的初始化步骤的事情从那里我只有一个文件对象,指的是我用os.fdopen(TAP0_FD, 'r+b')
打开的tap0接口,我可以写入和读取,如上面的解释所示。