网络故障排查架构实战:ping、traceroute、dig、nslookup、telnet诊断指南

一、网络故障排查概述

1.1 网络故障分类

网络故障通常分为以下几个层次:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
网络故障分类:
物理层故障:
- 网线断开
- 网卡故障
- 交换机端口故障

链路层故障:
- ARP解析失败
- MAC地址冲突
- VLAN配置错误

网络层故障:
- IP地址冲突
- 路由配置错误
- 防火墙规则
- 网络不可达

传输层故障:
- 端口未监听
- 防火墙阻断
- NAT转换失败

应用层故障:
- DNS解析失败
- 服务不可用
- SSL/TLS握手失败
- 认证失败

1.2 网络故障排查流程

排查原则

  1. 从底层到高层逐层排查
  2. 先本地后远程
  3. 先简单后复杂
  4. 记录排查过程

二、ping连通性测试

2.1 ping基础使用

ping命令语法

1
2
3
4
5
6
7
8
9
# 基本用法
ping [选项] 目标地址

# 常用选项
ping -c 4 www.baidu.com # 发送4个包
ping -i 2 www.baidu.com # 间隔2秒
ping -s 1500 www.baidu.com # 包大小1500字节
ping -t 5 www.baidu.com # TTL值5
ping -w 10 www.baidu.com # 超时10秒

ping测试示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 测试本地环回接口
ping -c 4 127.0.0.1

# 测试网关
ping -c 4 192.168.1.1

# 测试外网
ping -c 4 8.8.8.8

# 测试域名
ping -c 4 www.baidu.com

# 详细输出
ping -vv www.baidu.com

2.2 ping结果分析

正常情况分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ ping -c 4 www.baidu.com
PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data.
64 bytes from 110.242.68.3: icmp_seq=1 ttl=52 time=24.5 ms
64 bytes from 110.242.68.3: icmp_seq=2 ttl=52 time=24.3 ms
64 bytes from 110.242.68.3: icmp_seq=3 ttl=52 time=24.2 ms
64 bytes from 110.242.68.3: icmp_seq=4 ttl=52 time=24.4 ms

--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 24.200/24.350/24.500/0.119 ms

# 分析:
# - 4个包全部收到,0%丢包
# - 平均延迟24.35ms,延迟稳定
# - TTL=52,距离适中

异常情况分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 请求超时
Request timeout for icmp_seq 1
# 可能原因:网络不通、防火墙阻断、目标主机宕机

# 2. 高丢包率
4 packets transmitted, 2 received, 50% packet loss
# 可能原因:网络拥塞、链路质量差

# 3. 高延迟
time=2500.5 ms
# 可能原因:网络拥塞、链路距离远、带宽不足

# 4. 无法解析域名
ping: cannot resolve www.example.com: Unknown host
# 可能原因:DNS配置错误、DNS服务器故障

2.3 高级ping诊断

按接口ping测试

1
2
3
4
5
6
7
8
9
10
11
12
# 指定网络接口
ping -I eth0 www.baidu.com
ping -I wlan0 www.baidu.com

# IPv6测试
ping6 2001:4860:4860::8888

# 记录路由信息
ping -R www.baidu.com

# 获取时间戳
ping -D www.baidu.com

批量ping测试脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
# batch_ping.sh - 批量ping测试脚本

HOSTS=(
"192.168.1.1"
"8.8.8.8"
"www.baidu.com"
"www.google.com"
)

echo "=== 批量Ping测试 ==="
for host in "${HOSTS[@]}"; do
echo "Ping $host..."
if ping -c 1 -W 2 "$host" > /dev/null 2>&1; then
echo " ✓ $host is UP"
else
echo " ✗ $host is DOWN"
fi
done

三、traceroute路径追踪

3.1 traceroute基础使用

traceroute命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 基本用法
traceroute www.baidu.com

# 指定最大跳数
traceroute -m 15 www.baidu.com

# 指定第一个TTL值
traceroute -f 3 www.baidu.com

# 指定超时时间
traceroute -w 5 www.baidu.com

# 显示IP地址
traceroute -n www.baidu.com

# 指定数据包大小
traceroute -p 1500 www.baidu.com

3.2 traceroute结果分析

正常traceroute示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ traceroute www.baidu.com
traceroute to www.a.shifen.com (110.242.68.3), 30 hops max, 60 byte packets
1 gateway (192.168.1.1) 0.358 ms 0.452 ms 0.493 ms
2 10.10.10.1 (10.10.10.1) 5.234 ms 5.345 ms 5.456 ms
3 20.20.20.1 (20.20.20.1) 12.345 ms 12.456 ms 12.567 ms
4 * * * # 中间节点不响应(正常)
5 30.30.30.1 (30.30.30.1) 24.123 ms 24.234 ms 24.345 ms
6 ......
12 www.a.shifen.com (110.242.68.3) 24.500 ms 24.600 ms 24.700 ms

