「 tcpdump 」是一款可以錄製網路封包的利器,有在研究網路封包內容的人應該不陌生,我個人覺得它的優點是易安裝、容易使用,只要簡單的幾個指令、參數就可以由指定的網卡中擷取封包,算是一個非實用的工具,當然,我知道一般人是不會用到這種工具的,但對學生、網路工程師等相關領域的人來說,那就不能不知道這款工具的用法了,在本文中,將透過範例來讓大家了解這套工具。
官方網站:tcpdump、tcpdump man page
本文示範OS:Ubuntu 18.04 Server 英文版
tcpdump 安裝
這工具很常見,直接使用
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 |
( 或 ) | 支援小括號,可以搭配跳脫符號 |
\(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的參數並不會依秒數自動停止,有時會利用
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