每天一個 Linux 命令:tcpdump 命令

1. 命令簡介

tcpdump 是一款類 Unix/Linux 環境下的抓包工具,允許用戶截獲和顯示發送或收到的網絡數據包。tcpdump 是一個在 BSD 許可證下發布的自由軟件。

2. 命令格式

tcpdump [ -AbdDefhlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]
        [ -C file_size ] [ -F file ] [ -G rotate_seconds ]
        [ -i interface ] [ -m module ] [ -M secret ]
        [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
        [ -W filecount ]
        [ -E spi@ipaddr algo:secret,...  ]
        [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
        [ expression ]

3. 選項說明

-A
 以 ASCII 碼方式顯示每一個數據包(不會顯示數據包中鏈路層頭部信息)。在抓取包含網頁數據的數據包時,可方便查看數據
-b
 用 ASDOT 符號而不是 ASPLAIN 符號在 BGP 數據包中打印 AS 號
-B, --buffer-size=BUFFER_SIZE
 設置操作系統捕捉緩衝大小,單位 KB
-c [數據包數目]
 收到指定的數據包數目後,就停止進行捕獲操作
-C FILE_SIZE
 與 -w FILE 選項配合使用。該選項使得 tcpdump 在把原始數據包直接保存到文件中之前,檢查此文件大小是否超過 file-size。如果超過了,將關閉此文件,另創一個文件繼續保存原始數據包。新創建的文件名與 -w 選項指定的文件名一致, 但文件名後多了一個數字,該數字會從1開始隨着新創建文件的增多而增加。file-size的單位是百萬字節(nt: 這裏指1,000,000個字節,並非1,048,576個字節, 後者是以1024字節爲1k, 1024k字節爲1M計算所得, 即1M=1024*1024 =1,048,576)
-d
 把編譯過的數據包編碼轉換成可閱讀的格式,並傾倒到標準輸出
-dd
 把編譯過的數據包編碼轉換成C語言的格式,並傾倒到標準輸出
-ddd
 把編譯過的數據包編碼轉換成十進制數字的格式,並傾倒到標準輸出
-D, --list-interfaces
 打印系統中所有 tcpdump 可以在其上進行抓包的網絡接口。每一個接口會打印出數字編號, 相應的接口名字, 以及一個可能的網絡接口描述。其中網絡接口名字和數字編號可以用在tcpdump的-i [flag]選項(nt:把名字或數字代替flag), 來指定要在其上抓包的網絡接口。此選項在不支持接口列表命令的系統上很有用(nt: 比如, Windows 系統, 或缺乏 ifconfig -a 的UNIX系統); 接口的數字編號在windows 2000 或其後的系統中很有用, 因爲這些系統上的接口名字比較複雜, 而不易使用。如果tcpdump編譯時所依賴的libpcap庫太老,-D 選項不會被支持, 因爲其中缺乏 pcap_findalldevs()函數
-e
 每行打印輸出中將包括數據包的數據鏈路層頭部信息 
-f
 顯示外部的IPv4地址時(nt:foreign IPv4 addresses, 可理解爲非本機ip地址), 採用數字方式而不是名字。此選項是用來對付Sun公司的NIS服務器的缺陷(nt: NIS, 網絡信息服務, tcpdump 顯示外部地址的名字時會用到它提供的名稱服務): 此NIS服務器在查詢非本地地址名字時,常常會陷入無盡的查詢循環)。由於對外部(foreign)IPv4地址的測試需要用到本地網絡接口(nt: tcpdump 抓包時用到的接口)及其IPv4 地址和網絡掩碼. 如果此地址或網絡掩碼不可用, 或者此接口根本就沒有設置相應網絡地址和網絡掩碼(nt: linux 下的 'any' 網絡接口就不需要設置地址和掩碼, 不過此'any'接口可以收到系統中所有接口的數據包), 該選項不能正常工作。
-F FILE
 使用file文件作爲過濾條件表達式的輸入, 此時命令行上的輸入將被忽略
-G [rotate_seconds]
 類似於-C [file_size]命令選項,-C按文件大小來新建文件存儲數據包,-G則根據指定的時間週期,將監聽到的數據包寫入新的文件,新建的文件名由-w選項指定,並且文件名後接有時間串,時間串的格式由strftime(3)指定。如果沒有指定時間串的格式,新的文件將覆蓋舊的文件。如果與 -C 選項同時使用的話,文件名稱格式將是 file<count>。
-h,--help
 打印tcpdump的幫助信息和libpcap的版本信息。(nt:libpcap是unix/linux平臺下的網絡數據包捕獲函數包)
--version
 打印 tcpdump 和 libpcap 的 version
-i [interface],--interface=interface
 指定 tcpdump 需要監聽的接口。如果沒有指定,tcpdump 會從系統接口列表中搜尋編號最小的已配置好的接口(不包括 loopback 接口)。一但找到第一個符合條件的接口,搜尋馬上結束。
 在採用2.2版本或之後版本內核的Linux操作系統上, 'any'這個虛擬網絡接口可被用來接收所有網絡接口上的數據包(nt: 這會包括目的是該網絡接口的,也包括目的不是該網絡接口的)。需要注意的是如果真實網絡接口不能工作在'混雜模式'(promiscuous)下,則無法在'any'這個虛擬網絡接口上抓取其數據包。
 如果 -D 標誌被指定,tcpdump會打印系統中的接口編號,而該編號就可用於此處的 interface 參數
-l
 對標準輸出進行行緩衝(nt: 使標準輸出設備遇到一個換行符就馬上把這行的內容打印出來)
-L
 列出指定網絡接口所支持的數據鏈路層的類型後退出.(nt: 指定接口通過-i 來指定)
-n
 不把主機的網絡地址轉換成名字
-m MODULE
 通過 module 指定的 file 裝載 SMI 和 MIB 模塊(nt: SMI,Structure of Management Information, 管理信息結構;MIB, Management Information Base, 管理信息庫。可理解爲,這兩者用於SNMP(Simple Network Management Protoco)協議數據包的抓取。具體SNMP 的工作原理未知, 另需補充)。
 此選項可多次使用,從而爲tcpdump裝載不同的MIB模塊
-M SECRET
 如果 TCP 數據包(TCP segments)有TCP-MD5選項(在RFC 2385有相關描述), 則爲其摘要的驗證指定一個公共的密鑰 secret
-n
 不將地址(比如主機地址、端口號等)轉換到對應的名字
-N
 不要打印主機名的域名資格,比如打印 nic 而不是 nic.ddn.mil
-O,--no-optimize
 不啓用進行包匹配時所用的優化代碼. 當懷疑某些bug是由優化代碼引起的, 此選項將很有用
-p,--no-promiscuous-mode
 把網絡接口設置爲非'混雜'模式。但必須注意,在特殊情況下此網絡接口還是會以'混雜'模式來工作;從而 -p 的設與不設,不能當做以下選項的代名詞:'ether host {local-hw-add}''ether broadcast'(nt: 前者表示只匹配以太網地址爲host的包, 後者表示匹配以太網地址爲廣播地址的數據包
-q
 快速打印輸出,即打印很少的協議相關信息,從而輸出行都比較簡短
-r [file]
 從指定的文件讀取數據包,如果 file 爲 - 符號, 則tcpdump會從標準輸入中讀取包數據
-R
 設定tcpdump對ESP/AH數據包的解析按照RFC1825而不是RFC1829(nt:AH:認證頭,ESP:安全負載封裝,這兩者會用在IP包的安全傳輸機制中)。如果此選項被設置,tcpdump將不會打印出'禁止中繼'(nt: relay prevention field)。另外,由於ESP/AH規範中沒有規定ESP/AH數據包必須擁有協議版本號域,所以tcpdump不能從收到的ESP/AH數據包中推導出協議版本號
-s, --snapshot-length=SNAPLEN
 設置 tcpdump 的數據包抓取長度爲 SNAPLEN,而不是默認的 262144 字節。如果產生包截短這種情況, tcpdump的相應打印輸出行中會出現''[|proto]''的標誌(proto 實際會顯示爲被截短的數據包的相關協議層次). 需要注意的是, 採用長的抓取長度(nt: snaplen比較大), 會增加包的處理時間, 並且會減少tcpdump 可緩存的數據包的數量, 從而會導致數據包的丟失. 所以, 在能抓取我們想要的包的前提下, 抓取長度越小越好。把snaplen 設置爲0意味着讓tcpdump自動選擇合適的長度來抓取數據包
-S,--absolute-tcp-sequence-numbers
 打印 TCP 數據包的順序號時, 使用絕對的順序號, 而不是相對的順序號.(nt: 相對順序號可理解爲, 相對第一個TCP 包順序號的差距,比如, 接受方收到第一個數據包的絕對順序號爲232323, 對於後來接收到的第2個,第3個數據包, tcpdump會打印其序列號爲1, 2分別表示與第一個數據包的差距爲1 和 2. 而如果此時-S 選項被設置, 對於後來接收到的第2個, 第3個數據包會打印出其絕對順序號:232324, 232325)
-t
 在每行輸出中不打印時間戳
-tt
 不對每行輸出的時間進行格式處理(nt: 這種格式一眼可能看不出其含義, 如時間戳打印成1261798315)
-ttt
 tcpdump 輸出時, 每兩行打印之間會延遲一個段時間,單位毫秒
-tttt
 在每行打印的時間戳之前添加日期的打印
-ttttt
 設置每一行輸出時相對於第一行的時間間隔,單位毫秒
-T TYPE
 強制 tcpdump 按 type 指定的協議所描述的包結構來分析收到的數據包。目前已知的type可取的協議爲:
 (1)aodv(Ad-hoc On-demand Distance Vector protocol, 按需距離向量路由協議, 在Ad hoc(點對點模式)網絡中使用);
 (2)cnfp(Cisco  NetFlow  protocol);
 (3)rpc(Remote Procedure Call);
 (4)rtp(Real-Time Applications protocol);
 (5)rtcp(Real-Time Applications con-trol protocol);
 (6)snmp(Simple Network Management Protocol);
 (7)tftp(Trivial File Transfer Protocol, 碎文件協議);
 (8)vat(Visual Audio Tool,可用於在internet上進行電視電話會議的應用層協議), 以及wb(distributed White Board,可用於網絡會議的應用層協議)
-u
 打印出未加密的 NFS 句柄(nt:handle可理解爲NFS中使用的文件句柄, 這將包括文件夾和文件夾中的文件)
-U
 使得當 tcpdump 在使用 -w 選項時,其文件寫入與包的保存同步。(nt:即當每個數據包被保存時, 它將及時被寫入文件中,而不是等文件的輸出緩衝已滿時才真正寫入此文件)。-U標誌在老版本的libpcap庫(nt:tcpdump所依賴的報文捕獲庫)上不起作用, 因爲其中缺乏pcap_cump_flush()函數
-v
 產生詳細的輸出。比如包的生存時間、標識、總長度以及IP包的一些選項。這也會打開一些附加的包完整性檢測, 比如對IP或ICMP包頭部的校驗和
-vv
 產生比-v更詳細的輸出。比如NFS(Network File System)迴應包中的附加域將會被打印,SMB(Server Message Block)數據包也會被完全解碼
-vvv
 更詳細的輸出。例如,telent時所使用的SB,SE選項將會被打印, 如果telnet同時使用-X圖形界面選項,其相應的圖形選項將會以16進制的方式打印出。
-w FILE
 把包數據直接寫入文件而不進行分析和打印輸出,這些包數據可在隨後通過-r選項來重新讀入並進行分析和打印
-W FILECOUNT
 此選項與 -C 選項配合使用,這將限制可打開的文件數目, 並且當文件數據超過這裏設置的限制時, 依次循環替代之前的文件, 這相當於一個擁有filecount 個文件的文件緩衝池。同時,該選項會使得每個文件名的開頭會出現足夠多並用來佔位的0,可以方便這些文件被正確的排序

-x:打印每個包的頭部數據, 同時會以16進制打印出每個包的數據(但不包括連接層的頭部),總共打印的數據大小不會超過整個數據包的大小與snaplen 中的最小值。必須要注意的是, 如果高層協議數據沒有snaplen這麼長,並且數據鏈路層(比如,Ethernet層)有填充數據, 則這些填充數據也會被打印

-xx:打印每個包的頭部數據, 同時會以16進制打印出每個包的數據, 其中包括數據鏈路層的頭部

-X:當分析和打印時, tcpdump會打印每個包的頭部數據,同時會以16進制和ASCII碼形式打印出每個包的數據(但不包括鏈路層的頭部)。這對於分析一些新協議的數據包很方便

-XX:當分析和打印時,tcpdump會打印每個包的頭部數據,同時會以16進制和ASCII碼形式打印出每個包的數據, 其中包括數據鏈路層的頭部.這對於分析一些新協議的數據包很方便

-y [datalinktype],--linktype=datalinktype:設置tcpdump只捕獲數據鏈路層協議類型是datalinktype的數據包

-z [postrotate-command]:與-C或-G聯用,當每一個文件被關閉時執行命令postrotate-command。比如,-z gzip或-z bzip2將對每一個保存的文件進行壓縮
-Z , --relinquish-privileges=USER
 使 tcpdump 放棄自己的超級權限(如果以 root 用戶啓動 tcpdump,tcpdump 將會有超級用戶權限),並把當前 tcpdump 的用戶 ID 設置爲 USER,組 ID 設置爲 USER 屬組的 ID
expression
 條件表達式用於選擇捕獲符合條件的數據包,無 expression,網絡上任何兩臺主機間的所有數據包都將被截獲

4. 常用示例

4.1 監視指定主機的數據包

(1)打印所有到達或從主機 sunrise 發出的數據包,host 可以是 IP 地址或主機名。

tcpdump host sunrise

(2)打印主機 A 與 B 或 C 之間來往的所有數據包。

tcpdump host A and \( B or C \)

(3)打印 ace 與任何其他主機之間通信的 IP 數據包,但不包括與 helios 之間的數據包.

tcpdump ip host ace and not helios

4.2 監視指定網絡的數據包

(1)打印本地主機與 Berkeley 網絡上的主機之間的所有通信數據包。

tcpdump net ucb-ether

(2)打印所有通過網關 snup 的 ftp 數據包。注意,表達式被單引號括起來了,這可以防止 Shell 對其中的括號進行錯誤解析。

tcpdump 'gateway snup and (port ftp or ftp-data)'

(3)打印不是本地網絡的數據包。

tcpdump ip and not net localnet

4.3 監視指定協議的數據包

(1)打印 TCP 會話中的的開始和結束數據包,並且數據包的源或目的不是本地網絡上的主機。(nt:localnet,實際使用時要真正替換成本地網絡的名字)

tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'

(2)打印長度超過 576 字節,並且網關地址是 snup 的 IP 數據包。

tcpdump 'gateway snup and ip[2:2] > 576'

ip[2:2] 表示整個 IP 數據包的長度。

(3)打印除’echo request’或者’echo reply’類型以外的 ICMP 數據包(比如,需要打印所有非 ping 程序產生的數據包時可用到此表達式 。(nt: ‘echo reuqest’ 與 ‘echo reply’ 這兩種類型的 ICMP 數據包通常由 ping 程序產生)

tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

4.4 監視指定主機和端口的數據包

(1)抓取主機 100.94.138.110 所有經由接口 eth1 接收的數據包,且端口號是 20700。

tcpdump -i eth1 -lnXps0 dst 100.94.138.110 and dst port 20700 -c 10

命令選項說明:lnXps0 請參照上文的命令選項詳解,-c 10 表示只捕捉 10 個數據包。


參考文檔

[1] tcpdump manual 

[2] 維基百科. tcpdump 

[3] tcpdump 官方網站 

[4] Linux tcpdump 命令詳解

轉自:戀貓大鯉魚

https://dablelv.blog.csdn.net/article/details/71587943

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/m02EcN9dRhbMtUzQi1u-Bw