# 分析:
# - 路径共12跳
# - 每跳都有3次RTT值
# - 最终到达目标主机

异常traceroute分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1. 中间节点超时
4 * * *
5 * * *
# 可能原因:防火墙屏蔽ICMP、中间节点不响应

# 2. 往返延迟突增
8 20 ms
9 2500 ms # 延迟突然增加
10 2500 ms
# 可能原因:网络拥塞、链路故障

# 3. 到达目标前中断
8 * * *
9 * * *
# 可能原因:目标主机不可达、防火墙阻断

# 4. 无限循环
15 * * *
16 * * *
17 * * *
# 可能原因:路由环路、配置错误

3.3 高级traceroute技巧

mtr实时追踪

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装mtr
sudo apt-get install mtr

# 使用mtr (结合ping和traceroute)
mtr www.baidu.com

# 指定报告次数
mtr -r -c 10 www.baidu.com

# 指定包大小
mtr -s 1500 www.baidu.com

# ASCII报告格式
mtr -rw www.baidu.com

traceroute脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash
# traceroute_analysis.sh - 路径分析脚本

TARGET_HOST="${1:-www.baidu.com}"
LOG_FILE="/tmp/traceroute_${TARGET_HOST}.log"

echo "=== Traceroute分析:$TARGET_HOST ==="
traceroute -n -m 30 "$TARGET_HOST" | tee "$LOG_FILE"

echo ""
echo "=== 分析结果 ==="

