tcpdump 網路封包分析入門
在 Linux 系統管理與網路除錯的領域中,tcpdump 無疑是最具威力的瑞士刀之一。它不僅能即時捕捉網路介面上的資料包,更能將二進位的封包資料轉譯為人類可讀的格式。對於開發者、系統管理員或是資安工程師而言,掌握 tcpdump 是深入理解網路通訊機制、排查連線問題以及分析流量異常的關鍵技能。
這篇文章將帶領讀者從基礎安裝開始,逐步深入 tcpdump 的核心語法與實用範例,幫助你在 Ubuntu 22.04 或 Debian 12 環境中,輕鬆應對各種網路診斷場景。
安裝與基本環境確認
在開始之前,請確保你的系統已安裝 tcpdump。在 Debian 系發行版中,你可以透過以下指令安裝:
sudo apt update
sudo apt install tcpdump
安裝完成後,我們需要先確認網路介面名稱。通常主要介面為 eth0(實體網卡)或 ens33、enp0s3 等動態名稱,虛擬介面則包含 lo (loopback) 或 docker0。你可以使用 ip a 指令查看:
ip a
核心語法與常用選項解析
tcpdump 的指令結構大致為:tcpdump [選項] [過濾條件]。理解過濾條件(BPF 語法)是使用的關鍵。
1. 基礎捕捉與指定介面
若你想捕捉所有進出特定網卡的流量,可以加上 -i 參數指定介面。若省略此參數,預設會捕捉第一個非 loopback 的活躍介面。
# 捕捉 eth0 介面上所有流量,並顯示詳細資訊
sudo tcpdump -i eth0 -nn -v
這裡引入了兩個重要選項:
-nn:不將 IP 地址解析為主機名,也不將埠號解析為服務名稱。這能大幅提升效能並避免 DNS 查詢延遲,是除錯時的推薦用法。-v:增加輸出詳細程度,顯示 TTL、總長度等更多欄位。
2. 精準過濾:IP、Port 與協議
單純捕捉所有流量會產生海量資料,因此過濾條件至關重要。
依 IP 過濾 捕捉來源或目的 IP 為特定地址的封包:
# 捕捉來源 IP 為 192.168.1.100 的所有封包
sudo tcpdump -i eth0 -nn 'host 192.168.1.100'
# 捕捉與 8.8.8.8 通訊的所有封包(包含來源與目的)
sudo tcpdump -i eth0 -nn 'host 8.8.8.8'
依 Port 過濾 這是除錯 Web 服務或資料庫連線最常用的技巧。
# 捕捉所有涉及 Port 80 (HTTP) 的流量
sudo tcpdump -i eth0 -nn 'port 80'
# 捕捉來源 Port 為 443 的封包
sudo tcpdump -i eth0 -nn 'src port 443'
依協議過濾 除了 TCP 和 UDP,也可以過濾 ICMP(ping)或其他協議。
# 僅捕捉 ICMP 封包(例如 ping 指令的流量)
sudo tcpdump -i eth0 -nn 'icmp'
3. 實戰範例:捕捉特定組合條件
實際除錯時,我們常需要多個條件同時成立。tcpdump 支援 and (&&)、or (||)、not (!) 等邏輯運算。
# 捕捉來源 IP 為 192.168.1.50,且目的埠為 3306 (MySQL) 的 TCP 封包
sudo tcpdump -i eth0 -nn 'host 192.168.1.50 and tcp dst port 3306'
進階技巧:儲存與讀取封包
當需要後續分析或離線檢視時,將封包儲存為檔案是必要步驟。tcpdump 支援將原始封包儲存為 .pcap 格式,此格式可被 Wireshark 等圖形化工具直接讀取。
# 將封包儲存至 capture.pcap 檔案,直到使用者按下 Ctrl+C 停止
sudo tcpdump -i eth0 -nn -w capture.pcap
儲存後,你可以使用 tcpdump 本身或 Wireshark 來讀取:
# 從檔案讀取封包並顯示摘要
sudo tcpdump -nn -r capture.pcap
常見問題與解決方案
在使用 tcpdump 時,新手常會遇到以下兩個問題:
Q1: 為什麼我捕捉不到任何封包?
這通常有兩個原因:
- 權限不足:
tcpdump需要 root 權限才能存取網路介面。請務必加上sudo。 - 介面錯誤:你可能在虛擬介面(如
docker0或veth)上捕捉,但流量實際上發生在實體介面(如eth0)。請使用ip a確認正確的介面名稱,或省略-i讓系統自動選擇。
Q2: 為什麼輸出結果中有許多我不需要的雜訊?
預設的捕捉會包含 ARP、ICMP 廣播等基礎協定流量。若只想關注特定服務(如 SSH),請務必使用嚴格的過濾條件:
# 錯誤示範:捕捉所有流量
sudo tcpdump -i eth0
# 正確示範:僅捕捉 SSH 連線
sudo tcpdump -i eth0 -nn 'tcp port 22'
小結
tcpdump 雖然命令列介面看似冷硬,但其強大的過濾引擎與低資源佔用特性,使其成為 Linux 系統除錯不可或缺的工具。透過熟練運用 -i、-nn、-w 等選項,以及精準撰寫 BPF 過濾語法,你將能迅速定位網路瓶頸、驗證防火牆規則或調查資安事件。建議讀者多在測試環境中練習不同條件的組合,將能大幅提升日常运维的效率。