tcpdump 網絡封包分析教學:5 個實用技巧由零開始學 Packet Capture

## tcpdump 係乜東東? tcpdump 係 Linux 世界最經典嘅 network packet analyzer,由 1988 年已經存在,去到 2026 年依然係每個 sysadmin 必學嘅基本功。佢可以 capture 所有經過 network interface 嘅 packet,然後用 human-readable 嘅 format show 出嚟。無論你係 trouble...

tcpdump 網絡封包分析教學:5 個實用技巧由零開始學 Packet Capture - 文章重點速覽 infographic

## tcpdump 係乜東東?

tcpdump 係 Linux 世界最經典嘅 network packet analyzer,由 1988 年已經存在,去到 2026 年依然係每個 sysadmin 必學嘅基本功。佢可以 capture 所有經過 network interface 嘅 packet,然後用 human-readable 嘅 format show 出嚟。無論你係 troubleshooting network 問題、debug application connection、定係做 security audit,tcpdump 都係你最好嘅朋友。

今日呢篇 tcpdump 教學會由零開始,step by step 教你 5 個最實用嘅 tcpdump 技巧,保證你 15 分鐘內可以由新手變熟手。

## tcpdump 基本安裝

絕大部份 Linux distribution 都內置咗 tcpdump,但如果未裝嘅話:

# Debian/Ubuntu
sudo apt install tcpdump -y

# RHEL/CentOS/AlmaLinux
sudo dnf install tcpdump -y

# macOS (需要 root permission)
brew install tcpdump

裝完 check 下 version:

tcpdump --version

## tcpdump 第一步:基本 Capture

最簡單嘅 tcpdump command 就係乜 flag 都唔加,直接 run:

sudo tcpdump

呢個 command 會 capture 所有經過 default interface 嘅 packet。但係 output 會好瘋狂,每秒幾百行咁出。所以正常情況下我哋會加 filter 去縮窄範圍。

如果你想指定 interface:

# List 晒所有 network interface
tcpdump -D

# Capture 特定 interface (例如 eth0)
sudo tcpdump -i eth0

## tcpdump Filter 實戰:5 個最常用場景

### 場景一:只睇特定 Host 嘅 Traffic

呢個係最常用嘅 tcpdump filter,當你懷疑某部機同你部 server 之間嘅 connection 有問題:

# 只 capture 同 192.168.1.100 有關嘅 traffic
sudo tcpdump host 192.168.1.100

# 只 capture source IP 係某個 address
sudo tcpdump src host 192.168.1.100

# 只 capture destination IP 係某個 address
sudo tcpdump dst host 10.0.0.1

### 場景二:Filter by Port

debug web server、database connection 必用嘅 tcpdump filter:

# HTTP/HTTPS traffic
sudo tcpdump port 443

# 指定 source port
sudo tcpdump src port 8080

# 指定 port range
sudo tcpdump portrange 8000-8100

# MySQL database connection
sudo tcpdump port 3306

### 場景三:Filter by Protocol

tcpdump 支援大量 protocol filter,呢幾個最常用:

# 只睇 TCP packet
sudo tcpdump tcp

# 只睇 ICMP (ping)
sudo tcpdump icmp

# 只睇 UDP (DNS queries)
sudo tcpdump udp

# HTTP request only
sudo tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

### 場景四:組合 Filter(AND / OR / NOT)

tcpdump 嘅真正威力在於可以組合多個 filter:

# 睇某個 host 嘅 HTTPS traffic
sudo tcpdump host 192.168.1.100 and port 443

# 睇所有 HTTP 或 HTTPS traffic,但排除某個 IP
sudo tcpdump '(port 80 or port 443) and not host 10.0.0.99'

# 睇所有去 internet 嘅 traffic(排除 internal subnet)
sudo tcpdump not net 192.168.0.0/16

### 場景五:Save to File + 事後分析

Real-time capture 唔係成日都得,有時你需要 capture 幾個鐘然後慢慢分析:

# Capture 1000 個 packet 然後自動停
sudo tcpdump -c 1000 -w capture.pcap

# Capture 所有 port 443 traffic,save 做 file
sudo tcpdump -i eth0 port 443 -w https_traffic.pcap

