跳轉到內容

OpenWrt 實時抓包完全指南:tcpdump 與 Wireshark 實戰教程

在網絡管理和故障排查中,數據包捕獲(Packet Capture)是一項核心技能。OpenWrt 作為功能強大的開源路由器系統,內置了專業的抓包工具 tcpdump,配合桌面端的 Wireshark 分析軟件,可以實現從數據採集到深度分析的完整工作流。

本文將詳細介紹在 OpenWrt 環境中進行實時抓包的完整流程,包括環境準備、命令行參數詳解、高級過濾技巧以及實際應用場景。

什麼是 tcpdump?

tcpdump 是一個運行在類 Unix 系統上的命令行網絡數據包分析工具。它能夠攔截和顯示通過網絡接口的 TCP/IP 數據包,支持多種輸出格式和複雜的過濾表達式。

tcpdump 的核心優勢

  • 輕量級:佔用資源極少,適合在嵌入式設備(如路由器)上運行
  • 功能強大:支持 Berkeley Packet Filter (BPF) 語法,可實現精確的流量篩選
  • 實時性:可實時輸出數據包信息,也可保存到文件供後續分析
  • 廣泛兼容:生成的 pcap 文件格式被 Wireshark、tshark 等主流工具原生支持

軟件準備

1. OpenWrt 安裝 Tcpdump

在 OpenWrt 系統中,tcpdump 通常需要通過 opkg 包管理器安裝。根據您的存儲需求和功能要求,可以選擇完整版或精簡版。

方法一:安裝完整版 tcpdump(推薦)

bash
# 更新軟件包列表
opkg update

# 安裝完整版 tcpdump
opkg install tcpdump

注意:完整版 tcpdump 包含所有功能模塊,文件大小約 500KB,適合存儲空間充足的設備。

方法二:安裝精簡版 tcpdump-mini

如果設備存儲空間有限,可以安裝精簡版本:

bash
opkg update
opkg install tcpdump-mini

提示:tcpdump-mini 去除了部分高級功能,但保留了核心抓包能力,文件大小僅約 100KB。

驗證安裝

安裝完成後,執行以下命令驗證是否成功:

bash
tcpdump --version

如果顯示版本信息,說明安裝成功。

2. 安裝 Wireshark 和終端工具

為了在本地計算機上實時查看和分析從 OpenWrt 傳來的數據包,您需要安裝以下工具:

Windows 用戶額外準備

對於 Windows 用戶,還需要下載 Plink(PuTTY Link),它是 PuTTY 套件中的命令行工具,用於建立 SSH 隧道傳輸數據流。

下載地址:PuTTY 官方下載頁面

下載後,將 plink.exe 放置在系統 PATH 環境變量中,或記住其完整路徑以便後續使用。

實時抓包原理

實時抓包的核心思想是通過 SSH 隧道將 OpenWrt 設備上 tcpdump 捕獲的數據流直接傳輸到本地運行的 Wireshark 中,實現"邊抓邊看"的效果,無需先保存文件再導入。

工作流程如下:

OpenWrt (tcpdump) → SSH 加密通道 → 本地計算機 (Wireshark)

這種方式的優點包括:

  • 即時反饋:無需等待抓包完成,可立即看到數據包
  • 節省存儲:不佔用路由器存儲空間
  • 靈活控制:可隨時停止抓包,Wireshark 自動結束會話

實時抓包操作步驟

基礎命令結構

實時抓包的基本命令格式如下:

bash
plink.exe -batch -ssh -pw [密碼] [用戶名]@[IP地址] "tcpdump [參數]" | "[Wireshark路徑]" -k -i -

參數詳解

參數說明示例
-batch禁用交互提示,適合腳本化執行必須
-ssh使用 SSH 協議連接必須
-pwSSH 登錄密碼-pw 123456
[用戶名]@[IP地址]OpenWrt 設備的登錄憑證root@192.168.1.1
-nitcpdump 參數:不解析主機名和端口號,提升性能推薦
-s 0tcpdump 參數:捕獲完整數據包(默認只抓前 68-96 字節)推薦
-w -tcpdump 參數:將數據輸出到標準輸出(stdout)必須
not port 22BPF 過濾表達式:排除 SSH 流量,避免循環捕獲強烈推薦
-kWireshark 參數:立即開始捕獲必須
-i -Wireshark 參數:從標準輸入讀取數據必須

完整實戰命令

場景一:Windows 系統(CMD)

重要提示

Windows 實測只能使用 命令提示符(cmd) 執行此命令,PowerShell 可能因管道處理機制不同而失敗。

cmd
plink.exe -batch -ssh -pw 123456 root@192.168.1.1 "tcpdump -ni br-lan -s 0 -w - not port 22" | "D:\Program Files\Wireshark\Wireshark.exe" -k -i -

參數說明:

  • -pw 123456:OpenWrt 的 SSH 登錄密碼(請替換為您的實際密碼)
  • root@192.168.1.1:OpenWrt 的用戶名和 IP 地址
  • -ni br-lan:監聽橋接 LAN 接口(大多數 OpenWrt 的默認配置)
  • "D:\Program Files\Wireshark\Wireshark.exe":Wireshark 的安裝路徑(根據實際情況修改)

場景二:macOS / Linux 系統

在 macOS 或 Linux 上,可以使用原生的 ssh 命令替代 plink:

bash
ssh root@192.168.1.1 "tcpdump -ni br-lan -s 0 -w - not port 22" | wireshark -k -i -

前提條件:確保已安裝 Wireshark 並將其添加到系統 PATH 中。macOS 用戶可通過 Homebrew 安裝:brew install --cask wireshark

場景三:捕獲特定接口

如果您的 OpenWrt 有多個網絡接口,可以根據需要選擇:

bash
# 捕獲 WAN 口流量(通常是 eth0 或 pppoe-wan)
tcpdump -ni eth0 -s 0 -w - not port 22

# 捕獲無線接口流量
tcpdump -ni wlan0 -s 0 -w - not port 22

# 同時捕獲多個接口(需要 tcpdump 支持)
tcpdump -ni any -s 0 -w - not port 22

高級過濾表達式

tcpdump 支持強大的 Berkeley Packet Filter (BPF) 語法,以下是一些實用的過濾示例:

按協議過濾

bash
# 僅捕獲 HTTP 流量(端口 80)
tcpdump -ni br-lan 'tcp port 80' -s 0 -w -

# 捕獲 HTTPS 流量(端口 443)
tcpdump -ni br-lan 'tcp port 443' -s 0 -w -

# 捕獲 DNS 查詢(UDP 端口 53)
tcpdump -ni br-lan 'udp port 53' -s 0 -w -

# 捕獲 ICMP(ping)流量
tcpdump -ni br-lan 'icmp' -s 0 -w -

按 IP 地址過濾

bash
# 捕獲特定主機的所有流量
tcpdump -ni br-lan 'host 192.168.1.100' -s 0 -w -

# 捕獲特定網段的流量
tcpdump -ni br-lan 'net 192.168.1.0/24' -s 0 -w -

# 排除特定 IP
tcpdump -ni br-lan 'not host 192.168.1.1' -s 0 -w -

組合過濾條件

bash
# 捕獲來自特定 IP 的 HTTP 流量
tcpdump -ni br-lan 'src 192.168.1.100 and tcp port 80' -s 0 -w -

# 捕獲除 SSH 外的所有 TCP 流量
tcpdump -ni br-lan 'tcp and not port 22' -s 0 -w -

# 捕獲特定端口的 UDP 流量
tcpdump -ni br-lan 'udp portrange 5000-6000' -s 0 -w -

離線抓包模式

如果實時抓包不可行(例如網絡不穩定或需要長時間監控),可以採用離線模式:先將數據包保存到文件,再傳輸到本地分析。

步驟一:在 OpenWrt 上抓包並保存

