[Linux] Tcpdump 擷取封包指令範例教學


tcpdump 是一款可以錄製網路封包的利器,有在研究網路封包內容的人應該不陌生,我個人覺得它的優點是易安裝、容易使用,只要簡單的幾個指令、參數就可以由指定的網卡中擷取封包,算是一個非實用的工具,當然,我知道一般人是不會用到這種工具的,但對學生、網路工程師等相關領域的人來說,那就不能不知道這款工具的用法了,在本文中,將透過範例來讓大家了解這套工具。

tcpdump 指令參數

官方網站:tcpdumptcpdump man page
本文示範OS:Ubuntu 18.04 Server 英文版

tcpdump 安裝

這工具很常見,直接使用 aptapt-get 進行安裝即可:

sudo apt-get install -y tcpdump

參數與過濾條件說明

在進入範例說明前,我們先了解一下基本的參數和過濾條件 (參數蠻多的,有缺的話後續有空再補上囉)

參數 or 過濾條件 說明 範例
-i interface 指定網卡名稱 -i ens33
-c count 指定欲監聽的封包數,到達指定數目後即會停止 -c 100
-C file_size -w做搭配,指定錄製的每個檔案的大小,單位是採用1MB (1,000,000 bytes),到達指定的檔案大小後,會自動再產生新檔,新檔名則會加上數字來疊加,例如:test.pcap、test.pcap1、test.pcap2…以此類推 -C 1
-Q in|out|inout 選擇要擷取封包的傳輸方向,支援in(接收)、out(發送)、inout(雙向)等方向,注意,並非所有的平台都支援此參數 -Q inout
-w file 將擷取的封包存成檔案 -w demo.pcap
-W filecount -C做搭配,來限制由-c所產出的檔案數(請注意大小寫),當錄製的檔案數超過指定的數目時,則會以輪替的方式覆蓋舊檔,可參考下面之範例7 -W 3
-r file 從指定的檔案讀取封包檔,該封包檔為-w參數所產生 -r demo.pcap
-G rotate_seconds 類似於-C參數,-C是按檔案大小來限制,而-G則是依擷取的秒數來控制檔案。
註:在封包數不多的情況下,會發生-G的秒數到達時,不會自動停止的情況,不要太依靠此參數
-G 10 (10秒一個檔案)
-nn 用IP及Port來顯示主機名稱 tcpdump -i ens33 -nn
-q 列出精簡的封包訊息 tcpdump -i ens33 -q
-v or -vv 輸出更多的詳細訊息 tcpdump -i ens33 -vv
host ip 指定主機名稱或IP host www.google.com 或 host 172.16.66.200,若沒有指定 src dst ,則預設為「來源」或「目的」二者皆可
port number 指定連結埠 port 1234,若沒有指定 src dst ,則預設為「來源」或「目的」二者皆可
src 指定來源 src host 172.16.66.200
dst 指定目的 dst host 172.16.66.200
and / or / not 邏輯運算:and (&&)、or (||)、not (!) host 172.16.66.200 or 172.16.66.188
tcp / udp / icmp / ip6 等協定 抓取 X 協定的流量封包,請參考範例4 tcp and host 172.16.66.200
portrange range 指定連接埠範圍 portrange 21-23
ether address 指定主機的MAC Address ether host 16:69:44:e3:01:57
net network 指定特定網段 net 192.16.66.100 或 net 192.16.66.0/24
() 支援小括號,可以搭配跳脫符號 \ 或使用單引號使用,可參考下方範例10。(可多利用單引號) \(dst port 443 or 22\) 或 ‘(dst port 443 or 22)’

實務範例

其實tcpdump在網路上的教學也很多,我也沒寫的比別人好,所以這篇文章會以我自己常用到的或者覺得比較有用的指令、參數來進行範例說明,由範例入門會比較快且有感,同時,我也建議讀一下官方的「Man Page」,裡面有很多實用的範例可以參考。


範例1

監聽網卡名稱ens33的流量,抓取HOST IP = 172.16.66.188 且 PORT = 80 的封包 (HOST、IP不指定來源或目的)

tcpdump -i ens33 host 172.16.66.188 and port 80
範例2

監聽網卡名稱ens33的流量,抓取HOST IP = 172.16.66.188 或 HOST IP = 172.16.66.200 的封包 (HOST不指定來源或目的)

tcpdump -i ens33 host 172.16.66.188 or host 172.16.66.200
或 tcpdump -i ens33 host 172.16.66.188 or 172.16.66.200
範例3

監聽網卡名稱ens33的流量,抓取來源IP = 172.16.66.188 且 目的IP = 172.16.66.200 的封包

tcpdump -i ens33 src host 172.16.66.188 and dst host 172.16.66.200
範例4

監聽網卡名稱ens123的流量,抓取TCP協定的封包,且 HOST = 172.16.66.188 以及連接埠的範圍為 21 ~ 23 (HOST不指定來源或目的)

tcpdump -i ens123 tcp and host 172.16.66.188 and portrange 21-23
範例5

監聽網卡名稱ens123的流量,其來源主機 MAC Address = 16:69:44:e3:01:57 的封包,並輸出詳細資訊

tcpdump -i ens123 ether src host 16:69:44:e3:01:57 -vv
範例6

監聽網卡名稱ens123的流量,將其流量內容輸出至檔案demo.pcap,檔案以1M大小為上限,如果滿1M則另外產生新檔來保存封包,新檔名的命名會變成demo.pcap、demo.pcap1、demo.pcap2…以此類推

tcpdump -i ens123 -C 1 -w demo.pcap
範例7

監聽網卡名稱ens123的流量,將其流量內容輸出至檔案demo.pcap,檔案以1M大小為上限且最多產生3個檔案,若流量太多導致3個檔案不夠存放,則會以輪替的方式將舊檔覆蓋,以保持指定的檔案數

tcpdump -i ens123 -C 1 -W 3 -w demo.pcap
範例8

監聽網卡名稱ens123的流量,每擷取5秒鐘的封包資訊便存成一個檔案。因此在封包數不多的情況下,-G的參數並不會依秒數自動停止,有時會利用 timeout seconds 的方式來使之停止擷取封包

tcpdump -i ens123 -G 5 -w demo.pcap
利用timeout來停止錄製:timeout 5 tcpdump -i ens33 -w demo.pcap
範例9

監聽網卡名稱ens123的流量,且目的IP為192.16.66.0/24這個網段

tcpdump -i ens123 dst net 192.16.66.0/24
範例10

監聽網卡名稱ens123的流量,其來源主機為192.16.66.5,且目的連接埠為443或22

tcpdump -i ens123 src host 192.16.66.5 and \(dst port 443 or 22\)
或 tcpdump -i ens123 src host 192.16.66.5 and '(dst port 443 or 22)'
或 tcpdump -i ens123 'src host 192.16.66.5 and (dst port 443 or 22)'

小結:tcpdump在監控網路流量上是個蠻強大的工具,相對來說指令也多,本文僅提供一些我自己比較常用到的指令給大家參考,若範例上有錯也請留言告之,事實上,tcpdump還有蠻多進階的指令,想要更深入研究的讀者,可以觀看官方的文件說明。

延伸閱讀:
[Linux] vnStat 網路流量監控工具使用教學
[Linux] Ubuntu 如何利用 Netplan 設定 固定IP