Linux 網絡命令必知必會之 tcpdump,一份完整的抓包指南請查收!


本文首發於我的公眾號 Linux雲計算網絡(id: cloud_dev),專注於干貨分享,號內有 10T 書籍和視頻資源,后台回復「1024」即可領取,歡迎大家關注,二維碼文末可以掃。

這篇文章我總結得比較詳盡,可以當字典查,建議收藏,不過別光顧着收藏,點贊什么的鼓勵我一下,這能讓我更有動力給大家輸出更好的內容。

01 簡介

tcpdump 是一款 Linux 平台的抓包工具。它可以抓取涵蓋整個 TCP/IP 協議族的數據包,支持針對網絡層、協議、主機、端口的過濾,並提供 and、or、not 等邏輯語句來過濾無用的信息。

tcpdump 是一個非常復雜的工具,掌握它的方方面面實屬不易,也不推薦,能夠用它來解決日常工作問題才是關系。

02 tcpdump 命令選項

tcpdump 有很多命令選項,想了解所有選項可以 Linux 命令行輸入 tcpdump -hman tcpdump 查看每個選項的意思。

[root@by ~]# tcpdump -h
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips  26 Jan 2017
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
		[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
		[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
		[ -Q|-P in|out|inout ]
		[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
		[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
		[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
		[ -Z user ] [ expression ]

下面列舉一些常用選項:

  • -A 只使用 ASCII 打印報文的全部數據,不要和 -X 一起使用,獲取 http 可以用 tcpdump -nSA port 80
  • -b 在數據鏈路層上選擇協議,包括 ip, arp, rarp, ipx 等
  • -c 指定要抓取包的數量
  • -D 列出操作系統所有可以用於抓包的接口
  • -e 輸出鏈路層報頭
  • -i 指定監聽的網卡,-i any 顯示所有網卡
  • -n 表示不解析主機名,直接用 IP 顯示,默認是用 hostname 顯示
  • -nn 表示不解析主機名和端口,直接用端口號顯示,默認顯示是端口號對應的服務名
  • -p 關閉接口的混雜模式
  • -P 指定抓取的包是流入的包還是流出的,可以指定參數 in, out, inout 等,默認是 inout
  • -q 快速打印輸出,即只輸出少量的協議相關信息
  • -s len 設置要抓取數據包長度為 len,默認只會截取前 96bytes 的內容,-s 0 的話,會截取全部內容。
  • -S 將 TCP 的序列號以絕對值形式輸出,而不是相對值
  • -t 不要打印時間戳
  • -vv 輸出詳細信息(比如 tos、ttl、checksum等)
  • -X 同時用 hex 和 ascii 顯示報文內容
  • -XX 同 -X,但同時顯示以太網頭部

03 過濾器

網絡報文是很多的,很多時候我們在主機上抓包,會抓到很多我們並不關心的無用包,然后要從這些包里面去找我們需要的信息,無疑是一件費時費力的事情,tcpdump 提供了靈活的語法可以精確獲取我們關心的數據,這些語法說得專業點就是過濾器。

過濾器簡單可分為三類:協議(proto)、傳輸方向(dir)和類型(type)。

一般的 表達式格式 為:

  • 關於 proto:可選有 ip, arp, rarp, tcp, udp, icmp, ether 等,默認是所有協議的包
  • 關於 dir:可選有 src, dst, src or dst, src and dst,默認為 src or dst
  • 關於 type:可選有 host, net, port, portrange(端口范圍,比如 21-42),默認為 host

04 常用操作

測試環境 IP:172.18.82.173

4.1 抓取某主機的數據包

抓取主機 172.18.82.173 上所有收到(DST_IP)和發出(SRC_IP)的所有數據包

tcpdump host 172.18.82.173

抓取經過指定網口 interface ,並且 DST_IP 或 SRC_IP 是 172.18.82.173 的數據包

tcpdump -i eth0 host 172.18.82.173

篩選 SRC_IP,抓取經過 interface 且從 172.18.82.173 發出的包

tcpdump -i eth0 src host 172.18.82.173

篩選 DST_IP,抓取經過 interface 且發送到 172.18.82.173 的包

tcpdump -i eth0 dst host 172.18.82.173

抓取主機 200.200.200.1 和主機 200.200.200.2 或 200.200.200.3 通信的包

tcpdump host 200.200.200.1 and \(200.200.200.2 or 200.200.200.3\)

抓取主機 200.200.200.1 和除了主機 200.200.200.2 之外所有主機通信的包

tcpdump ip host 200.200.200.1 and ! 200.200.200.2

4.2 抓取某端口的數據包

抓取所有端口,顯示 IP 地址

tcpdump -nS

抓取某端口上的包

tcpdump port 22

抓取經過指定 interface,並且 DST_PORT 或 SRC_PORT 是 22 的數據包

tcpdump -i eth0 port 22

篩選 SRC_PORT

tcpdump -i eth0 src port 22

篩選 DST_PORT

tcpdump -i eth0 dst port 22

比如希望查看發送到 host 172.18.82.173 的網口 eth0 的 22 號端口的包

[root@by ~]# tcpdump -i eth0 -nnt dst host 172.18.82.173 and port 22 -c 1 -vv
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
IP (tos 0x14, ttl 114, id 27674, offset 0, flags [DF], proto TCP (6), length 40)
    113.98.59.61.51830 > 172.18.82.173.22: Flags [.], cksum 0x7fe3 (correct), seq 19775964, ack 1564316089, win 2053, length 0

4.3 抓取某網絡(網段)的數據包

抓取經過指定 interface,並且 DST_NET 或 SRC_NET 是 172.18.82 的包

tcpdump -i eth0 net 172.18.82

篩選 SRC_NET

tcpdump -i eth0 src net 172.18.82

篩選 DST_NET

tcpdump -i eth0 dst net 172.18.82

4.4 抓取某協議的數據包

tcpdump -i eth0 icmp
tcpdump -i eth0 ip
tcpdump -i eth0 tcp
tcpdump -i eth0 udp
tcpdump -i eth0 arp

4.5 復雜的邏輯表達式抓取過濾條件

抓取經過 interface eth0 發送到 host 200.200.200.1 或 200.200.200.2 的 TCP 協議 22 號端口的數據包

tcpdump -i eth0 -nntvv -c 10 '((tcp) and (port 22) and ((dst host 200.200.200.1) or (dst host 200.200.200.2)))'

PS:對於復雜的過濾器表達式,為了邏輯清晰,可以使用 (),不過默認情況下,tcpdump 會將 () 當做特殊字符,所以必須使用 '' 來消除歧義。

抓取經過 interface eth0, DST_MAC 或 SRC_MAC 地址是 00:16:3e:12:16:e7 的 ICMP 數據包

tcpdump -i eth0 '((icmp) and ((ether host 00:16:3e:12:16:e7)))' -nnvv

抓取經過 interface eth0,目標網絡是 172.18 但目標主機又不是 172.18.82.173 的 TCP 且非 22 號端口號的數據包

tcpdump -i eth0 -nntvv '((dst net 172.18) and (not dst host 172.18.82.173) and (tcp) and (not port 22))'

抓取流入 interface eth0,host 為 172.18.82.173 且協議為 ICMP 的數據包

tcpdump -i eth0 -nntvv -P in host 172.18.82.173 and icmp

抓取流出 interface eth0,host 為 172.18.82.173 且協議為 ICMP 的數據包

tcpdump -i eth0 -nntvv -P out host 172.18.82.173 and icmp

05 與 wireshark、Snort 等工具的結合

tcpdump 抓包的時候,默認是打印到屏幕輸出,如果是抓取包少還好,如果包很多,很多行數據,刷刷刷從眼前一閃而過,根本來不及看清內容。不過,tcpdump 提供了將抓取的數據保存到文件的功能,查看文件就方便分析多了,而且還能與其他圖形工具一起配合分析,比如 wireshark、Snort 等。

  • -w 選項表示把數據報文輸出到文件
tcpdump -w capture_file.pcap port 80 # 把所有 80 端口的數據導出到文件

  • -r 選項表示讀取文件里的數據報文,顯示到屏幕上
tcpdump -nXr capture_file.pcap host host1

PS:.pcap 格式的文件需要用 wireshark、Snort 等工具查看,使用 vimcat 會出現亂碼。

06 tcpdump 的輸出格式

tcpdump 的輸出格式總體上為:

系統時間 源主機.端口 > 目標主機.端口 數據包參數

比如下面的例子,顯示了 TCP 的三次握手過程:

21:27:06.995846 IP (tos 0x0, ttl 64, id 45646, offset 0, flags [DF], proto TCP (6), length 64)
    192.168.1.106.56166 > 124.192.132.54.80: Flags [S], cksum 0xa730 (correct), seq 992042666, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 663433143 ecr 0,sackOK,eol], length 0

21:27:07.030487 IP (tos 0x0, ttl 51, id 0, offset 0, flags [DF], proto TCP (6), length 44)
    124.192.132.54.80 > 192.168.1.106.56166: Flags [S.], cksum 0xedc0 (correct), seq 2147006684, ack 992042667, win 14600, options [mss 1440], length 0

21:27:07.030527 IP (tos 0x0, ttl 64, id 59119, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.1.106.56166 > 124.192.132.54.80: Flags [.], cksum 0x3e72 (correct), ack 2147006685, win 65535, length 0

第一條是 SYN 報文,通過 Flags[S] 看出。第二條是 [S.],表示 SYN-ACK 報文。常見的 TCP 報文的 Flags 如下:

  • [S]: SYN(開始連接)
  • [.]: 沒有 Flag
  • [P]: PSH(推送數據)
  • [F]: FIN (結束連接)
  • [R]: RST(重置連接)

06 總結

本文可以當字典查閱,記住一些常用的 tcpdump 抓包案例,其他的用到再通過 man tcpdump 輔助編寫。和 wireshark 等圖形化工具配合使用,能更加深理解。


后台回復“加群”,帶你進入高手如雲交流群

參考

https://blog.csdn.net/Jmilk/article/details/86618205?tdsourcetag=s_pctim_aiomsg

https://danielmiessler.com/study/tcpdump/

http://bencane.com/2014/10/13/quick-and-practical-reference-for-tcpdump/


我的公眾號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,后台回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM