为什么在原始以太网帧后附加 14 字节的随机数据?



我使用以下python代码将原始以太网帧发送到环回接口(Linux ubuntu 4.15.0-34-generic(:

from scapy.all import *
pkt = Ether(dst="aa:aa:aa:aa:aa:aa", src="00:ff:00:ff:00:ff", type=0x6666) / ("A"*50)
sendp(pkt, iface="lo")

(我们使用自定义以太网类型0x6666,但使用以太网 II 帧格式指定的数据包长度 (50( 具有相同的结果(

我希望在接收器(或在 Wireshark 中(看到长度为 14+50=64 字节的数据包。相反,我看到一个 14+50+14=78 字节的数据包。添加的 14 个字节的内容似乎是随机的(或者可能是来自未清零的重用缓冲区的数据(。

例如,以下 Wireshark 输出来自上述代码的两次连续调用:

0000 aa aa aa aa aa aa 00 ff 00 ff 00 ff 66 66 41 41 ............ffAA 0010 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0020 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0030 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0040 00 00 00 00 00 00 10 00 00 00 00 00 00 00 ..............

0000 aa aa aa aa aa aa 00 ff 00 ff 00 ff 66 66 41 41 ............ffAA 0010 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0020 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0030 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0040 22 20 68 6f 73 74 6e 61 6d 65 3d 3f 20 61 " hostname=? a

我很好奇为什么要添加 14 个字节(因为数据包比以太网数据包所需的 64 字节长,所以这不是填充问题(?以及如何摆脱此示例中的 14 个额外字节?

对内核的波纹管提交是导致原始海报提到的回归的原因。

描述:数据包:在链路层分配时开始写入packet_snd

GIT SHA: c6026847a0a1198e4d0b200da6666cb1056b12fe

https://lore.kernel.org/patchwork/patch/899678/

解决方案有几种选择。

1( 降级到 4.15.0-32-通用或更早版本

2( 下载当前内核的源代码并删除该补丁并使用它进行编译。

3(将其报告给lkml并等待他们修复。

上面的补丁提到它也适用于RAW数据包,但它在附加更多字节之前不会检查大小以查看是否需要附加任何字节。 最小总数据包大小应为 64 字节。

编辑:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/packet/af_packet.c?h=v4.19-rc5

显示上述补丁不再在当前内核中,kernel.org 这现在是 Ubuntu 问题。

编辑2:git 树中的 ubuntu 4.15.0-36.39 不再有 33 中出现的补丁。 所以 Ubuntu 应该在某个时候解决这个问题。

我也看到这个 4.15.0-33 通用是它第一次出现的地方。

4.15.0-32-通用没有问题,它不是特别的, 以太网驱动程序,因为我尝试了USB以太网也确保。

最新更新