運維之道 | tcpdump抓包工具

tcpdump命令:抓取數據包

tcpdump命令是一款抓取數據包的工具,它可以打印所有經過網絡接口的數據包的頭信息,也可以使用-w選項將數據包保存到文件中,方便以後分析
常用選項:
  • -a:嘗試將網絡和廣播地址轉換成名稱;
  • -c:<數據包數目>:收到指定的數據包數目後,就停止進行傾倒操作;
  • -d:把編譯過的數據包編碼轉換成可閱讀的格式,並傾倒到標準輸出;
  • -dd:把編譯過的數據包編碼轉換成C語言的格式,並傾倒到標準輸出;
  • -ddd:把編譯過的數據包編碼轉換成十進制數字的格式,並傾倒到標準輸出;
  • -e:在每列傾倒資料上顯示連接層級的文件頭;
  • -f:用數字顯示網際網絡地址;
  • -F:<表達文件>:指定內含表達方式的文件;
  • -i:<網絡界面>:使用指定的網絡截面送出數據包;
  • -l:使用標準輸出列的緩衝區;
  • -n:不把主機的網絡地址轉換成名字;
  • -N:不列出域名;
  • -O:不將數據包編碼最佳化;
  • -p:不讓網絡界面進入混雜模式;
  • -q :快速輸出,僅列出少數的傳輸協議信息;
  • -r:<數據包文件>:從指定的文件讀取數據包數據;
  • -s:<數據包大小>:設置每個數據包的大小;
  • -S:用絕對而非相對數值列出TCP關聯數;
  • -t:在每列傾倒資料上不顯示時間戳記;
  • -tt:在每列傾倒資料上顯示未經格式化的時間戳記;
  • -T:<數據包類型>:強制將表達方式所指定的數據包轉譯成設置的數據包類型;
  • -v:詳細顯示指令執行過程;
  • -vv:更詳細顯示指令執行過程;
  • -x:用十六進制字碼列出數據包資料;
  • -w:<數據包文件>:把數據包數據寫入指定的文件

例子:

  • 不指定任何參數
    監聽第一塊網卡上經過的數據包。主機上可能有不止一塊網卡,所以經常需要指定網卡
tcpdump
  • 監聽指定網卡
tcpdump -i ens33
  • 監聽指定主機

例子:監聽本機跟主機192.168.182.11之間往來的通信包,出、入的包都會被監聽

tcpdump host 192.168.182.11
  • 特定來源、目標地址的通信

特定來源地址

tcpdump src host 192.168.182.11

特定目標地址

tcpdump dst host 192.168.182.11

如果不指定srcdst,那麼來源或者目標是hostname的通信都會被監聽

tcpdump host 192.168.182.11
  • 指定端口
tcpdump port 8080
  • 監聽TCP/UDP

服務器上不同服務分別用了TCP、UDP作爲傳輸層,假如只想監聽TCP的數據包

tcpdump tcp
  • 來源主機+端口+TCP

監聽來自主機192.168.182.11在端口22上的TCP數據包

tcpdump tcp port 22 and src host 192.168.182.11
  • 監聽特定主機之間的通信

抓取192.168.182.11192.168.182.12主機之間的通信數據

tcpdump ip host 192.168.182.11 and 192.168.182.12

抓取192.168.182.11和除了192.168.182.12之外的主機之間的通信

tcpdump ip host 192.168.182.11 and ! 192.168.182.12
  • 綜合實例
tcpdump tcp -i ens33 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w tcpdump.cap
  • tcp: ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾數據報的類型
  • -i ens33 : 只抓經過接口eth1的包
  • -t: 不顯示時間戳
  • -s 0 : 抓取數據包時默認抓取長度爲68字節。加上-S 0 後可以抓到完整的數據包
  • -c 100 : 只抓取100個數據包
  • dst port ! 22 : 不抓取目標端口是22的數據包
  • src net 192.168.1.0/24 : 數據包的源網絡地址爲192.168.1.0/24
  • -w tcpdump.cap: 保存成cap文件,方便用ethereal(即wireshark)分析
tcpdump -r tcpdump.cap   # 使用-r 參數查看保存文件數據

實戰例子

先看下面一個比較常見的部署方式,在服務器上部署了nodejs server,監聽3000端口。nginx反向代理監聽80端口,並將請求轉發給nodejs server(127.0.0.1:3000)。

瀏覽器 -> nginx反向代理 -> nodejs server

問題:假設用戶(183.14.132.117)訪問瀏覽器,發現請求沒有返回,該怎麼排查呢?

步驟一:查看請求是否到達nodejs server -> 可通過日誌查看。
步驟二:查看nginx是否將請求轉發給nodejs server。

tcpdump port 8383 

複製代碼這時你會發現沒有任何輸出,即使nodejs server已經收到了請求。因爲nginx轉發到的地址是127.0.0.1,用的不是默認的interface,此時需要顯示指定interface

tcpdump port 8383 -i lo

複製代碼備註:配置nginx,讓nginx帶上請求側的host,不然nodejs server無法獲取 src host,也就是說,下面的監聽是無效的,因爲此時對於nodejs server來說,src host 都是 127.0.0.1

tcpdump port 8383 -i lo and src host 183.14.132.117

複製代碼步驟三:查看請求是否達到服務器

tcpdump -n tcp port 8383 -i lo and src host 183.14.132.117
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章