bash
# 基本抓包命令
tcpdump -ni br-lan -s 0 -w /tmp/capture.pcap

# 限制抓包數量(例如只抓 1000 個包)
tcpdump -ni br-lan -s 0 -c 1000 -w /tmp/capture.pcap

# 按文件大小分割(每 10MB 一個文件)
tcpdump -ni br-lan -s 0 -C 10 -w /tmp/capture.pcap

# 按時間分割(每 5 分鐘一個文件)
tcpdump -ni br-lan -s 0 -G 300 -w /tmp/capture_%Y%m%d_%H%M%S.pcap

步驟二:將文件傳輸到本地

方法一:使用 SCP(推薦)

bash
scp root@192.168.1.1:/tmp/capture.pcap ./capture.pcap

方法二:使用 SFTP

bash
sftp root@192.168.1.1
sftp> get /tmp/capture.pcap
sftp> exit

方法三:通過 Web 界面下載

如果 OpenWrt 安裝了 LuCI 或 iStoreOS,可以通過網頁文件管理器直接下載 /tmp/capture.pcap 文件。

步驟三:在 Wireshark 中打開

啟動 Wireshark,選擇 File → Open,找到下載的 .pcap 文件即可開始分析。

Wireshark 深度分析技巧

將數據包導入 Wireshark 後,可以利用其強大的分析功能進行深入排查。

1. 應用顯示過濾器

Wireshark 的顯示過濾器比 tcpdump 的捕獲過濾器更靈活,可以在已捕獲的數據中進行二次篩選:

http                    # 僅顯示 HTTP 協議
dns                     # 僅顯示 DNS 查詢
ip.addr == 192.168.1.100  # 特定 IP 的流量
tcp.port == 443         # 特定端口的流量
http.request.method == "GET"  # HTTP GET 請求

2. 追蹤數據流

右鍵點擊任意數據包,選擇 Follow → TCP Stream(或 UDP/HTTP Stream),可以查看完整的會話內容,非常適合調試 HTTP 請求和響應。

3. 統計分析

  • Protocol Hierarchy:Statistics → Protocol Hierarchy,查看各協議的流量佔比
  • Conversations:Statistics → Conversations,分析主機間的通信情況
  • Endpoints:Statistics → Endpoints,列出所有通信端點及其流量統計

4. 著色規則

Wireshark 默認使用顏色區分不同類型的流量:

  • 淺紫色:TCP 流量
  • 淺藍色:UDP 流量
  • 黑色背景紅色文字:錯誤或有問題的數據包
  • 綠色:HTTP 流量

您可以在 View → Coloring Rules 中自定義這些規則。

常見網絡故障排查場景

場景一:網頁無法訪問

排查步驟:

  1. 捕獲 DNS 流量,確認域名解析是否正常:

    bash
    tcpdump -ni br-lan 'udp port 53' -s 0 -w /tmp/dns.pcap
  2. 在 Wireshark 中檢查是否有 DNS 響應,以及解析的 IP 是否正確

  3. 捕獲 HTTP/HTTPS 流量,檢查 TCP 握手是否成功:

    bash
    tcpdump -ni br-lan 'tcp port 80 or tcp port 443' -s 0 -w /tmp/web.pcap
  4. 查看是否有 TCP Retransmission(重傳)或 Connection Reset(連接重置)

場景二:網速緩慢

排查步驟:

  1. 捕獲所有流量,觀察是否有異常的大量數據包:

    bash
    tcpdump -ni br-lan -s 0 -w /tmp/slow.pcap
  2. 在 Wireshark 中使用 Statistics → IO Graphs 查看流量趨勢

  3. 檢查是否有大量的廣播包或 ARP 請求,可能表明存在網絡環路或 ARP 欺騙

  4. 分析 TCP Window Size,過小可能導致吞吐量下降

場景三:特定設備無法聯網