# 提取所有IP
IPS=$(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' "$LOG_FILE" | sort -u)

echo "路径节点:"
echo "$IPS"

# 分析每个节点
echo ""
echo "节点延迟分析:"
for ip in $IPS; do
if [[ "$ip" != *.*.*.* ]]; then
continue
fi

avg_time=$(grep "$ip" "$LOG_FILE" | grep -oE '[0-9]+.[0-9]+' | awk '{sum+=$1; count++} END {print sum/count}')
if [[ -n "$avg_time" ]]; then
printf " %s: %.2f ms\n" "$ip" "$avg_time"
fi
done

四、DNS查询工具

4.1 dig命令详解

dig基础使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 基础查询
dig www.baidu.com

# 指定DNS服务器
dig @8.8.8.8 www.baidu.com

# 指定记录类型
dig www.baidu.com A
dig www.baidu.com AAAA
dig www.baidu.com MX
dig www.baidu.com NS

# 反向解析
dig -x 8.8.8.8

# 简洁输出
dig +short www.baidu.com

# 跟踪递归查询
dig +trace www.baidu.com

dig详细输出分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ dig www.baidu.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.baidu.com. IN A

;; ANSWER SECTION:
www.baidu.com. 600 IN CNAME www.a.shifen.com.
www.a.shifen.com. 600 IN A 110.242.68.3
www.a.shifen.com. 600 IN A 110.242.68.4

;; Query time: 24 msec
;; SERVER: 223.5.5.5#53(223.5.5.5)
;; WHEN: Wed Nov 14 10:00:00 CST 2023
;; MSG SIZE rcvd: 127

# 输出分析:
# NOERROR: 查询成功
# QUERY: 1 表示1个查询
# ANSWER: 3 表示3条记录
# TTL: 600秒
# Query time: 24ms 查询时间

4.2 nslookup命令

nslookup基础使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 基础查询
nslookup www.baidu.com

# 指定DNS服务器
nslookup www.baidu.com 8.8.8.8

# 交互模式
nslookup
> set type=A
> www.baidu.com
> set type=MX
> baidu.com
> server 8.8.8.8
> www.baidu.com
> exit

# 反向查询
nslookup 8.8.8.8

# 查询MX记录
nslookup -type=MX baidu.com

# 查询NS记录
nslookup -type=NS baidu.com

nslookup输出分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ nslookup www.baidu.com
Server: 223.5.5.5
Address: 223.5.5.5#53

Non-authoritative answer:
Name: www.a.shifen.com
Address: 110.242.68.3
Address: 110.242.68.4

# 输出分析:
# Server: 使用的DNS服务器
# Non-authoritative: 非权威答案(从缓存获取)
# Name: 解析到的真实域名(CNAME)
# Address: IP地址列表

4.3 DNS诊断脚本

完整的DNS诊断脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/bin/bash
# dns_diagnosis.sh - DNS诊断脚本

DOMAIN="${1:-www.baidu.com}"
DNS_SERVERS=("223.5.5.5" "8.8.8.8" "1.1.1.1")

echo "=== DNS诊断:$DOMAIN ==="
echo ""

# 1. 检查hosts文件
echo "1. 检查hosts文件:"
if grep -q "$DOMAIN" /etc/hosts; then
echo " 找到hosts记录:"
grep "$DOMAIN" /etc/hosts
else
echo " 未找到hosts记录"
fi
echo ""

# 2. 查询本地DNS缓存
echo "2. 查询DNS缓存:"
# Linux
if command -v systemd-resolve &> /dev/null; then
systemd-resolve --statistics | grep -A 10 "Cache"
fi
echo ""

# 3. 使用dig查询
echo "3. Dig查询结果:"
for dns in "${DNS_SERVERS[@]}"; do
echo " DNS服务器: $dns"
dig +noall +answer "@$dns" "$DOMAIN" A
echo ""
done

# 4. 使用nslookup查询
echo "4. Nslookup查询结果:"
nslookup "$DOMAIN"
echo ""

# 5. 查询不同记录类型
echo "5. 查询所有记录类型:"
echo " A记录:"
dig +short "$DOMAIN" A

echo " AAAA记录:"
dig +short "$DOMAIN" AAAA

echo " MX记录:"
dig +short "$DOMAIN" MX

echo " NS记录:"
dig +short "$DOMAIN" NS

# 6. 跟踪DNS解析
echo ""
echo "6. DNS解析跟踪:"
dig +trace "$DOMAIN"

五、telnet端口测试

5.1 telnet基础使用

telnet连接测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 测试HTTP端口
telnet www.baidu.com 80

# 测试HTTPS端口
telnet www.baidu.com 443

# 测试SSH端口
telnet 192.168.1.10 22

# 测试数据库端口
telnet 192.168.1.20 3306

# 设置超时
telnet -t 10 www.baidu.com 80

# IPv6测试
telnet -6 2001:db8::1 80

telnet交互示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ telnet www.baidu.com 80
Trying 110.242.68.3...
Connected to www.a.shifen.com.
Escape character is '^]'.

# 连接成功后可以发送HTTP请求
GET / HTTP/1.1
Host: www.baidu.com
Connection: close

HTTP/1.1 200 OK
Content-Type: text/html
...
# 响应内容
Connection closed by foreign host.

5.2 nc(netcat)工具

nc命令使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 基本端口扫描
nc -zv www.baidu.com 80

# 扫描端口范围
nc -zv 192.168.1.10 20-30

# 测试UDP端口
nc -zvu www.baidu.com 53

# 扫描超时设置
nc -zvn -w 3 www.baidu.com 80

# 监听端口(服务器端)
nc -l -p 8888

# 连接端口(客户端)
nc 192.168.1.10 8888

nc详细输出

1
2
3
4
5
6
7
8
9
$ nc -zv www.baidu.com 80
Connection to www.a.shifen.com 80 port [tcp/http] succeeded!

$ nc -zv www.baidu.com 8080
nc: connect to www.a.shifen.com port 8080 (tcp) failed: Connection refused

# 分析:
# succeeded: 端口开放
# Connection refused: 端口关闭或被拒绝

六、网络故障排查实战

6.1 完整排查流程

网络故障排查步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/bash
# network_troubleshoot.sh - 网络故障排查脚本

TARGET="${1:-www.baidu.com}"
LOG_FILE="/tmp/network_check.log"

echo "=== 网络故障排查:$TARGET ===" | tee "$LOG_FILE"
echo ""

# 1. 检查网络接口
echo "1. 网络接口检查:" | tee -a "$LOG_FILE"
ip addr show | tee -a "$LOG_FILE"
echo ""

# 2. 检查路由表
echo "2. 路由表检查:" | tee -a "$LOG_FILE"
ip route show | tee -a "$LOG_FILE"
echo ""

# 3. 检查ARP表
echo "3. ARP表检查:" | tee -a "$LOG_FILE"
arp -a | tee -a "$LOG_FILE"
echo ""

# 4. Ping测试
echo "4. Ping连通性测试:" | tee -a "$LOG_FILE"
ping -c 4 "$TARGET" | tee -a "$LOG_FILE"
echo ""

# 5. Traceroute追踪
echo "5. Traceroute路径追踪:" | tee -a "$LOG_FILE"
traceroute -n "$TARGET" | tee -a "$LOG_FILE"
echo ""

# 6. DNS查询
echo "6. DNS查询测试:" | tee -a "$LOG_FILE"
dig +short "$TARGET" | tee -a "$LOG_FILE"
echo ""

# 7. 端口测试
echo "7. 端口测试:" | tee -a "$LOG_FILE"
for port in 80 443 22; do
echo " 测试端口 $port:"
nc -zv -w 3 "$TARGET" "$port" 2>&1 | tee -a "$LOG_FILE"
done
echo ""

echo "排查完成,日志保存到:$LOG_FILE"

6.2 常见故障案例

案例1:DNS解析失败

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 症状
$ ping www.example.com
ping: www.example.com: Name or service not known

# 排查步骤
# 1. 检查DNS配置
cat /etc/resolv.conf

# 2. 测试DNS服务器
ping 8.8.8.8

# 3. 查询DNS
dig www.example.com
dig @8.8.8.8 www.example.com

# 4. 检查hosts文件
grep example.com /etc/hosts

# 解决方案
# - 配置正确的DNS服务器
sudo echo "nameserver 8.8.8.8" >> /etc/resolv.conf

# - 清除DNS缓存
sudo systemd-resolve --flush-caches

案例2:网络超时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 症状
$ ping www.baidu.com
Request timeout

# 排查步骤
# 1. 检查本地网络
ping 127.0.0.1

# 2. 检查网关
ping 192.168.1.1

# 3. 检查外网
ping 8.8.8.8

# 4. 查看路由
traceroute www.baidu.com

# 解决方案
# - 检查防火墙
sudo iptables -L
sudo systemctl status firewall

# - 重启网络
sudo systemctl restart NetworkManager
sudo systemctl restart network

案例3:端口不可达

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 症状
$ telnet www.baidu.com 8080
Connection refused

# 排查步骤
# 1. 测试80端口
telnet www.baidu.com 80

# 2. 本地测试端口
netstat -tuln | grep 8080

# 3. 检查防火墙
sudo iptables -L -n
sudo firewall-cmd --list-all

# 解决方案
# - 开放防火墙端口
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload

# - 检查服务是否监听
sudo systemctl status nginx
sudo ss -tuln | grep 8080

七、高级网络诊断

7.1 网络性能测试

带宽测试工具

1
2
3
4
5
6
7
8
9
10
11
12
13
# 使用iperf3测试带宽
# 服务器端
iperf3 -s -p 5201

# 客户端
iperf3 -c server_ip -p 5201 -t 60 -i 10

# 测试UDP
iperf3 -c server_ip -u -b 100M

# 使用speedtest-cli
speedtest-cli
speedtest-cli --server-id=12345

网络延迟测试

1
2
3
4
5
6
7
8
# 使用fping测试延迟
fping -c 10 www.baidu.com

# 使用hping进行延迟分析
hping3 -S -p 80 -c 10 www.baidu.com

# 网络质量监控
mtr --report --report-cycles 100 www.baidu.com

7.2 网络抓包分析

tcpdump使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 抓取所有流量
sudo tcpdump -i any -w capture.pcap

# 抓取特定主机流量
sudo tcpdump -i eth0 host 192.168.1.100

# 抓取特定端口
sudo tcpdump -i eth0 port 80

# 抓取HTTP流量
sudo tcpdump -i eth0 -A 'tcp port 80'

# 抓取DNS查询
sudo tcpdump -i eth0 udp port 53

# 抓取并显示内容
sudo tcpdump -i eth0 -X

wireshark分析

1
2
3
4
5
6
7
8
9
10
11
# 安装wireshark
sudo apt-get install wireshark

# 从pcap文件分析
wireshark capture.pcap

# 命令行分析
tshark -r capture.pcap -Y "http.request" -V

# 统计分析
capinfos capture.pcap

八、总结

网络故障排查是运维工程师的核心技能,本文涵盖了:

核心工具

  1. ping:连通性测试、丢包检测、延迟分析
  2. traceroute:路径追踪、节点定位、瓶颈分析
  3. dig:DNS查询、解析跟踪、记录类型查询
  4. nslookup:交互式DNS查询、配置检查
  5. telnet/nc:端口连通性测试、服务可用性检查

排查思路

  1. 分层次排查:从物理层到应用层
  2. 由内而外:本地→网关→外网
  3. 综合利用工具:多种工具交叉验证
  4. 记录日志:便于问题回溯

实践建议

  1. 建立网络监控体系
  2. 记录正常的网络基准值
  3. 定期进行网络健康检查
  4. 制定网络故障应急预案

通过系统的网络诊断方法,可以快速定位和解决网络故障,保障业务稳定运行。