解决抓到的报文校验和错误问题
在linux上使用tcpdump抓包,使用wireshark分析时发现发出的报文校验和都是错误的,可是仍然可以与目标建立链接,正常通信。这是为什么呢?
0x00 原因
在这里找到了问题原因:https://zhidao.baidu.com/question/518773571676596765.html
在使用WireShark等截取数据包时,往往会出现错误的CheckSum,这主要是因为网卡开启了CheckSum Offload(硬件校验和) 功能,系统将CheckSum的计算工作交由网卡去计算,在高速网络交换的情况下可以大大减轻CPU的工作负荷。
在windows系统中的Checksum Offload过程如下:如果网卡支持,在高级选项里可以设置Checksum Offload是否对Rx(接收端)或Tx(发送端)有效,也可以设置为对两者都有效。
对于Tx,设置Checksum Offload有效之后,Windows的传输层将随机填充TCP校验和,因此在本机上抓取的数据包是Bad CheckSum。然后,网卡会自动计算正确的校验码然后发送,因此对方收到的仍然是正确的TCP包。
对Rx,设置Checksum Offload有效之后,网卡在接收数据时,会填充一个NDIS_TCP_IP_CHECKSUM_PACKET_INFO 结构并设置标志位,由网卡完成数据校验;如果由于某种原因失败,则不设置标志位,由Windows里的TCP/IP协议栈来完成数据校验。
其实就是说,由于开启了硬件校验和功能,传输层并没有计算校验和,而是随机填了个数,所以你抓到的包校验和是错的,而这个错误的校验和在网卡发送出去前会被网卡改正过来,所以接收端收到的包是校验和正确的包,会发回反馈。
0x01 解决方法
知道原因后,就容易解决了,我用的是CentOS-7.0,所以以它为例,我们只需要关闭网卡的硬件校验和功能,就可以抓到校验和正确的报文了。
-
命令行下输入
ehtool -k eth0
,查看网卡校验和功能的开启状态。 -
ethtool -K eth0 rx off tx off
,关闭网卡校验和。 重启网卡,
sudo /etc/init.d/network restart
-
重启之后,再次查看网卡校验和功能开启状态,此时我们发现已经是off状态了。
再次抓包,此时校验和正确。