解決抓到的報(bào)文校驗(yàn)和錯(cuò)誤問(wèn)題
在linux上使用tcpdump抓包,使用wireshark分析時(shí)發(fā)現(xiàn)發(fā)出的報(bào)文校驗(yàn)和都是錯(cuò)誤的,可是仍然可以與目標(biāo)建立鏈接,正常通信。這是為什么呢?
0x00 原因
在這里找到了問(wèn)題原因:https://zhidao.baidu.com/question/518773571676596765.html
在使用WireShark等截取數(shù)據(jù)包時(shí),往往會(huì)出現(xiàn)錯(cuò)誤的CheckSum,這主要是因?yàn)榫W(wǎng)卡開(kāi)啟了CheckSum Offload(硬件校驗(yàn)和) 功能,系統(tǒng)將CheckSum的計(jì)算工作交由網(wǎng)卡去計(jì)算,在高速網(wǎng)絡(luò)交換的情況下可以大大減輕CPU的工作負(fù)荷。
在windows系統(tǒng)中的Checksum Offload過(guò)程如下:如果網(wǎng)卡支持,在高級(jí)選項(xiàng)里可以設(shè)置Checksum Offload是否對(duì)Rx(接收端)或Tx(發(fā)送端)有效,也可以設(shè)置為對(duì)兩者都有效。
對(duì)于Tx,設(shè)置Checksum Offload有效之后,Windows的傳輸層將隨機(jī)填充TCP校驗(yàn)和,因此在本機(jī)上抓取的數(shù)據(jù)包是Bad CheckSum。然后,網(wǎng)卡會(huì)自動(dòng)計(jì)算正確的校驗(yàn)碼然后發(fā)送,因此對(duì)方收到的仍然是正確的TCP包。
對(duì)Rx,設(shè)置Checksum Offload有效之后,網(wǎng)卡在接收數(shù)據(jù)時(shí),會(huì)填充一個(gè)NDIS_TCP_IP_CHECKSUM_PACKET_INFO 結(jié)構(gòu)并設(shè)置標(biāo)志位,由網(wǎng)卡完成數(shù)據(jù)校驗(yàn);如果由于某種原因失敗,則不設(shè)置標(biāo)志位,由Windows里的TCP/IP協(xié)議棧來(lái)完成數(shù)據(jù)校驗(yàn)。
其實(shí)就是說(shuō),由于開(kāi)啟了硬件校驗(yàn)和功能,傳輸層并沒(méi)有計(jì)算校驗(yàn)和,而是隨機(jī)填了個(gè)數(shù),所以你抓到的包校驗(yàn)和是錯(cuò)的,而這個(gè)錯(cuò)誤的校驗(yàn)和在網(wǎng)卡發(fā)送出去前會(huì)被網(wǎng)卡改正過(guò)來(lái),所以接收端收到的包是校驗(yàn)和正確的包,會(huì)發(fā)回反饋。
0x01 解決方法
知道原因后,就容易解決了,我用的是CentOS-7.0,所以以它為例,我們只需要關(guān)閉網(wǎng)卡的硬件校驗(yàn)和功能,就可以抓到校驗(yàn)和正確的報(bào)文了。
-
命令行下輸入
ehtool -k eth0,查看網(wǎng)卡校驗(yàn)和功能的開(kāi)啟狀態(tài)。checksum1 -
ethtool -K eth0 rx off tx off,關(guān)閉網(wǎng)卡校驗(yàn)和。checksum2 重啟網(wǎng)卡,
sudo /etc/init.d/network restart-
重啟之后,再次查看網(wǎng)卡校驗(yàn)和功能開(kāi)啟狀態(tài),此時(shí)我們發(fā)現(xiàn)已經(jīng)是off狀態(tài)了。
checksum3 再次抓包,此時(shí)校驗(yàn)和正確。


