Bootstrap

【网络实验】非法(不按RFC标准)修改skb数据包遇到的现象

为论文做Linux内核编程实验总能遇到一些神奇的现象,现记录如下。


一、修改IP Fragment Offset(失败)
根据导师的需求,我在Netfilter Local Out钩子函数中把13bit fragment offset填为自定义的数据,同时保证flag DF位=1,即“不能分片”(Don‘t Fragment),希望各种网络软硬件设施能允许我发送这样的包。
我装载内核模块后,试图访问Linux文档的网站,结果如下图。


结果上看,wireshark已经识别了我的设置,虽然Flags确实是“不能分片”,但是offset不为0的话还是被软件认为是“Fragmented IP protocol”。14号报文是对9号报文的应答,它是深红色的,因为RST=1,说明网站服务器拒绝和我方建立TCP连接。

二、修改TCP 4个保留bit(失败)
TCP头部“数据偏移”字段(也就是TCP首部长度字段)后面原本有6个保留比特,ECN被设计出来后,有2个bit供其使用(RFC文档)。导师希望把剩余的4个bit用起来。我发现struct tcphdr可以直接访问这个bitfield,于是修改之。
我装载内核模块后,试图访问Linux文档的网站,结果如下图。

wireshark发现我修改了reserved bit,同时我自行计算的TCP首部checksum也是对的。但是,从9号报文开始大规模重传(约100ms超时),且我方从未收到任何应答报文,说明我方发送的包被某些软硬件设备丢弃。

;