網路故障排查方法論#
網路「不通」是最模糊的故障描述,但底層協定是層層堆疊的,故障也一定發生在某一層。與其憑直覺亂試,不如沿著協定堆疊由下而上逐層驗證:下層不通,上層必然不通;下層確認沒問題,才有意義往上排查。本節整理一套系統化的分層診斷流程、常見根因,以及對應的工具用法。
為什麼要分層診斷#
網路通訊牽涉物理層、資料鏈結層、網路層、傳輸層到應用層。任何一層失效,使用者看到的都只是「打不開網頁」這個籠統現象。分層診斷的核心思想是先確認下層,再往上推進:
- 下層是上層的基礎,跳過下層直接懷疑應用,往往白費力氣
- 每一層都有對應的觀測工具,定位到層,就等於縮小了一個數量級的可能性
- 排查時優先用「成本最低、覆蓋最廣」的工具(如
ping),逐步換成更精細的工具(如tcpdump)
flowchart TD
A["應用層<br/>瀏覽器打不開、API 逾時"] --> B["傳輸層<br/>埠不通、連線被拒"]
B --> C["網路層<br/>路由不可達、IP 設定錯誤"]
C --> D["資料鏈結層<br/>ARP 解析失敗、VLAN 隔離"]
D --> E["物理層<br/>網線鬆脫、網卡 Down"]
E -. "由下而上逐層確認" .-> A排查順序的鐵律是「先硬體後軟體、先本機後遠端、先簡單後複雜」。多數疑難雜症最後查出來是網線沒插緊或網卡被禁用,而工程師卻先花了一小時懷疑防火牆規則。
系統化八步驟檢測流程#
把「網路不通」拆成可機械執行的八個步驟,每一步都對應一個明確的「通/不通」結論,避免來回跳躍:
flowchart TD
S1["1. 確認物理連線<br/>網線、燈號、網卡狀態"] --> S2["2. 檢查本機 IP 設定<br/>IP / 遮罩 / 網關"]
S2 --> S3["3. ping 本機回環 127.0.0.1<br/>驗證協定堆疊"]
S3 --> S4["4. ping 自身 IP / 同網段主機<br/>驗證二層與本機網卡"]
S4 --> S5["5. ping 預設網關<br/>驗證本網段出口"]
S5 --> S6["6. ping 外部 IP(如 8.8.8.8)<br/>驗證路由與 NAT"]
S6 --> S7["7. dig 解析域名<br/>驗證 DNS"]
S7 --> S8["8. ping / curl 域名<br/>驗證端到端應用"]每一步「不通」時,故障層級就基本鎖定:
| 步驟 | 若失敗,問題大概率在 | 典型原因 |
|---|---|---|
| 1 物理連線 | 物理層 | 網線鬆脫、網卡禁用、交換機埠故障 |
| 2 IP 設定 | 網路層(設定) | 沒拿到 DHCP、IP 衝突、遮罩錯誤 |
| 3 回環 | 本機協定堆疊 | TCP/IP 驅動或系統異常 |
| 4 同網段 | 資料鏈結層 | ARP 失敗、VLAN 隔離、交換機問題 |
| 5 網關 | 本網段出口 | 網關位址錯、網關故障 |
| 6 外部 IP | 網路層(路由/NAT) | 路由缺失、NAT 失效、上游斷線 |
| 7 DNS | 應用層(DNS) | DNS 伺服器掛了、解析記錄錯誤 |
| 8 域名訪問 | 應用層 | 服務未啟動、防火牆擋埠、憑證問題 |
第 6、7 步要分開判斷:若「ping 8.8.8.8 通、但 ping 域名不通」,幾乎可以斷定是 DNS 問題,而不是網路斷線。能 ping 通 IP 卻打不開網頁,十有八九是 DNS。
常見根因速覽#
實務上反覆出現、卻容易被忽略的幾類根因:
- IP 衝突:兩台主機設定相同 IP,表現為「時通時不通」、ARP 表中同一 IP 對應的 MAC 不斷跳動。
- 子網遮罩錯誤:遮罩設錯會讓主機誤判目標是否在同網段,導致「能 ping 通網關、卻 ping 不通其他網段」,或反之。
- 單向防火牆:防火牆只放行了單方向流量,表現為「我能連到你、你連不回我」,TCP 握手卡在
SYN_SENT。 - 硬體接觸不良:網線水晶頭氧化、網卡半雙工協商錯誤,表現為「能通但大量丟包、速度極慢」。
如何快速分辨「遮罩錯」與「網關錯」
- 遮罩錯:同網段內部分主機能通、部分不能;跨網段行為異常。
- 網關錯:同網段全部正常,但完全無法存取任何外部網段。
驗證方式:先 ping 同網段另一台主機,再 ping 網關,再 ping 外網 IP,三者通斷的組合即可定位。
症狀 ➡️ 層級 ➡️ 工具 ➡️ 修復 對照表#
| 症狀 | 可能層級 | 診斷工具 | 常見修復 |
|---|---|---|---|
網卡無燈號、state DOWN | 物理層 | ip link、ethtool | 換線、啟用網卡、檢查交換機埠 |
| 同網段 ping 不通 | 資料鏈結層 | ip neigh、arping | 清 ARP 快取、檢查 VLAN 與遮罩 |
| 拿不到 IP 或 IP 為 169.254.x | 網路層(設定) | ip addr、dhclient | 檢查 DHCP、手動設定 IP |
| ping 網關通、外網不通 | 網路層(路由) | ip route、traceroute | 補上預設路由、檢查 NAT |
| ping IP 通、ping 域名不通 | 應用層(DNS) | dig、nslookup | 換 DNS 伺服器、修正解析記錄 |
| 連線被拒(Connection refused) | 傳輸層 | ss -ltn、telnet | 啟動服務、確認監聽埠 |
| 連線逾時(卡住不回) | 傳輸層/防火牆 | ss、tcpdump、iptables -L | 放行防火牆規則、檢查單向阻擋 |
| 通但速度慢、大量重傳 | 傳輸層/物理層 | tcpdump、ethtool、mtr | 修正雙工協商、排查丟包鏈路 |
關鍵工具用法#
ping:最快的連通性與丟包探針#
# 連續 ping 並統計丟包率(觀察是否「時通時斷」)
ping -c 10 192.168.1.1
# 指定來源介面,排查多網卡走錯出口的問題
ping -I eth0 8.8.8.8
# 大封包測試,揪出 MTU / 分片問題(DF 位元 + 指定大小)
ping -M do -s 1472 8.8.8.8traceroute / mtr:定位斷在哪一跳#
# 逐跳顯示路徑與延遲,看封包停在哪個路由器
traceroute www.example.com
# mtr 結合 ping 與 traceroute,持續統計每一跳丟包率(排查間歇性丟包神器)
mtr www.example.comss:取代 netstat 的連線與監聽檢視#
# 列出所有 TCP 監聽埠與對應行程(確認服務有沒有起來)
ss -ltnp
# 查看某埠的連線狀態(大量 SYN_SENT 通常是被防火牆單向阻擋)
ss -tan state syn-sent
# 統計各狀態連線數,判斷是否有大量 TIME_WAIT 或半開連線
ss -stcpdump:抓包看真相#
# 抓特定主機與埠的封包,確認封包到底有沒有發出去 / 收到回應
tcpdump -i eth0 host 192.168.1.100 and port 80 -nn
# 只看 TCP 握手(SYN/SYN-ACK),判斷握手卡在哪一步
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0' -nn
# 存成檔案供 Wireshark 離線分析
tcpdump -i eth0 -w capture.pcapdig:DNS 解析驗證#
# 查詢域名 A 記錄,確認解析結果是否符合預期
dig www.example.com
# 指定 DNS 伺服器查詢,排除本機 DNS 設定干擾
dig @8.8.8.8 www.example.com
# 只看最終答案,並追蹤完整解析鏈
dig +short www.example.com
dig +trace www.example.com
tcpdump在高流量介面上不加過濾條件會瞬間刷屏並佔用資源,務必用host、port等表達式縮小範圍,並在生產環境留意抓包對效能與隱私的影響。
本節小結#
| 概念 | 關鍵點 |
|---|---|
| 分層診斷 | 由下而上逐層確認,下層不通則上層免談 |
| 八步流程 | 從物理連線到域名訪問,每步對應明確通斷結論 |
| 常見根因 | IP 衝突、遮罩錯、單向防火牆、硬體接觸不良 |
| 工具選擇 | 先 ping 後 tcpdump,先廣覆蓋後細定位 |
| 排查鐵律 | 先硬體後軟體、先本機後遠端、先簡單後複雜 |