排查網路效能、連線異常、流量分析,route、netstat、tcpdump 是 Linux 系統管理員必備的三大核心工具。本文系統整理用法、輸出解讀與實戰場景。
route -n
# -n 直接顯示 IP,不做 DNS 反解,速度快
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
10.10.8.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
| 欄位 | 含義 |
|---|---|
| Destination | 目標網路/主機位址 |
| Gateway | 下一跳閘道,* 表直連 |
| Genmask | 網路遮罩,與 Destination 決定匹配範圍 |
| Flags | U=Up, H=Host, G=Gateway, R=Reinstate, D=Dynamic, M=Modified, !=Reject |
| Metric | 路由成本,越小優先級越高 |
| Ref | 引用計數 |
| Use | 查找次數 |
| Iface | 輸出介面 |
# 新增主機路由
route add -host 192.168.5.10 gw 192.168.1.254 dev eth0
# 新增網路路由
route add -net 10.20.30.0 netmask 255.255.255.0 gw 10.10.8.1 dev eth0
# 設定預設閘道
route add default gw 192.168.1.1 dev eth0
# 刪除路由
route del -net 10.20.30.0 netmask 255.255.255.0
route del default gw 192.168.1.1
# 拒絕路由 (黑洞)
route add -net 192.168.100.0 netmask 255.255.255.0 reject
持久化:編輯 /etc/sysconfig/network-scripts/route-eth0 (RHEL/CentOS) 或 /etc/network/interfaces (Debian/Ubuntu) 加入 up route add ...。
注意:netstat 屬於 net-tools 套件,已停止維護。現代系統建議使用 ss (iproute2),語法類似但效能更好。本文仍以 netstat 為主,並標註 ss 對應指令。
-t TCP、-u UDP、-l 監聽、-n 數位顯示、-p 顯示 PID/程式名 (需 root)、-a 所有 (含監聽/非監聽)、-r 路由表、-i 介面統計、-s 協定統計、-e 延伸資訊。# 1. 查看所有 TCP/UDP 監聽埠及進程
netstat -tulpn
# ss -tulpn
# 2. 查看所有 ESTABLISHED 連線
netstat -tn | grep ESTABLISHED
# ss -tn state established
# 3. 統計連線狀態分布
netstat -tan | awk '/^tcp/ {print $6}' | sort | uniq -c | sort -rn
# ss -tan state all | awk 'NR>1 {print $2}' | sort | uniq -c | sort -rn
# 4. 找出佔用特定埠的進程
netstat -tulpn | grep :3306
# ss -tulpn sport = :3306
# 5. 查看介面統計 (錯誤、丟包、碰撞)
netstat -i
# ss -i
# 6. 協定層統計 (TCP 重傳、ICMP、IP 碎片等)
netstat -s
# ss -s
| 欄位 | 含義 |
|---|---|
| Proto | 協定 (tcp, udp, raw) |
| Recv-Q | 接收佇列位元組數 (未被應用讀取) |
| Send-Q | 發送佇列位元組數 (未被對端確認) |
| Local Address | 本地 IP:Port |
| Foreign Address | 對端 IP:Port |
| State | TCP 狀態 (LISTEN, SYN_SENT, SYN_RECV, ESTABLISHED, FIN_WAIT1/2, TIME_WAIT, CLOSE_WAIT, LAST_ACK, CLOSED) |
| PID/Program name | 進程 ID 與名稱 (-p 需 root) |
tcpdump [選項] -i 介面 '過濾運算式'
# 常用選項:
# -n 不解析主機名/埠名
# -nn 不解析主機名/埠名/協定名
# -X 顯示封包內容 (Hex + ASCII)
# -XX 含鏈路層頭部
# -S 顯示絕對序號
# -v/-vv/-vvv 詳細程度
# -c N 捕獲 N 個封包後結束
# -w 檔案 寫入 pcap 檔 (供 Wireshark 分析)
# -r 檔案 讀取 pcap 檔
# -s N 捕獲長度 (預設 262144,0 表完整封包)
| 場景 | 運算式 |
|---|---|
| 特定主機 | host 192.168.1.100 |
| 特定埠 | port 80 / portrange 8000-8080 |
| 來源/目的 | src host 1.2.3.4 / dst port 443 |
| 協定 | tcp / udp / icmp |
| TCP 旗標 | tcp[tcpflags] & tcp-syn != 0 (SYN), tcp[tcpflags] & tcp-fin != 0 (FIN) |
| 複合 | host 192.168.1.100 and port 3306 and tcp |
| 排除 | not port 22 (排除 SSH 雜訊) |
# 1. 捕獲 80 埠流量並存檔分析
tcpdump -i eth0 -nn -s0 -w http.pcap 'port 80'
# 2. 即時顯示 HTTP GET 請求 (簡易)
tcpdump -i eth0 -nn -A -s0 'port 80 and tcp[((tcp[12]>>2)*4)] = 0x47' # G=0x47
# 3. 分析 MySQL 慢查詢封包 (需解析協定,建議用 Wireshark)
tcpdump -i eth0 -nn -s0 -w mysql.pcap 'port 3306'
# 4. 統計連線建立速率 (SYN 計數)
tcpdump -i eth0 -nn -c 1000 'tcp[tcpflags] & tcp-syn != 0' | wc -l
# 5. 排除 SSH 觀察其他流量
tcpdump -i eth0 -nn 'not port 22'
tcpdump -i eth0 -s0 -w capture.pcap 'port 3306'capture.pcap 到本機,用 Wireshark 開啟。mysql.query、tcp.analysis.retransmission、tcp.stream eq 0。Follow > TCP Stream 重組完整會話。netstat -s | grep -i retrans 觀察 TCP 重傳率是否異常升高。netstat -tan | awk '$6=="TIME_WAIT"{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn 檢查 TIME_WAIT 暴增 (短連線風暴)。tcpdump -i eth0 -nn -c 500 'tcp[tcpflags] & (tcp-syn|tcp-rst) != 0' 捕獲 SYN/RST 封包,分析握手失敗/連線重置。route -n 確認回程路由正確 (非對稱路由導致單向通)。ss -ti 觀察 TCP 資訊 (rtt, cwnd, retrans 等)。熟練 route (路由)、netstat/ss (連線狀態)、tcpdump (封包真相),能解決 90% 以上的 Linux 網路效能與連線異常問題。建議將 ss、ip route 納入日常工具箱,並善用 Wireshark 進行深度封包分析。