tcpdump 網路封包分析入門 文章首圖

tcpdump 網路封包分析入門

tcpdump 網路封包分析入門

在 Linux 系統管理與網路除錯的領域中,tcpdump 無疑是最具威力的瑞士刀之一。它不僅能即時捕捉網路介面上的資料包,更能將二進位的封包資料轉譯為人類可讀的格式。對於開發者、系統管理員或是資安工程師而言,掌握 tcpdump 是深入理解網路通訊機制、排查連線問題以及分析流量異常的關鍵技能。

這篇文章將帶領讀者從基礎安裝開始,逐步深入 tcpdump 的核心語法與實用範例,幫助你在 Ubuntu 22.04 或 Debian 12 環境中,輕鬆應對各種網路診斷場景。

安裝與基本環境確認

在開始之前,請確保你的系統已安裝 tcpdump。在 Debian 系發行版中,你可以透過以下指令安裝:

sudo apt update
sudo apt install tcpdump

安裝完成後,我們需要先確認網路介面名稱。通常主要介面為 eth0(實體網卡)或 ens33enp0s3 等動態名稱,虛擬介面則包含 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: 為什麼我捕捉不到任何封包?

這通常有兩個原因:

  1. 權限不足tcpdump 需要 root 權限才能存取網路介面。請務必加上 sudo
  2. 介面錯誤:你可能在虛擬介面(如 docker0veth)上捕捉,但流量實際上發生在實體介面(如 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 過濾語法,你將能迅速定位網路瓶頸、驗證防火牆規則或調查資安事件。建議讀者多在測試環境中練習不同條件的組合,將能大幅提升日常运维的效率。