tcpdump過濾資料包,結果不對?

onephone發表於2017-01-17

需要寫個程式通過pcap-filter表示式過濾資料包,測試時發現過濾結果不對!現將問題簡化如下(以tcpdump舉例)

問題描述

  1. 通過 tcpdump 過濾出173_20170107_180747_p5p2.pcap 檔案中IP為 10.10.88.173的資料包,並儲存為result.pcap,過濾命令 tcpdump -r 173_20170107_180747_p5p2.pcap -w result.pcap "host 10.10.88.173"
  2. 原始資料包用wireshark開啟,設定過濾表示式為ip.addr==10.10.88.173,發現IP為 10.10.88.173的資料包個數為7150
  3. 但用wireshark開啟tcpdump過濾出的result.pcap檔案,發現其資料包個數為7152,如下圖!(此時如果知道原因就不用往下看了)
    image_1b5sh1esi12fhcde4ln8id1k1r1c.png-97.6kB
    image_1b5sh37cbdt41hthgqrk3ntgo1p.png-89kB

問題分析

  1. 通過對比wireshark和tcpdump過濾出的資料包,發現tcpdump過濾出的pcap檔案,多了兩個ARP資料包。如圖
    image_1b5si96kh1o96afr1qeam615b530.png-37.4kB
  2. 但就自己所瞭解的,ARP協議應屬於鏈路層的,不屬於IP網路層的(這種表述可能有爭論),為什麼tcpdump會將其包含在過濾結果內呢?
  3. 通過man pcap-filter查閱pcap-filter表示式語法,發現自己寫的tcpdump過濾表示式host 10.10.88.173是正確的啊
    image_1b5siqkvebebkal10scanm1nf53d.png-4.2kB
  4. 但細看卻發現,預設下的host,src host, dst host過濾出的資料包,是包含ARPRARP協議的!!!wireshark解析ARP資料包,其也包含對應的IP 10.10.88.173, man pcap-filter,其準確描述如下
    image_1b5sj4q5krlc1uka1i1bjul1gkn3q.png-17.1kB

問題解決

  1. 將tcpdump過濾表示式修改為ip host 10.10.88.173,即執行命令tcpdump -r 173_20170107_180747_p5p2.pcap -w result.pcap "ip host 10.10.88.173"即可!

問題總結

  1. 在使用tcpdump或其他工具過特定IP的資料包時,pcap-filter過濾表示式的書寫要注意!
  2. 如果僅僅是想過濾出IP層的特定IP的資料,需要使用ip host X.X.X.Xip src X.X.X.Xip dst X.X.X.X
  3. 如果僅僅是想過濾出ARP或RARP協議的IP資料包時,需要使用arp host X.X.X.Xrarp host X.X.X.X
  4. man pcap-filter,多熟悉下

相關文章