高級網工必備! Tcpdump 抓包神器從入門到實戰全攻略

為了更好的分析網絡,常見客戶機的Windows作業系統可以安裝Wireshark等抓包軟體抓取資料流進行分析。那麼伺服器常用的Linux等系統如何抓取介面封包分析網路呢?
本期將介紹高級網工必備工具—Tcpdump!
一、Tcpdump簡介
在網路維運中,Windows 用戶常用Wireshark 抓包,那Linux 伺服器該如何分析網路流量?今天揭秘高級網工的「瑞士軍刀」-Tcpdump,從安裝到實戰全流程拆解,文末附避坑指南!
工具定位:為什麼網工必須掌握Tcpdump?
Tcpdump是類Unix 系統的王牌抓包工具,名字由「TCP 協定」和「資料匯出」組合而來。它基於libpcap 庫實時捕獲網路數據包,支援:
- 嗅探並保存流量數據
- 按協定/ 連接埠/ IP 精準過濾
- 產生pcap 文件供後續分析
適用場景:Linux、Solaris、BSD 等系統,Windows 版本為WinDump(需WinPcap 驅動)。
二、Tcpdump安裝介紹
在Linux作業系統中安裝tcpdump,你可以透過以下步驟進行:
- 開啟終端機:在Linux系統中,你可以透過點擊終端圖示或使用快速鍵(通常是Ctrl+Alt+T)來開啟終端機。
- 使用套件管理器安裝tcpdump:根據你的Linux發行版,選擇對應的套件管理器來安裝tcpdump。
以下是一些常見的發行版和對應的套件管理器:
- Ubuntu/Debian:使用apt-get指令安裝。在終端機中輸入以下命令並按下回車鍵:
sudo apt-get update
sudo apt-getinstall tcpdump
- 1.
- 2.
- CentOS/Fedora:使用yum指令安裝。在終端機中輸入以下命令並按下回車鍵:
sudo yum update
sudo yum install tcpdump
- 1.
- 2.
- Arch Linux:使用pacman指令安裝。在終端機中輸入以下命令並按下回車鍵:
sudo pacman -Sy tcpdump
- 1.
請注意,安裝過程中可能需要輸入管理員密碼進行確認。
- 等待安裝完成:安裝過程可能需要一些時間,系統會自動下載並安裝tcpdump及其依賴套件。
- 驗證安裝:安裝完成後,你可以透過在終端機中輸入以下命令來驗證安裝是否成功:
tcpdump --version
- 1.
如果輸出tcpdump的版本訊息,則表示安裝成功。
這樣,你就成功在Linux作業系統中安裝了tcpdump。接下來,你可以使用tcpdump指令來擷取和分析網路封包了。記得在使用tcpdump時,可能需要使用sudo或以root使用者身分執行以便取得足夠的權限來擷取封包。
三、Tcpdump基本用法
透過指令:tcpdump -help,可查看tcpdump工具指令選項:
Tcpdump的基本指令格式是: tcpdump [選項] [表達式]
- -a:將網路位址和廣播位址轉變成名字
- -A:以ASCII碼格式列印所有資料包,並將連結層的頭部最小化
- -B:用於設定作業系統捕捉緩衝大小
- -c:指定抓取封包的數量
- -C:此選項用於配合-w選項使用,如果保存文件大小超過閾值則關閉當前文件,並啟用新文件繼續保存數據(分多個固定大小的文件保存抓包數據,利於長期抓包的場景)
- -d 將匹配到的資料包以人們能夠理解的彙編格式輸出
- -dd:以C語言的形式列印出包匹配碼.
- -ddd:以十進制數的形式列印出包匹配碼
- -D:列印系統中所有支援抓包的網路接口
- -e:在輸出行列印出資料鏈結層的頭部訊息
- -E:解密IPsec ESP分組。具體來說,它使用spi@ipaddr algo:secret的格式來解密那些以addr作為位址,並且包含了安全參數索引值spi的IPsec ESP分組。這樣,tcpdump可以捕獲並顯示經過IPsec加密的資料包內容,幫助使用者更好地分析和理解網路流量
- -f :將外部的網際網路位址以數字的形式列印出來
- -F:使用file檔案作為過濾條件表達式的輸入
- -i:指定監聽網路介面
- -l:對標準輸出進行行緩衝
- -L:列出指定網路介面所支援的資料鏈結層的類型後退出
- -m:透過module 指定的file 裝載SMI MIB 模組
- -n:不把網路位址轉換成名稱,也就是直接顯示IP位址而不是主機名
- -N:不列印出host 的網域部分
- -nn:不進行連接埠名稱的轉換
- -O:不啟用進行套件匹配時所使用的最佳化程式碼
- -p:不讓網路介面進入混雜模式
- -q:快速簡短列印輸出
- -R:設定tcpdump 對ESP/AH 封包的解析依照RFC1825而非RFC1829
- -r:從檔案file 讀取包數據
- -s:封包抓取長度,如果不設定預設將會是68位元組
- -S:列印TCP 封包的順序號時, 使用絕對的順序號, 而不是相對的順序號
- -t:在每行輸出中不列印時間戳
- -tt:不對每行輸出的時間進行格式處理
- -ttt:tcpdump 輸出時, 每兩行列印之間會延遲一個一段時間(以毫秒為單位)
- -tttt:在每行列印的時間戳記之前新增日期的列印
- -u:列印出未加密的NFS句柄
- -U:使得當tcpdump在使用-w 選項時, 其文件寫入與包的保存同步
- -v:分析和列印產生詳細的輸出
- -vv:產生比-v更詳細的輸出
- -vvv:產生比-vv更詳細的輸出
- -w:把套件資料直接寫入檔案而不進行分析列印輸出
- -W:設定輸出檔的最大數目
- -x:以十六進位的形式列印每個資料包的頭部數據,但不包括資料鏈結層的頭部
- -xx:以十六進位的形式列印每個資料包的頭部數據,並且包括資料鏈結層的頭部
- -X:以ASCII碼格式顯示輸出,但不包含資料鏈結層的頭部
- -XX:以ASCII碼格式顯示輸出,並且包含資料鏈結層的頭部
- -y:只捕獲資料鏈路層協定類型是datalinktype的資料包
四、Tcpdump常見捕獲方式
(1) 預設啟動
tcpdump監視系統第一個網路介面上所有流過的資料包。
tcpdump
- 1.
(2) 抓取網路卡eth0
抓取網卡eth0上所有報文
tcpdump -i eth0
- 1.
(3) 抓取指定MAC
抓取ath10介面上包含MAC位址為11:22:33:44:55:66的封包,並儲存為ath10.pcap於目前路徑下:
tcpdump –i ath10 –w ath10.pcapetherhost 11:22:33:44:55:66
- 1.
抓取ath10介面上來源MAC位址為11:22:33:44:55:66的封包,並儲存為ath10.pcap於目前路徑下:
tcpdump –i ath10 –w ath10.pcapethersrc 11:22:33:44:55:66
- 1.
抓取ath10介面上目的MAC位址為11:22:33:44:55:66的封包,並儲存為ath10.pcap於目前路徑下:
tcpdump –i ath10 –w ath10.pcapetherdst 11:22:33:44:55:66
- 1.
(4) 抓取指定的主機
抓取eth0網路卡上IP為192.168.168.2的所有封包:
tcpdump -i eth0 -nn 'host 192.168.1.2'
- 1.
抓取eth0網卡上來源IP為192.168.168.2的所有封包:
tcpdump -i eth0 -nn 'src host 192.168.1.2'
- 1.
抓取eth0網卡上目的IP為192.168.168.2的所有封包:
tcpdump -i eth0 -nn 'dst host 192.168.1.2'
- 1.
(5) 抓取指定端口
抓取eth0網卡上連接埠號碼為80的所有封包:
tcpdump -i eth0 -nnA 'port 80'
- 1.
(6) 抓取指定主機和連接埠
抓取eth0網路卡上IP為192.168.1.2且連接埠號碼為80的所有封包
tcpdump -i eth0 -nnA 'port 80 and src host 192.168.1.2'
- 1.
(7) 抓取除某個連接埠外的其它端口
排除某個連接埠或主機可以使用“!”符號,上例表示監聽非22埠的封包。
tcpdump -i eth0 -nnA '!port 22'
- 1.
(8) 協議過濾
可過濾ip6、arp、icmp、tcp、udp、igmp等協定:
tcpdump –i ath10 –w ath10.pcaptcpandetherhost 88:bf:e4:fc:26:19
- 1.
此指令可以抓取ath10介面上包含MAC位址為88:bf:e4:fc:26:19的tcp封包,保存於ath10.pcap檔中。
(9) 組合過濾
過濾規則可以透過邏輯運算子組合使用,注意協議的預過濾規則要放在第一位。
tcpdump –i eth0 –w eth0.pcaptcpandsrc ‘(192.168.96.54or 192.168.96.7)’
- 1.
此指令可抓取eth0介面上來源位址為192.168.96.54及192.168.96.7的tcp資料包,保存於eth0.pcap檔。註:小括號() 需與轉義符' 搭配使用。
(10) 分文件滾動保存(適合長期監控)
tcpdump -i eth0 -C 100 -W 10 -w daily_%Y%m%d.pcap
注释:每个文件 100MB,最多保留 10 个文件,自动按日期命名。
- 1.
- 2.
(11) 抓取指定長度資料包(節省空間)
tcpdump -i eth0 -s 200 # 只抓前200字节
- 1.
(12) 結合正規表示式過濾
tcpdump -i eth0 -A 'tcp[20:2] > 1000' # 抓取TCP窗口大于1000的包
- 1.
五、注意事項
1. 數據解碼優化
tcpdump直接輸出的封包多為十六進位格式,不利於分析。最佳實務: 抓包時用-w參數儲存為pcap檔:
tcpdump -i eth0 -w traffic.pcap
- 1.
- 用Wireshark等工具開啟檔案解碼分析,避免直接查看原始輸出。
2. 進程殘留處理
按Ctrl+C/Z結束抓包後,可能有進程殘留導致記憶體佔用異常。解決步驟:
- 檢查殘留進程:
ps | grep tcpdump
- 1.
- 強制終止所有進程:
killall tcpdump
- 1.
3. 文件管理策略
pcap檔案長期留存會佔用磁碟空間。清理方法:
- 查看檔案清單及大小:
ls -la | grep pcap
- 1.
- 刪除指定檔案(替換xxx為檔案名稱):
rm xxx.pcap