# Linux 網絡排查神器 tcpdump 實戰教學:由入門到進階嘅封包分析技巧
做 IT 嘅你一定試過呢個場景:個客打嚟話「個網站好慢喎」,你 check 完 CPU、memory、disk 全部正常,Apache/Nginx log 又冇 error,咁點算?呢個時候就要出動網絡排查神器 — **tcpdump**。
tcpdump 係 Linux 入面最強大嘅封包擷取工具,可以即時 capture 網絡流量,幫你睇清楚每一個 TCP 握手、HTTP request、DNS query 嘅細節。今日就同大家由淺入深,實戰學識點樣用 tcpdump 排查網絡問題。
## 乜嘢係 tcpdump?
tcpdump 係一個 command-line 嘅封包分析工具,背後用 libpcap 庫嚟擷取網絡介面上嘅所有 traffic。佢可以即時顯示封包內容,亦可以將結果 save 做 pcap 檔案,之後再用 Wireshark 慢慢分析。
基本語法好簡單:
tcpdump -i eth0
呢個 command 會 capture eth0 介面上所有經過嘅封包。但係喺 production server 上面咁樣行,畫面會瘋狂 scroll,根本睇唔切。所以實戰入面一定要加 filter。
## tcpdump 常用 Filter 實戰
### 1. 按 Port 過濾
最常用嘅 filter 就係指定 port。例如你想睇曬所有 HTTP traffic:
tcpdump -i eth0 port 80
想睇 HTTPS 嘅話:
tcpdump -i eth0 port 443
如果你淨係想睇由某個 source port 發出嘅 traffic,可以用 `src port`:
tcpdump -i eth0 src port 8080
### 2. 按 Host 過濾
當你懷疑某部機嘅 traffic 有問題,可以指定 host:
tcpdump -i eth0 host 192.168.1.100
呢個 command 會 capture 所有同 192.168.1.100 有關嘅封包(包括 incoming 同 outgoing)。想再精準啲,可以用 `src host` 或 `dst host`:
# 淨係睇由 192.168.1.100 發出嘅封包
tcpdump -i eth0 src host 192.168.1.100
# 淨係睇發去 192.168.1.100 嘅封包
tcpdump -i eth0 dst host 192.168.1.100
### 3. 組合 Filter
tcpdump 支援用 `and`、`or`、`not` 組合多個條件。例如你想睇由某部機發出、去 port 443 嘅 traffic:
tcpdump -i eth0 src host 10.0.0.5 and dst port 443
又或者你想排除 SSH traffic(port 22),專心睇其他嘢:
tcpdump -i eth0 not port 22
## 進階技巧:分析 TCP 握手問題
網站慢嘅其中一個常見原因係 TCP 握手 latency 高。你可以用 tcpdump 睇清楚三次握手嘅時間:
tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'
`-nn` 參數會 skip DNS lookup 同 port name resolution,加快顯示速度。呢個 filter 淨係顯示 SYN 同 FIN 封包,幫你快速判斷:
– 如果見到 SYN 發出但冇 SYN-ACK 返嚟 → 可能 firewall block 咗
– 如果 SYN 同 SYN-ACK 之間時間好長 → 網絡 latency 高
– 如果見到大量 SYN 但冇完成握手 → 可能係 SYN flood attack
## 將結果 Save 做 PCAP 檔案
有時你需要將 capture 結果留低俾同事分析,或者用 Wireshark 開嚟慢慢睇:
tcpdump -i eth0 -w /tmp/capture.pcap port 443
`-w` 參數會將 raw packet data 寫入檔案。之後你可以用 `-r` 讀返出嚟:
tcpdump -r /tmp/capture.pcap
## 實戰案例:排查 HTTPS Connection Reset
假設你個網站間唔中出現 “Connection Reset” error,你可以咁樣排查:
tcpdump -i eth0 -nn 'tcp port 443 and (tcp[tcpflags] & tcp-rst != 0)'
呢個 command 淨係 capture 帶 RST flag 嘅 TCP 封包。如果見到大量 RST,可能係:
1. **Backend server 死咗** — 檢查 upstream service 係咪正常
2. **SSL/TLS 版本唔夾** — 檢查 server 同 client 嘅 TLS 設定
3. **Load balancer timeout** — 檢查 keepalive 設定
## 常用 tcpdump 參數速查表
| 參數 | 用途 |
|——|——|
| `-i eth0` | 指定 network interface |
| `-nn` | 唔做 DNS + port name lookup |
| `-v / -vv / -vvv` | 顯示更多 detail(verbose) |
| `-w file.pcap` | 寫入檔案 |
| `-r file.pcap` | 讀取檔案 |
| `-c 100` | 淨係 capture 100 個封包 |
| `-A` | 以 ASCII 顯示封包內容 |
| `-X` | 以 Hex + ASCII 顯示封包內容 |
| `-s 0` | Capture 完整封包(唔 truncate) |
## 總結
tcpdump 係每個 Linux admin 必學嘅工具。由基本嘅 port/host filter,到進階嘅 TCP flag 分析,掌握咗佢你就可以喺網絡問題出現時快速定位 root cause。記住:下次個客話網站慢,唔好即刻 reboot server,開個 tcpdump 睇清楚先!
🔗 參考資料:NVD NIST 漏洞資料庫
**Pro tip:** 喺 production 環境用 tcpdump 嗰陣,記得加 `-c` 限制封包數量,或者用 filter 縮窄範圍。唔好喺 busy server 上面行 `tcpdump -i any` 冇 filter,會拖慢成部機㗎!
#技術分享 #SSL #firewall #SSH #IT教學




