为什么要学网络诊断命令
“网站打不开了”——这是你最不想听到的话。但是别慌,Linux提供了一整套网络诊断工具,按照正确的排查思路,大部分网络问题都能快速定位。
我的排查顺序通常是:ping → traceroute → ss/netstat → curl → tcpdump。
ping:最基本的连通性测试
1
2
3
4
5
6
7
8
9
10
11
| # 测试到目标的连通性
$ ping -c 4 google.com
PING google.com (142.250.80.46) 56(84) bytes of data.
64 bytes from lax17s55-in-f14.1e100.net: icmp_seq=1 ttl=116 time=1.23 ms
64 bytes from lax17s55-in-f14.1e100.net: icmp_seq=2 ttl=116 time=1.15 ms
64 bytes from lax17s55-in-f14.1e100.net: icmp_seq=3 ttl=116 time=1.18 ms
64 bytes from lax17s55-in-f14.1e100.net: icmp_seq=4 ttl=116 time=1.20 ms
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 1.150/1.190/1.230/0.029 ms
|
| 参数 | 作用 | 示例 |
|---|
-c N | 发送N个包后停止 | ping -c 4 host |
-i N | 间隔N秒发送 | ping -i 0.5 host |
-s N | 指定包大小 | ping -s 1400 host |
-W N | 超时时间(秒) | ping -W 3 host |
ping结果分析
1
2
3
4
| # 正常:0% packet loss, time < 100ms
# 延迟高:time > 200ms,可能线路问题
# 丢包:packet loss > 5%,网络不稳定
# 超时:100% packet loss,网络不通或对方禁ping
|
traceroute:追踪路由路径
1
2
3
4
5
6
7
8
9
10
| $ traceroute google.com
traceroute to google.com (142.250.80.46), 30 hops max, 60 byte packets
1 gateway (10.0.0.1) 0.523 ms 0.456 ms 0.412 ms
2 isp-router (203.0.113.1) 2.345 ms 2.234 ms 2.123 ms
3 core-router (198.51.100.1) 5.678 ms 5.567 ms 5.456 ms
4 google-edge (142.250.80.1) 8.901 ms 8.789 ms 8.678 ms
5 lax17s55-in-f14.1e100.net (142.250.80.46) 9.012 ms 8.901 ms 8.789 ms
# 如果某一跳显示 * * *,表示该路由器不回复ICMP
# 如果从某一跳开始全是超时,说明那里出了问题
|
1
2
3
4
5
6
7
8
9
10
| # mtr 是 ping + traceroute 的结合体,持续监测更直观
$ sudo apt install -y mtr
$ mtr google.com
My traceroute [v0.95]
Host Loss% Snt Last Avg Best Wrst StDev
1. gateway 0.0% 10 0.5 0.6 0.4 0.8 0.1
2. isp-router 0.0% 10 2.3 2.4 2.1 2.8 0.2
3. core-router 0.0% 10 5.6 5.7 5.4 6.2 0.3
4. google-edge 0.0% 10 8.9 9.0 8.7 9.5 0.2
5. lax17s55-in-f14.1e100.net 0.0% 10 9.0 9.1 8.8 9.6 0.2
|
ss/netstat:查看网络连接和端口
ss(Socket Statistics)是netstat的现代替代品,速度更快。
查看监听端口
1
2
3
4
5
6
| $ ss -tlnp
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=1234))
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=5678))
LISTEN 0 128 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=5678))
LISTEN 0 80 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=9012))
|
| 参数 | 含义 |
|---|
-t | TCP连接 |
-u | UDP连接 |
-l | 仅监听状态 |
-n | 显示数字(不解析域名) |
-p | 显示进程名 |
-a | 所有连接 |
查看已建立的连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 查看所有已建立的TCP连接
$ ss -tn state established
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 203.0.113.10:80 198.51.100.5:54321
0 0 203.0.113.10:22 192.0.2.100:12345
# 统计各状态的连接数
$ ss -s
Total: 168
TCP: 45 (estab 12, closed 8, orphaned 0, timewait 5)
Transport Total IP
RAW 0 0
UDP 4 4
TCP 37 37
INET 41 41
|
查看特定端口
1
2
3
4
5
6
7
8
| # 谁在用80端口?
$ ss -tlnp | grep :80
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=5678,fd=6))
# 或者用lsof
$ sudo lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 5678 www-data 6u IPv4 12345 0t0 TCP *:http (LISTEN)
|
curl:HTTP请求测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 测试网站是否可访问
$ curl -I https://example.com
HTTP/2 200
server: nginx/1.18.0
content-type: text/html; charset=utf-8
date: Sun, 01 Feb 2026 10:00:00 GMT
# 测试响应时间
$ curl -w "DNS: %{time_namelookup}s\n连接: %{time_connect}s\nTTFB: %{time_starttransfer}s\n总时间: %{time_total}s\n" \
-o /dev/null -s https://example.com
DNS: 0.012s
连接: 0.035s
TTFB: 0.156s
总时间: 0.234s
# 指定DNS解析(跳过DNS,直接测试IP)
$ curl -H "Host: example.com" http://203.0.113.10/
|
| 参数 | 作用 |
|---|
-I | 只显示响应头 |
-v | 显示详细过程 |
-o /dev/null | 丢弃响应体 |
-s | 静默模式 |
-w | 自定义输出格式 |
-k | 忽略SSL错误 |
-L | 跟随重定向 |
ip/ifconfig:网络接口信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| # 查看IP地址(推荐用ip命令)
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP>
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>
inet 203.0.113.10/24 brd 203.0.113.255 scope global eth0
# 查看路由表
$ ip route show
default via 203.0.113.1 dev eth0
203.0.113.0/24 dev eth0 proto kernel scope link src 203.0.113.10
# 查看网络流量统计
$ ip -s link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>
RX: bytes packets errors dropped
1234567890 987654 0 0
TX: bytes packets errors dropped
987654321 876543 0 0
|
dig/nslookup:DNS查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 查询A记录
$ dig example.com
;; ANSWER SECTION:
example.com. 300 IN A 203.0.113.10
# 简洁输出
$ dig +short example.com
203.0.113.10
# 查询特定DNS服务器
$ dig @8.8.8.8 example.com
# 查询MX记录
$ dig example.com MX
# 反向查询
$ dig -x 203.0.113.10
|
tcpdump:网络抓包
网络问题排查的终极武器:
1
2
3
4
5
6
7
8
9
10
11
12
| # 抓取80端口的数据包
$ sudo tcpdump -i eth0 port 80 -n
tcpdump: verbose output suppressed
10:00:01.123456 IP 198.51.100.5.54321 > 203.0.113.10.80: Flags [S], seq 12345
10:00:01.123567 IP 203.0.113.10.80 > 198.51.100.5.54321: Flags [S.], seq 67890
10:00:01.123678 IP 198.51.100.5.54321 > 203.0.113.10.80: Flags [.], ack 1
# 抓取特定IP的数据包
$ sudo tcpdump -i eth0 host 198.51.100.5 -n
# 保存到文件(后续用Wireshark分析)
$ sudo tcpdump -i eth0 port 80 -w /tmp/capture.pcap -c 100
|
网络排查流程
遇到"网站打不开"时,按这个顺序排查:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 1. 检查本机网络
$ ping 8.8.8.8
# 2. 检查DNS解析
$ dig example.com +short
# 3. 检查端口是否在监听
$ ss -tlnp | grep :80
# 4. 检查防火墙
$ sudo ufw status
# 5. 检查服务状态
$ systemctl status nginx
# 6. 检查应用日志
$ tail -20 /var/log/nginx/error.log
# 7. 测试HTTP响应
$ curl -v http://localhost
|
| 问题 | 可能原因 | 检查方法 |
|---|
| ping不通 | 网络不通/禁ping | 检查路由和防火墙 |
| DNS解析失败 | DNS配置错误 | dig/nslookup |
| 端口不通 | 服务没启/防火墙 | ss -tlnp/ufw |
| 连接超时 | 网络慢/服务器过载 | mtr/htop |
| 返回错误 | 应用层问题 | 查看应用日志 |
总结
网络诊断的核心工具就是这几个。记住排查思路比死记命令更重要:从底层(网络连通性)往上层(应用层)逐步排查。
更多Linux命令可以参考Linux最常用的50个命令速查表。关于防火墙的详细配置,推荐阅读Linux防火墙配置教程。