首頁 > 軟體

tcpdump 命令使用簡介

2020-06-16 16:47:24

簡介

tcpdump 是一款強大的網路抓包工具,執行在 Linux 平台上。熟悉 tcpdump 的使用能夠幫助你分析、偵錯網路資料。

要想使用很好地掌握 tcpdump, 必須對網路報文(TCP/IP 協定)有一定的了解。不過對於簡單的使用來說,只要有網路基礎概念就行了。

tcpdump 是一個很複雜的命令,想了解它的方方面面非常不易,也不值得推薦,能夠使用它解決日常工作中的問題才是關鍵。

選項

tcpdump 的選項也很多,要想知道所有選項的話,請參考 man tcpdump,下面只記錄 tcpdump 最常用的選項。

需要注意的是,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!

使用

1. tcpdump -nS

監聽所有埠,直接顯示 ip 地址。

2. tcpdump -nnvvS

顯示更詳細的資料包文,包括 tos, ttl, checksum 等。

3. tcpdump -nnvvXS

顯示資料包的全部資料資訊,用 hex 和 ascii 兩列對比輸出。

下面是抓取 ping 命令的請求和返回的兩個報文,可以看到全部的資料。

?  ~  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 也可以用來過濾報文的源地址和目的地址。

host: 過濾某個主機的資料包文

tcpdump host 1.2.3.4

src, dst: 過濾源地址和目的地址

tcpdump src 2.3.4.5
tcpdump dst 3.4.5.6

net: 過濾某個網段的資料,CIDR 模式

tcpdump net 1.2.3.0/24

proto: 過濾某個協定的資料,支援 tcp, udp 和 icmp。使用的時候可以省略 proto 關鍵字。

tcpdump icmp

port: 過濾通過某個埠的資料包

tcpdump port 3389

src/dst, port, protocol: 結合三者

tcpdump src port 1025 and tcp
tcpdump udp and src port 53

此外還有指定埠和資料包文範圍的過濾器:

port 範圍

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/!。

源地址是 10.5.2.3,目的埠是 3389 的資料包

tcpdump -nnvS src 10.5.2.3 and dst port 3389

從 192.168 網段到 10 或者 172.16 網段的資料包

tcpdump -nvX src net 192.168.0.0/16 and dat net 10.0.0.0/8 or 172.16.0.0/16

從 Mars 或者 Pluto 發出的資料包,並且目的埠不是 22

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 的輸出

擷取資料只是第一步,第二步就是理解這些資料,下面就解釋一下 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 報文的應答報文。

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新連結地址https://www.linuxidc.com/Linux/2018-09/153840.htm


IT145.com E-mail:sddin#qq.com