tcpdump 是一款強大的網絡抓包工具,運行在 linux 平臺上。熟悉 tcpdump 的使用可以幫助你分析、調試網絡數據。html
要想使用很好地掌握 tcpdump, 必須對網絡報文(TCP/IP 協議)有必定的瞭解。不過對於簡單的使用來講,只要有網絡基礎概念就好了。linux
tcpdump 是一個很複雜的命令,想了解它的方方面面很是不易,也不值得推薦,可以使用它解決平常工做中的問題纔是關鍵。web
tcpdump 的選項也不少,要想知道全部選項的話,請參考 man tcpdump
,下面只記錄 tcpdump 最經常使用的選項。vim
須要注意的是,tcpdump 默認只會截取前 96 字節的內容,要想截取全部的報文內容,能夠使用 -s number
, number
就是你要截取的報文字節數,若是是 0 的話,表示截取報文所有內容。網絡
-n
表示不要解析域名,直接顯示 ip。-nn
不要解析域名和端口-X
同時用 hex 和 ascii 顯示報文的內容。-XX
同 -X
,但同時顯示以太網頭部。-S
顯示絕對的序列號(sequence number),而不是相對編號。-i any
監聽全部的網卡-v, -vv, -vvv
:顯示更多的詳細信息-c number
: 截取 number 個報文,而後結束-A
: 只使用 ascii 打印報文的所有數據,不要和 -X
一塊兒使用。截取 http 請求的時候能夠用 sudo tcpdump -nSA port 80
!監聽全部端口,直接顯示 ip 地址。less
顯示更詳細的數據報文,包括 tos, ttl, checksum 等。tcp
顯示數據報的所有數據信息,用 hex 和 ascii 兩列對比輸出。工具
下面是抓取 ping 命令的請求和返回的兩個報文,能夠看到所有的數據。post
➜ ~ sudo tcpdump -nnvXSs 0 -c2 icmp tcpdump: data link type PKTAP tcpdump: listening on pktap, link-type PKTAP (Packet Tap), capture size 65535 bytes 22:58:16.781856 IP (tos 0x0, ttl 64, id 61452, offset 0, flags [none], proto ICMP (1), length 84) 192.168.1.106 > 192.168.1.1: ICMP echo request, id 65302, seq 0, length 64 0x0000: 0c72 2c28 b9ac 80e6 5019 4c38 0800 4500 .r,(....P.L8..E. 0x0010: 0054 f00c 0000 4001 06e1 c0a8 016a c0a8 .T....@......j.. 0x0020: 0101 0800 72c9 ff16 0000 5500 5808 000b ....r.....U.X... 0x0030: ee08 0809 0a0b 0c0d 0e0f 1011 1213 1415 ................ 0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$% 0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345 0x0060: 3637 67 22:58:17.674304 IP (tos 0x0, ttl 64, id 13972, offset 0, flags [none], proto ICMP (1), length 84) 192.168.1.1 > 192.168.1.106: ICMP echo reply, id 65302, seq 0, length 64 0x0000: 80e6 5019 4c38 0c72 2c28 b9ac 0800 4500 ..P.L8.r,(....E. 0x0010: 0054 3694 0000 4001 c059 c0a8 0101 c0a8 .T6...@..Y...... 0x0020: 016a 0000 7ac9 ff16 0000 5500 5808 000b .j..z.....U.X... 0x0030: ee08 0809 0a0b 0c0d 0e0f 1011 1213 1415 ................ 0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$% 0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345 0x0060: 3637 67 2 packets captured 5875 packets received by filter 0 packets dropped by kernel
機器上的網絡報文數量異常的多,不少時候咱們只關係和具體問題有關的數據報(好比訪問某個網站的數據,或者 icmp 超時的報文等等),而這些數據只佔到很小的一部分。把全部的數據截取下來,從裏面找到想要的信息無疑是一件很費時費力的工做。而 tcpdump 提供了靈活的語法能夠精確地截取關心的數據報,簡化分析的工做量。這些選擇數據包的語句就是過濾器(filter)!網站
過濾器也能夠簡單地分爲三類:type
, dir
和 proto
。
Type
讓你區分報文的類型,主要由 host
(主機), net
(網絡) 和 port
(端口) 組成。src
和 dst
也能夠用來過濾報文的源地址和目的地址。
tcpdump host 1.2.3.4
tcpdump src 2.3.4.5 tcpdump dst 3.4.5.6
tcpdump net 1.2.3.0/24
tcpdump icmp
tcpdump port 3389
tcpdump src port 1025 and tcp tcpdump udp and src port 53
此外還有指定端口和數據報文範圍的過濾器:
tcpdump portrange 21-23
tcpdump less 32 tcpdump greater 128 tcpdump > 32 tcpdump <= 128
過於過濾器的更多詳細信息,請訪問 tcpdump 官方 map page 的 PCAP-FILTER 部分。
使用 tcpdump 截取數據報文的時候,默認會打印到屏幕的默認輸出,你會看到按照順序和格式,不少的數據一行行快速閃過,根原本不及看清楚全部的內容。不過,tcpdump 提供了把截取的數據保存到文件的功能,以便後面使用其餘圖形工具(好比 wireshark,Snort)來分析。
-w
選項用來把數據報文輸出到文件,好比下面的命令就是把全部 80 端口的數據導入到文件
# sudo tcpdump -w capture_file.pcap port 80
-r
能夠讀取文件裏的數據報文,顯示到屏幕上。
# tcpdump -nXr capture_file.pcap host web30
NOTE:保存到文件的數據不是屏幕上看到的文件信息,而是包含了額外信息的固定格式 pcap,須要特殊的軟件來查看,使用 vim 或者 cat 命令會出現亂碼。
過濾的真正強大之處在於你能夠隨意組合它們,而鏈接它們的邏輯就是經常使用的 與/AND/&&
、 或/OR/||
和 非/not/!
。
tcpdump -nnvS src 10.5.2.3 and dst port 3389
tcpdump -nvX src net 192.168.0.0/16 and dat net 10.0.0.0/8 or 172.16.0.0/16
tcpdump -vv src mars or pluto and not dat port 22
從上面的例子就能夠看出,你能夠隨意地組合以前的過濾器來截取本身指望的數據報,最重要的就是知道本身要精確匹配的數據室怎樣的!
對於比較複雜的過濾器表達式,爲了邏輯的清晰,能夠使用括號。不過默認狀況下,tcpdump 把 ()
當作特殊的字符,因此必須使用單引號 '
來消除歧義:
tcpdump -nvv -c 20 'src 10.0.2.4 and (dat port 3389 or 22)'
截取數據只是第一步,第二步就是理解這些數據,下面就解釋一下 tcpdump 命令輸出各部分的意義。
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
最基本也是最重要的信息就是數據報的源地址/端口和目的地址/端口,上面的例子第一條數據報中,源地址 ip 是 192.168.1.106
,源端口是 56166
,目的地址是 124.192.132.54
,目的端口是 80
。 >
符號表明數據的方向。
此外,上面的三條數據仍是 tcp 協議的三次握手過程,第一條就是 SYN
報文,這個能夠經過 Flags [S]
看出。下面是常見的 TCP 報文的 Flags:
[S]
: SYN(開始鏈接)[.]
: 沒有 Flag[P]
: PSH(推送數據)[F]
: FIN (結束鏈接)[R]
: RST(重置鏈接)而第二條數據的 [S.]
表示 SYN-ACK
,就是 SYN
報文的應答報文。
本文主要參考了下面兩篇文章,算是翻譯和二次創做。