发送数据包到 tap0 接口

发送数据包到 tap0 接口

我一直在尝试使用 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

用于tapOpenVPN 下的桥接隧道 - 您应该将其连接到桥接器,例如br0使用brctl

这个想法是,您可以将tap0eth0放入网桥中br0,然后广播流量将穿过此网桥。(来自 的广播流量tap0将被转发到eth0,反之亦然,而在路由的标准情况下则不会。)tap0然后,您的 OpenVPN 隧道将通过 被“交换”到 ,eth0而不是“路由”到 。整个br0获得一个 IP,然后您处理br0而不是eth0tap0

完全有可能只有一个接口的桥,并根据brctl需要添加/删除其他接口。

因此,要么放入tap0桥接器并处理桥接接口,要么使用tun接口。

规则也可能iptables会造成干扰。

更新-看这里:http://backreference.org/2010/03/26/tuntap-interface-tutorial/- 特别是这段摘录:

tap 接口和 tun 接口之间的区别在于 tap 接口输出(并且必须提供)完整的以太网帧,而 tun 接口输出(并且必须提供)原始 IP 数据包(并且内核不会添加任何以太网报头)。接口的功能是像 tun 接口还是像 tap 接口,在创建接口时通过标志指定。

因此,看起来如果您不向 tap0 发送完整的以太网帧,它就不会像您预期的那样工作,原因如下。

相关内容