3

我正在使用pytun设置一个 TUN 并将到达它的数据包转发到使用 UDP 的另一台机器。令我不解的是,即使我已将 TUN 配置为具有 141 字节的 MTU,我仍在读取大小为 145 的数据包。请看下面的代码:

from pytun import TunTapDevice
tun = TunTapDevice(name="vpn")
tun.addr = '10.8.0.1'
tun.dstaddr = '10.8.0.2'
tun.netmask = '255.255.255.0'
tun.mtu = 141
tun.up()
assert len(tun.read(1000)) <= tun.mtu # <-- fails for some packets

我已经使用 . 验证了接口的实际 MTU ifconfig

我错过了什么吗?

4

1 回答 1

4

如果您不添加 IFF_NO_PI 标志,您将在帧上获得一个 4 字节的标头。

从内核文档/networking/tuntap.txt

3.2 帧格式:

如果未设置标志 IFF_NO_PI,则每个帧格式为:
标志 [2 字节]
原始 [2 字节]
原始协议(IP、IPv6 等)帧。

据推测,你应该能够得到你想要的

from pytun import TunTapDevice, IFF_TUN, IFF_NO_PI
tun = TunTapDevice(name="vpn",flags=(IFF_TUN | IFF_NO_PI))
于 2014-12-01T09:30:42.600 回答