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.8 | ISP 或路由問題 |
| 8.8.8.8 | google.com | DNS 解析問題 |
| 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:
0.0.0.0:80:監聽所有網路介面的 80 port(對外開放)127.0.0.1:3306:只監聽本機(MySQL 不對外開放,正確!)
從遠端測試 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
網路問題排查清單
遇到網路問題時,依序確認這些步驟:
-
本機網路堆疊
ping 127.0.0.1→ 通:OK / 不通:TCP/IP 設定問題 -
本地網路
ping 閘道IP→ 通:OK / 不通:線路或 DHCP 問題 -
Internet 連線
ping 8.8.8.8→ 通:OK / 不通:ISP 或路由問題 -
DNS 解析
dig google.com→ 有回應:OK / 無:檢查 /etc/resolv.conf -
服務監聽
ss -tlnp→ 服務確實在監聽:OK / 不在:服務未啟動 -
防火牆
ufw status或iptables -L→ 確認 port 是否被封鎖 -
應用程式
journalctl -u nginx -n 50→ 查看服務日誌找錯誤