# 讀返個 pcap file 分析
tcpdump -r capture.pcap

# 用 human-readable format 讀
tcpdump -r capture.pcap -A

# Filter pcap file: 只 show HTTP POST request
tcpdump -r capture.pcap -A 'tcp port 80'

## tcpdump 進階選項:令 Output 更易讀

tcpdump 預設 output 有時好難睇,加呢幾個 options 會清楚好多:

# -n: 唔好 resolve hostname(快好多)
# -v/-vv/-vvv: 越多 v 越多 detail
# -A: show packet content in ASCII
# -X: show packet content in HEX + ASCII

# 實用組合:詳細 output + 唔 resolve DNS
sudo tcpdump -i eth0 -nn -vvv -A port 443

如果你要 debug TLS/SSL 問題,可以配合 `-A` 睇到 certificate exchange 嘅 plaintext 部份。

## tcpdump 實戰 Troubleshooting 案例

### Case 1: Website 好慢,係咪 network latency?

# Capture SYN -> SYN-ACK 嘅時間差
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)' port 443

睇下每個 TCP handshake 用咗幾多時間,如果超過 100ms 就係 network 有問題。

### Case 2: 懷疑有人 brute force SSH

# Monitor SSH connection attempt
sudo tcpdump -i eth0 -nn port 22

# 只睇新 connection (SYN flag)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0' and port 22

如果同一 IP 喺短時間內大量 SYN packet 入嚟,好大機會係 brute force attack — 呢個時候就係 fail2ban 出場嘅時候。

### Case 3: DNS 查詢失敗

# Capture all DNS traffic
sudo tcpdump -i eth0 -nn udp port 53

# 配合 -v 睇 DNS query detail
sudo tcpdump -i eth0 -nn -v udp port 53

## tcpdump vs Wireshark:幾時用邊個?

好多人問:「有 Wireshark GUI 咁靚,點解仲要學 tcpdump?」

答案好簡單:
1. **Server 冇 GUI** — production server 多數得 command line
2. **輕量** — tcpdump 係 built-in,唔使裝一堆 dependencies
3. **自動化** — tcpdump 可以寫入 script,配合 cron job 自動 monitor
4. **Remote** — SSH 入 server 就直接用得,唔使 set X11 forwarding

不過如果你需要 deep packet inspection、protocol decode、visual flow analysis,咁就 export pcap file 然後用 Wireshark 開嚟分析。兩個係互補關係,唔係替代關係。

> 💡 **Pro Tip:** 用 `tcpdump -w capture.pcap` capture raw data,然後 scp 落 local machine 用 Wireshark 開 — 呢個係 production troubleshooting 嘅 standard workflow。

## tcpdump 安全注意事項

tcpdump 需要 root permission 先可以 capture packet(因為要 access raw socket)。如果你唔想成日用 `sudo`,可以:

# 將 user 加入 pcap group (Linux)
sudo usermod -a -G pcap $USER

# 或者 set capability (唔使 full root)
sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump

記得一點:**tcpdump 可以 capture 到 plaintext password**(例如 HTTP Basic Auth、FTP、Telnet),所以 capture file 一定要保存妥當,分析完即刻 delete。

## 總結

tcpdump 係每個 IT 人必學嘅 network troubleshooting 工具。記住呢幾個 command pattern:

| 用途 | Command |
|——|———|
| 基本 capture | `sudo tcpdump -i eth0` |
| Filter by host | `sudo tcpdump host 192.168.1.1` |
| Filter by port | `sudo tcpdump port 443` |
| Save to file | `sudo tcpdump -w capture.pcap` |
| 詳細 output | `sudo tcpdump -nn -vvv -A` |
| 讀 pcap file | `tcpdump -r capture.pcap` |

學識 tcpdump,你 troubleshooting network 問題嘅效率會大幅提升。下次遇到 connection timeout、packet loss、或者懷疑有人 scan 你個 port,tcpdump 就係你嘅第一道防線。

#tcpdump #network #troubleshooting #Linux #資安

延伸閱讀

想學更多 IT 安全同 server 管理技巧?睇埋呢幾篇: