我一直在尝试使用 python 将数据包发送到 tap 接口。我正在使用 wireshark 监控 tap 接口,但没有收到任何数据包。我这样做主要是为了帮助我理解 python 中的 vpn、以太网桥接和套接字编程。
我的系统设置如下:
Ubuntu Desktop 11.10
Python 2.7
eth0 ip: 192.168.1.6
tap0 ip: 10.0.0.1
我首先设置水龙头如下:
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 接口并通过 tap0 创建到 10.0.0.1/24 的内核路由规则。
以下是路由表:
$ 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
用于tap
OpenVPN 下的桥接隧道 - 您应该将其连接到桥接器,例如br0
使用brctl
。
这个想法是,您可以将tap0
和eth0
放入网桥中br0
,然后广播流量将穿过此网桥。(来自 的广播流量tap0
将被转发到eth0
,反之亦然,而在路由的标准情况下则不会。)tap0
然后,您的 OpenVPN 隧道将通过 被“交换”到 ,eth0
而不是“路由”到 。整个br0
获得一个 IP,然后您处理br0
而不是eth0
或tap0
。
完全有可能只有一个接口的桥,并根据brctl
需要添加/删除其他接口。
因此,要么放入tap0
桥接器并处理桥接接口,要么使用tun
接口。
规则也可能iptables
会造成干扰。
更新-看这里:http://backreference.org/2010/03/26/tuntap-interface-tutorial/- 特别是这段摘录:
tap 接口和 tun 接口之间的区别在于 tap 接口输出(并且必须提供)完整的以太网帧,而 tun 接口输出(并且必须提供)原始 IP 数据包(并且内核不会添加任何以太网报头)。接口的功能是像 tun 接口还是像 tap 接口,在创建接口时通过标志指定。
因此,看起来如果您不向 tap0 发送完整的以太网帧,它就不会像您预期的那样工作,原因如下。