Linux 網路診斷基礎:ping、ss、dig、curl 實戰指南

從哪一層開始排查?

網路問題很多時候讓人無從下手。有一個系統化的方法:從底層往上層一步步確認

第 5 層(應用層):HTTP 應用是否正確?        ← curl
第 4 層(傳輸層):TCP/UDP port 是否開放?    ← ss、nc
第 3 層(網路層):IP 路由是否正確?           ← traceroute、ip route
第 2 層(連結層):本地網路是否通?            ← ping 閘道、ARP
第 1 層(實體層):線路是否插好?              ← ip link show

大多數問題集中在第 3 到 5 層。

第一步:確認基本連線(ping)

測試本機網路堆疊

$ ping -c 3 127.0.0.1
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms

如果 loopback(127.0.0.1)都 ping 不通,代表 TCP/IP 網路堆疊本身有問題。

測試到閘道

$ ip route show | grep default
default via 192.168.1.1 dev eth0
$ ping -c 3 192.168.1.1   # ping 閘道 IP

測試到外部 IP(跳過 DNS)

$ ping -c 3 8.8.8.8   # 測試能否到達 Google DNS

如果這一步通,代表路由正常;若不通,問題在路由或防火牆。

能 ping 通不能 ping 通問題所在
127.0.0.1閘道本機網路設定或線路
閘道8.8.8.8ISP 或路由問題
8.8.8.8google.comDNS 解析問題
google.com你的服務防火牆或應用程式問題

第二步:路由追蹤(traceroute / mtr)

知道封包沿途經過哪些路由器,哪一跳開始出問題:

$ traceroute -n google.com
 1  192.168.1.1      0.5 ms
 2  10.0.0.1         3.2 ms
 3  203.0.113.5      8.4 ms
 4  * * *            (此節點不回應 ICMP)
 5  142.250.185.46   8.8 ms

* * * 表示路由器封鎖了 traceroute 的探測封包,不一定代表有問題(很多路由器這樣設定)。

更強大的工具是 mtr,可以即時監控每個節點的封包遺失率:

$ mtr -n --report -c 10 google.com

第三步:DNS 解析(dig / nslookup)

能 ping 到外部 IP 但不能連到網域名稱,是 DNS 問題。

用 dig 診斷 DNS

$ dig google.com
;; ANSWER SECTION:
google.com.    299    IN    A    142.250.185.46

;; Query time: 8 msec
;; SERVER: 192.168.1.1#53(這是你的 DNS 伺服器)

指定公開 DNS 排除本地 DNS 問題:

$ dig @8.8.8.8 google.com +short
142.250.185.46

如果指定 8.8.8.8 可以解析,但預設不行,代表你的本地 DNS 伺服器有問題。

確認 DNS 設定

$ cat /etc/resolv.conf
nameserver 192.168.1.1
nameserver 8.8.8.8

第四步:查看監聽 port(ss)

確認服務是否真的在監聽,以及監聽哪個位址和 port:

$ sudo ss -tlnp   # TCP 監聽 port 及對應程序
State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
LISTEN  0       128     0.0.0.0:22          0.0.0.0:*          users:(("sshd",pid=1001))
LISTEN  0       511     0.0.0.0:80          0.0.0.0:*          users:(("nginx",pid=1234))
LISTEN  0       128     127.0.0.1:3306      0.0.0.0:*          users:(("mysqld",pid=5678))

注意 Local Address

從遠端測試 port 是否可連線

$ nc -zv target-server 80
Connection to target-server 80 port [tcp/http] succeeded!

第五步:測試 HTTP(curl)

確認 HTTP/HTTPS 服務是否正常回應:

$ curl -I https://yoursite.com  # 只取 HTTP 標頭
HTTP/2 200
server: nginx/1.18.0
content-type: text/html
...
$ curl -vs https://yoursite.com 2>&1 | head -30  # 詳細模式(含 TLS 握手)
$ curl -o /dev/null -w "HTTP狀態碼: %{http_code}\n回應時間: %{time_total}秒\n" https://yoursite.com
HTTP狀態碼: 200
回應時間: 0.245秒

查看網路介面與路由

$ ip -br -c addr   # 查看所有介面的 IP(簡潔彩色版)
lo               UNKNOWN  127.0.0.1/8 ::1/128
eth0             UP       192.168.1.100/24
$ ip route show   # 查看路由表
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100

網路問題排查清單

📋 遇到網路問題時,依序確認這些步驟:
  1. 本機網路堆疊
    ping 127.0.0.1 → 通:OK / 不通:TCP/IP 設定問題
  2. 本地網路
    ping 閘道IP → 通:OK / 不通:線路或 DHCP 問題
  3. Internet 連線
    ping 8.8.8.8 → 通:OK / 不通:ISP 或路由問題
  4. DNS 解析
    dig google.com → 有回應:OK / 無:檢查 /etc/resolv.conf
  5. 服務監聽
    ss -tlnp → 服務確實在監聽:OK / 不在:服務未啟動
  6. 防火牆
    ufw statusiptables -L → 確認 port 是否被封鎖
  7. 應用程式
    journalctl -u nginx -n 50 → 查看服務日誌找錯誤