如何从通过网桥连接到MACVLAN的TAP设备读写?

2024-06-16 16:04:50 发布

您现在位置:Python中文网/ 问答频道 /正文

让我描述一下我的设置。在

使用Debian。我已经把eth0连接到我的家庭路由器。从eth0创建MACVLAN(名为m0)。使用tunctl创建一个TAP设备(名为tap0)。最后,使用bridge utils创建一个桥(名为br0),并且m0和tap0都连接到该桥。在

使用ping,我能够从tcpdump捕获一个ICMP请求示例。首先,我使用dhclient从家庭路由器获得一个IP地址。接下来,我从br0 ping路由器。然后在tcpdump中捕获这个包。在

接下来,我用Python编写tap0接口。一旦我得到了file对象,我就复制前面的示例ICMP请求(它的IP地址从br0到192.168.1.1,这是家庭路由器),将其转换为二进制,然后将其写入file对象。在

使用tcpdump,我可以看到我在Python中写入file对象的数据包与预期的一样——一个ICMP回送请求。我可以在链中的每个接口(tap0、br0、m0、eth0)上看到这个包。在

这是我要解决的问题。除了使用tcpdump的tap0(br0、m0、eth0),我可以在链中的每个接口上看到ICMP echo回复。理想情况下,我希望从Python中的file对象读取ICMP echo响应。我所拥有的不起作用是有道理的,因为网桥是在回复包中有IP地址的网桥。如何修改此设置,使我可以从TAP00读写?在

然而,dhclient不支持tap0。我能想到的唯一方法就是找到一种方法,给tap0一个路由器知道的IP地址。我希望我不必在Python中实现通过tap0文件对象写入的dhclient。在

这个设置的灵感来自VMs中需要的网络。我正在尝试使用一个用户空间程序所需的系统基础设施来向线路写入数据,并能够从线路上读回数据。在

谢谢你的回复,也很抱歉这篇文章有些冗长。在

从终端到:

  1. 创建macvlan m0:sudo ip link add link eth0 m0 type macvlan
  2. 创建tap0:sudo tunctl -u root
  3. 网络设备初始化:sudo ip addr add 0.0.0.0 dev m0/tap0sudo ip link set dev m0/tap0 promisc on
  4. 创建桥并将其链接到m0并点击0:sudo brctl addbr br0sudo brctl addif br0 tap0/m0sudo ip link set dev br0 upsudo dhclient br0

在Python中,我所做的事情与https://gist.github.com/glacjay/585369的初始化步骤类似

从这里我有一个file对象,它引用了我用os.fdopen(TAP0_FD, 'r+b')打开的tap0接口,我可以写入和读取,如上面的解释所示。在


Tags: 对象devip家庭sudolink路由器file