排查步驟:

  1. 針對該設備的 IP 地址進行抓包:

    bash
    tcpdump -ni br-lan 'host 192.168.1.XXX' -s 0 -w /tmp/device.pcap
  2. 檢查 DHCP 請求和響應是否正常

  3. 查看是否有正確的網關和 DNS 配置

  4. 測試 ping 網關和外部地址,觀察 ICMP 流量

常見問題與解決方案

問題一:權限被拒絕

現象:

tcpdump: br-lan: Permission denied

解決方案:

  • 確保以 root 用戶身份登錄 OpenWrt
  • 檢查 tcpdump 是否具有執行權限:ls -l /usr/sbin/tcpdump
  • 如有必要,重新安裝:opkg reinstall tcpdump

問題二:存儲空間不足

現象:

tcpdump: /tmp/capture.pcap: No space left on device

解決方案:

  1. 檢查可用空間:df -h /tmp
  2. 使用 -C 參數限制單個文件大小
  3. 定期清理舊的抓包文件:rm /tmp/*.pcap
  4. 如果設備有 USB 存儲,掛載後保存到外部存儲

問題三:抓包影響網絡性能

現象: 抓包過程中網絡延遲增加或丟包

解決方案:

  1. 使用更精確的過濾表達式,減少捕獲的數據量
  2. 避免在生產高峰期進行全量抓包
  3. 使用 -s 參數限制捕獲長度(如果不需要完整數據包)
  4. 監控系統負載:tophtop

問題四:Wireshark 無法接收數據

現象: 命令執行後 Wireshark 沒有反應

解決方案:

  1. 確認 Wireshark 路徑正確(Windows 用戶特別注意)
  2. 嘗試先在 OpenWrt 上單獨運行 tcpdump 命令,確認能正常輸出
  3. 檢查防火牆是否阻止了 SSH 連接
  4. Windows 用戶使用 CMD 而非 PowerShell

問題五:捕獲不到預期流量

現象: 抓包文件中沒有目標數據包

解決方案:

  1. 確認選擇了正確的網絡接口(br-laneth0wlan0 等)
  2. 檢查過濾表達式是否正確,可先不使用過濾器測試
  3. 確認流量確實經過該接口(旁路由模式下可能需要調整)
  4. 使用 tcpdump -ni any 捕獲所有接口進行排查

最佳實踐建議

1. 安全注意事項

  • 不要在公共網絡上暴露 SSH 密碼:建議使用 SSH 密鑰認證替代密碼
  • 敏感數據脫敏:抓包文件可能包含明文密碼和個人信息,分享前務必審查
  • 遵守法律法規:僅在您擁有管理權限的網絡上進行抓包操作

2. 性能優化

  • 精確過濾:儘量在捕獲階段就過濾掉無關流量,減輕後續分析負擔
  • 合理設置緩衝區:對於高速網絡,可增加 tcpdump 的緩衝區大小
  • 分段抓包:長時間監控時使用 -G-C 參數分段保存

3. 文檔記錄

  • 記錄抓包時間:便於後續關聯其他日誌
  • 標註關鍵事件:在抓包期間記錄重要操作的時間點
  • 保存命令歷史:記錄使用的 tcpdump 命令和過濾條件

4. 學習資源

總結

掌握 OpenWrt 實時抓包技術,能夠顯著提升網絡故障排查的效率和專業度。通過本文介紹的 tcpdump 與 Wireshark 組合方案,您可以:

快速定位網絡問題:從數據包層面理解網絡行為
深入分析協議交互:理解 HTTP、DNS、TCP 等協議的工作原理
優化網絡性能:識別瓶頸和異常流量
增強安全意識:檢測潛在的網絡攻擊和異常行為

建議您在實際環境中多加練習,逐步熟悉各種過濾表達式和 Wireshark 分析技巧。隨著經驗的積累,您將能夠更高效地解決複雜的網絡問題。

網絡數據包分析可視化

延伸閱讀:如果您對 OpenWrt 的其他高級功能感興趣,可以查看我們的 DDNS 設置指南IPv6 關閉教程 以及 iStoreOS 插件推薦

最後更新於: