文章目錄
- 一、tcpdump 是什么?
- 二、基本語法
- 三、常用參數說明
- 四、抓包示例(通俗易懂)
- 1. 抓所有數據包(默認 eth0)
- 2. 指定接口抓包
- 3. 抓取端口 80 的數據包(即 HTTP 請求)
- 4. 抓取訪問某個 IP 的數據包
- 5. 抓取 TCP 協議的數據包
- 6. 抓取源 IP 為 192.168.1.5 的包
- 7. 抓取目的端口為 22(SSH) 的包
- 8. 抓取數據并保存為 pcap 文件
- 五、過濾表達式組合
- 六、實時查看數據包內容
- 七、常見用途總結
- 八、停止抓包
- 九、注意事項
- 十、案例:排查 Web 服務訪問異常
- 背景
- 第一步:服務端開啟抓包
- 第二步:客戶端 curl 請求
- 第三步:分析抓包輸出(部分示例)
- 如果沒有抓到內容怎么辦?
- 總結:通過抓包排查服務異常
一、tcpdump 是什么?
tcpdump
是一個命令行抓包工具,它可以監聽網絡接口上的數據包,并將其內容打印出來。相比圖形化工具(如 Wireshark),tcpdump 更輕量、適合遠程服務器操作。
二、基本語法
tcpdump [選項] [過濾表達式]
常用結構:
sudo tcpdump -i eth0
三、常用參數說明
參數 | 含義 |
---|---|
-i interface | 指定要監聽的網絡接口,例如 eth0 , ens33 , lo |
-nn | 不將地址和端口轉換為主機名和服務名 |
-v , -vv , -vvv | 輸出更詳細的包信息 |
-c num | 抓取指定數量的包后自動退出 |
-w file | 將抓到的包寫入文件,供 Wireshark 分析(如:.pcap ) |
-r file | 讀取之前保存的 .pcap 文件 |
-s size | 抓取數據包的大小(默認只抓前96字節) |
四、抓包示例(通俗易懂)
1. 抓所有數據包(默認 eth0)
sudo tcpdump
2. 指定接口抓包
sudo tcpdump -i ens33
3. 抓取端口 80 的數據包(即 HTTP 請求)
sudo tcpdump -i ens33 port 80
4. 抓取訪問某個 IP 的數據包
sudo tcpdump host 192.168.1.10
5. 抓取 TCP 協議的數據包
sudo tcpdump tcp
6. 抓取源 IP 為 192.168.1.5 的包
sudo tcpdump src 192.168.1.5
7. 抓取目的端口為 22(SSH) 的包
sudo tcpdump dst port 22
8. 抓取數據并保存為 pcap 文件
sudo tcpdump -i ens33 -w output.pcap
然后可以用 Wireshark 打開 output.pcap
文件分析。
五、過濾表達式組合
可以使用 AND、OR、NOT 來組合條件:
#抓取目的端口為 80 且源 IP 為 192.168.1.10 的包
sudo tcpdump dst port 80 and src 192.168.1.10#抓取非本機 IP 的所有包
sudo tcpdump not src host 127.0.0.1
六、實時查看數據包內容
sudo tcpdump -A -i ens33 port 80
-A
會以 ASCII 格式輸出數據內容,適合抓取 HTTP 明文請求。
七、常見用途總結
場景 | 示例命令 |
---|---|
抓某個 IP 的流量 | tcpdump host 192.168.1.10 |
抓某個端口的流量 | tcpdump port 3306 |
保存抓包文件 | tcpdump -w mysql.pcap port 3306 |
實時觀察 HTTP 內容 | tcpdump -A port 80 |
八、停止抓包
- 直接 按
Ctrl + C
停止并返回統計信息。
九、注意事項
-
tcpdump 通常需要 root 權限。
-
不能抓加密內容(如 HTTPS),但可以看到握手。
-
若接口名不知道,可以使用命令查看所有網絡接口:
ip a
十、案例:排查 Web 服務訪問異常
背景
在維護一臺 Ubuntu 服務器,服務器 IP 是 192.168.163.130
,在這臺機器上部署了一個 Web 服務(監聽在 80 端口),但用戶反映無法訪問。
需要確認:
- 客戶端(比如另一臺機器)是否發起了請求?
- 服務端是否接收到請求?
- 響應是否正常返回?
第一步:服務端開啟抓包
在 Web 服務所在的服務器上運行
sudo tcpdump -i ens33 -nn -A port 80 and host 192.168.163.133
解釋:
-i ens33
:監聽本機的網絡接口(你可根據ip a
查具體名稱)-nn
:不解析主機名和端口名,顯示數字-A
:以 ASCII 形式輸出,便于看 HTTP 請求內容port 80
:只抓 HTTP 流量host 192.168.163.133
:只抓指定客戶端發來的數據(這臺是訪問你服務器的客戶端)
第二步:客戶端 curl 請求
在另一臺主機(比如 192.168.163.133
)執行:
curl http://192.168.163.130
這會發起一個 HTTP 請求。
第三步:分析抓包輸出(部分示例)
如果服務正常,你應該會在 tcpdump 中看到類似內容:
GET / HTTP/1.1
Host: 192.168.163.130
User-Agent: curl/7.81.0
Accept: */*HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
...
<html>...</html>
說明:
- 客戶端成功發起了 HTTP 請求(
GET / HTTP/1.1
) - 服務器返回了 200 狀態碼
如果沒有抓到內容怎么辦?
可能是以下問題:
現象 | 排查建議 |
---|---|
抓不到任何包 | 客戶端根本沒發起請求;或防火墻阻斷 |
有請求無響應 | 服務未監聽 80 端口;nginx/apache 沒啟動 |
請求顯示連接被拒絕 | 服務未運行,或被防火墻攔截 |
是 HTTPS 流量 | 用 port 443 ,但內容是加密的,看不到明文 |
可以用以下命令排查服務狀態:
sudo ss -tnlp | grep :80 # 查看是否監聽了80端口
sudo ufw status # 查看防火墻
保存抓包供分析(可配合 Wireshark)
sudo tcpdump -i ens33 -w web_error.pcap port 80
然后傳輸 .pcap
文件到本地,用 Wireshark 打開,能更圖形化分析每一條請求響應
總結:通過抓包排查服務異常
步驟 | 操作 |
---|---|
開啟抓包 | tcpdump -i ens33 port 80 and host 客戶端IP |
客戶端訪問測試 | curl http://服務端IP |
實時分析 HTTP 請求 | 用 -A 顯示明文 |
保存數據包 | 用 -w file.pcap |
tcpdump -i ens33 port 80 and host 客戶端IP | |
客戶端訪問測試 | curl http://服務端IP |
實時分析 HTTP 請求 | 用 -A 顯示明文 |
保存數據包 | 用 -w file.pcap |
問題排查方向 | 沒請求 / 有請求無響應 / 端口監聽 / 防火墻攔截 |