使用Python向tap接口发送数据包

3 投票
1 回答
3582 浏览
提问于 2025-04-17 10:58

我一直在尝试用Python向一个tap接口发送数据包。我用Wireshark监控这个tap接口,但没有收到任何数据包。我这样做主要是为了帮助我理解VPN、以太网桥接和Python中的套接字编程。

我的系统设置如下:

Ubuntu Desktop 11.10
Python 2.7
eth0 ip: 192.168.1.6
tap0 ip: 10.0.0.1

我首先这样设置tap接口:

sudo openvpn --mktun --dev tap0
sudo ifconfig tap0 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 promisc up

这会启动tap0接口,并创建一个内核路由规则,指向10.0.0.1/24,通过tap0。

这是路由表:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.0        *               255.255.255.0   U     0      0        0 tap0
192.168.1.6     *               255.255.255.0   U     1      0        0 eth0
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

接下来,我启动Python的交互模式,并创建一个简单的UDP套接字。

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('helloworld',('10.0.0.2',12345))

我在tap0上运行sendto命令,同时用Wireshark监控。现在,我的网络上没有10.0.0.2这个主机,但我至少应该能看到一些从tap0接口发出的流量。我在Windows上也做过这个,似乎一切正常。

我只能想到问题可能出在Linux下tap0接口的设置上。或者是我对这些东西理解得不够好。

谢谢

1 个回答

1

在ethertap接口上,如果ARP缓存里还有一个负面的(不完整的)记录,你可能实际上看不到发出的流量。否则,你可能只会看到一个ARP数据包。

我觉得这和python没有关系。

你试过ping一下吗?你能看到一个icmp数据包发出去吗?ARP表看起来怎么样?

撰写回答