MTU 超过的分组在 TUN 接口上到达

3 投票
1 回答
1274 浏览
提问于 2025-04-18 16:58

我正在使用 pytun 来设置一个 TUN 设备,并通过 UDP 将到达它的数据包转发到另一台机器。让我感到困惑的是,尽管我已经将 TUN 的最大传输单元(MTU)设置为 141 字节,但我却在上面读取到了 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

我已经通过 ifconfig 验证了接口的实际 MTU。

我是不是漏掉了什么?

1 个回答

4

如果你不加上 IFF_NO_PI 这个标志,你的帧会有一个 4 字节的头部。

这段内容来自内核的文档,路径是 Documentation/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))

撰写回答