如何防止内核丢弃 IP 标头长度字段不正确的数据包?

如何防止内核丢弃 IP 标头长度字段不正确的数据包?

我正在研究原始套接字编程和 IP 标头欺骗。

如果我使用 Scapy 在 Python 控制台中运行以下命令,我可以在 Wireshark 中看到 ICMP 回显请求和回复,并使用 C 程序来嗅探进入和离开我的系统的 ICMP 数据包。

>>> from scapy.all import *
>>> send( IP()/ICMP()/b'abcdef' )

但是,如果我设置了如下所示的不正确的 IP 标头长度字段,我只会在 Wireshark 中看到 ICMP 回显请求,而不会收到回复,并且看不到数据包嗅探程序的输出。

>>> from scapy.all import *
>>> send( IP(len=4000)/ICMP()/b'abcdef' )

我猜测 Linux 内核会丢弃具有无效 IP 标头“总长度”字段的数据包。我可以以某种方式阻止我的系统丢弃这些数据包吗?我的机器是否响应这些数据包并不重要,但我希望能够以编程方式访问这些数据包的内容。

答案1

互联网协议 (IP) 在 RFC 791 中定义。RFC 指定 IP 标头的格式。在报头中,有 4 位长的 IHL(互联网报头长度)字段,以 32 位字指定报头长度。 IHL 字段可以保存从 0(二进制 0000)到 15(二进制 1111)的值。

最长的 Internet 标头(IP 标头)大小可以是 15*32 位 = 480 位 = 60 字节。

最短的标头大小为 20 字节,其中 Internet 标头字段的值为 5 (0101)。这是因为标头中的所有必需字段都需要 20 字节的空间。

相关内容