主题模式
Are you an LLM? You can read better optimized documentation at /vps/tools/network-diagnostic-toolkit.md for this page in Markdown format
网络诊断工具箱:从连通性到深度抓包的全链路排查指南
网络出问题了,只会 ping 和 traceroute 可不够。从「网断了」到「为什么慢」,需要一整套诊断工具层层递进地排查。本文按从简单到复杂的顺序,汇总网络诊断中最实用的工具,每个都配实战案例。
🔍 诊断思路:分层排查
网络问题排查遵循 OSI 七层模型,从下往上逐层定位:
┌─────────────────────────────────┐
│ 7. 应用层 → curl, telnet │ 服务是否正常?
├─────────────────────────────────┤
│ 4. 传输层 → ss, nmap │ 端口是否开放?
├─────────────────────────────────┤
│ 3. 网络层 → ping, mtr, dig │ 路由是否可达?
├─────────────────────────────────┤
│ 2. 数据链路层 → ip, ethtool │ 网卡是否正常?
├─────────────────────────────────┤
│ 1. 物理层 → ethtool, 灯号 │ 网线插好了吗?
└─────────────────────────────────┘📡 第一层:连通性测试
1. ping — 基础连通性检测
最基础但最常用的工具,测试目标主机是否可达。
bash
# 基础用法
ping 8.8.8.8
# 指定次数(Linux 默认无限 ping)
ping -c 5 8.8.8.8
# 指定包大小(测试 MTU 问题)
ping -s 1472 -M do 8.8.8.8
# 指定间隔(快速检测)
ping -c 10 -i 0.2 8.8.8.8
# 指定超时(适合脚本)
ping -c 1 -W 2 8.8.8.8实战场景:MTU 问题排查
某些网络(如 PPPoE、VPN)的 MTU 小于 1500,导致大包丢失但小包正常:
bash
# 逐步减小包大小测试
ping -s 1472 -M do google.com # 失败
ping -s 1452 -M do google.com # 成功 → MTU = 1452 + 28 = 1480
ping -s 1400 -M do google.com # 成功2. traceroute / mtr — 路由追踪
traceroute:查看数据包经过的每一跳
bash
# 基础用法
traceroute 8.8.8.8
# 使用 TCP SYN(绕过 ICMP 限制)
traceroute -T -p 443 8.8.8.8
# 指定最大跳数
traceroute -m 15 8.8.8.8
# 查询 AS 号(运营商信息)
traceroute -A 8.8.8.8mtr:traceroute + ping 的结合体(强烈推荐)
mtr 是网络诊断的瑞士军刀,实时显示每一跳的丢包率和延迟:
bash
# 基础用法
mtr 8.8.8.8
# 报告模式(适合保存结果)
mtr -r -c 10 8.8.8.8
# TCP 模式(ICMP 被限速时使用)
mtr -T -P 443 google.com
# UDP 模式
mtr -u google.com
# 显示 AS 号
mtr -z 8.8.8.8输出解读:
| 列名 | 含义 |
|---|---|
| Host | 每一跳的主机名/IP |
| Loss% | 丢包率 |
| Snt | 发送的数据包数 |
| Last | 最近一个包的延迟 |
| Avg | 平均延迟 |
| Best | 最低延迟 |
| Wrst | 最差延迟 |
| StDev | 延迟标准差(抖动) |
mtr 诊断技巧
- 中间节点丢包但终点不丢:通常是中间路由器限速 ICMP,不是真正的丢包
- 终点丢包:才是真正的问题,说明目标主机或最后几跳有故障
- 延迟突增:某跳延迟突然飙升,说明该节点拥塞或路由异常
3. dig / nslookup — DNS 诊断
bash
# 基础 DNS 查询
dig example.com
# 查询特定记录类型
dig MX example.com # 邮件记录
dig TXT example.com # TXT 记录
dig NS example.com # NS 记录
dig AAAA example.com # IPv6 记录
# 指定 DNS 服务器查询
dig @8.8.8.8 example.com
# 反向 DNS 查询
dig -x 8.8.8.8
# 只输出 IP(适合脚本)
dig +short example.com
# 追踪 DNS 解析过程
dig +trace example.com
# 测试 DNSSEC
dig +dnssec example.com实战场景:CDN 节点排查
bash
# 对比不同 DNS 的解析结果
dig +short @8.8.8.8 cdn.example.com # Google DNS
dig +short @1.1.1.1 cdn.example.com # Cloudflare DNS
dig +short @114.114.114.114 cdn.example.com # 国内 DNS
# 如果结果不同,说明 CDN 智能调度生效🔌 第二层:端口与服务检测
4. ss — 网络连接统计(替代 netstat)
bash
# 查看所有连接
ss -tulpn
# 查看监听端口
ss -tlnp # TCP
ss -ulnp # UDP
# 查看已建立的连接
ss -tnp
# 按状态过滤
ss -tn state established
ss -tn state time-wait
ss -tn state close-wait
# 统计各状态连接数
ss -s
# 按端口过滤
ss -tlnp 'sport = :443'
ss -tlnp 'dport = :443'
# 查看特定进程的连接
ss -tlnp | grep nginx输出字段解读:
| 字段 | 含义 |
|---|---|
| Netid | 协议(tcp/udp) |
| State | 连接状态 |
| Recv-Q | 接收队列(非0表示堆积) |
| Send-Q | 发送队列(非0表示堆积) |
| Local | 本地地址:端口 |
| Peer | 对端地址:端口 |
| Process | 进程信息 |
Recv-Q / Send-Q 排查
- Recv-Q 持续 > 0:应用读取速度跟不上网络接收速度,可能 CPU 不够或应用阻塞
- Send-Q 持续 > 0:对端接收慢或网络拥塞
5. nmap — 端口扫描与服务识别
bash
# 扫描常用端口
nmap 192.168.1.100
# 扫描指定端口
nmap -p 22,80,443,3306 192.168.1.100
# 扫描端口范围
nmap -p 1-1000 192.168.1.100
# 扫描全部端口
nmap -p- 192.168.1.100
# 服务版本识别
nmap -sV 192.168.1.100
# 操作系统识别
nmap -O 192.168.1.100
# 综合扫描(服务+系统+脚本)
nmap -A 192.168.1.100
# SYN 半开扫描(隐蔽扫描)
nmap -sS 192.168.1.100
# UDP 端口扫描
nmap -sU 192.168.1.100
# 扫描网段
nmap -sn 192.168.1.0/24 # 只做主机发现
nmap 192.168.1.0/24 # 扫描所有主机的常用端口实战场景:安全审计
bash
# 检查服务器暴露了哪些端口
nmap -sV -p- your-server.com
# 检查防火墙是否生效
nmap -p 22,80,443 your-server.com
# 发现内网存活主机
nmap -sn 192.168.1.0/246. telnet / nc — 端口连通性测试
bash
# telnet 测试端口
telnet 192.168.1.100 443
# nc (netcat) 更灵活
nc -zv 192.168.1.100 443 # 测试单个端口
nc -zv 192.168.1.100 22 80 443 # 测试多个端口
nc -zv 192.168.1.100 1-1000 # 测试端口范围
# nc 传输文件
# 接收端
nc -l 8888 > file.txt
# 发送端
nc 192.168.1.100 8888 < file.txt
# nc 测试 HTTP
echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80📊 第三层:带宽与性能测试
7. iperf3 — 带宽测试工具
bash
# 服务端(在目标机器上运行)
iperf3 -s
# 客户端(测试上传带宽)
iperf3 -c 192.168.1.100
# 测试下载带宽(反向)
iperf3 -c 192.168.1.100 -R
# 双向同时测试
iperf3 -c 192.168.1.100 --bidir
# UDP 测试(测试丢包和抖动)
iperf3 -c 192.168.1.100 -u -b 100M
# 长时间测试
iperf3 -c 192.168.1.100 -t 60 -i 5
# 并发多线程
iperf3 -c 192.168.1.100 -P 4实战场景:网络带宽验证
bash
# 1. 在服务器上启动 iperf3 服务
iperf3 -s
# 2. 从客户端测试
iperf3 -c server-ip -t 30
# 3. 解读结果
[ 5] 0.00-30.00 sec 3.15 GBytes 902 Mbits/sec receiver
# 带宽约 900Mbps,接近千兆理论值8. curl — HTTP 性能测试
bash
# 测试 HTTP 响应时间
curl -o /dev/null -s -w "DNS: %{time_namelookup}s\n连接: %{time_connect}s\nTLS: %{time_appconnect}s\n首字节: %{time_starttransfer}s\n总计: %{time_total}s\n" https://example.com
# 只看 HTTP 状态码
curl -o /dev/null -s -w "%{http_code}\n" https://example.com
# 跟随重定向
curl -L -o /dev/null -s -w "%{url_effective}\n" https://example.com
# 测试 HTTP/2
curl --http2 -I https://example.com
# 测试 HTTP/3
curl --http3 -I https://example.com
# 模拟不同 User-Agent
curl -A "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0)" https://example.com
# 发送 POST 请求
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com
# 下载测速
curl -o /dev/null -w "速度: %{speed_download} bytes/s\n" https://speed.cloudflare.com/__down?bytes=10000000响应时间诊断标准:
| 指标 | 优秀 | 正常 | 需排查 |
|---|---|---|---|
| DNS 解析 | < 50ms | < 200ms | > 500ms |
| TCP 连接 | < 50ms | < 200ms | > 500ms |
| TLS 握手 | < 100ms | < 300ms | > 800ms |
| 首字节时间 (TTFB) | < 200ms | < 500ms | > 1000ms |
🔬 第四层:深度抓包分析
9. tcpdump — 命令行抓包
bash
# 抓取指定网卡的流量
tcpdump -i eth0
# 抓取指定端口的流量
tcpdump -i eth0 port 443
# 抓取指定 IP 的流量
tcpdump -i eth0 host 192.168.1.100
# 抓取来源 IP
tcpdump -i eth0 src host 192.168.1.100
# 抓取目标 IP
tcpdump -i eth0 dst host 192.168.1.100
# 组合过滤
tcpdump -i eth0 host 192.168.1.100 and port 443
# 抓取 SYN 包(连接建立)
tcpdump -i eth0 'tcp[tcpflags] == tcp-syn'
# 抓取 HTTP 请求
tcpdump -i eth0 port 80 -A
# 写入文件(用 Wireshark 分析)
tcpdump -i eth0 port 443 -w capture.pcap
# 读取抓包文件
tcpdump -r capture.pcap
# 限制抓包数量
tcpdump -i eth0 -c 100 port 443实战场景:HTTPS 握手分析
bash
# 抓取 TLS 握手过程
tcpdump -i eth0 'tcp port 443 and (tcp[((tcp[12:1] & 0xf0) >> 2):1] = 0x16)' -w tls.pcap
# 抓取 DNS 查询
tcpdump -i eth0 port 53 -vv10. Wireshark — 图形化抓包分析
Wireshark 是最强大的网络协议分析工具,配合 tcpdump 在服务器抓包后下载分析:
基本使用流程:
- 服务器抓包:
tcpdump -i eth0 port 443 -w capture.pcap - 下载文件:
scp server:capture.pcap . - 本地用 Wireshark 打开
capture.pcap
常用过滤规则:
| 过滤表达式 | 功能 |
|---|---|
ip.addr == 192.168.1.100 | 指定 IP |
tcp.port == 443 | 指定端口 |
http.request.method == "GET" | HTTP GET 请求 |
http.response.code == 200 | HTTP 200 响应 |
tls.handshake.type == 1 | TLS Client Hello |
dns.qry.name == "example.com" | DNS 查询指定域名 |
tcp.flags.syn == 1 | SYN 包 |
tcp.flags.reset == 1 | RST 包(连接被重置) |
tcp.analysis.retransmission | TCP 重传 |
tcp.analysis.duplicate_ack | 重复 ACK |
实战场景:排查 HTTPS 连接被重置
1. 过滤: tcp.port == 443 and tcp.flags.reset == 1
2. 查看 RST 包的来源
3. 如果是服务端发出 → 服务端拒绝连接(证书问题、WAF 拦截)
4. 如果是中间设备发出 → 防火墙/GFW 干扰🛡️ 第五层:安全诊断
11. SSL/TLS 诊断
bash
# 检查证书信息
openssl s_client -connect example.com:443 -servername example.com
# 查看证书链
openssl s_client -connect example.com:443 -showcerts
# 检查证书过期时间
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
# 验证证书
openssl verify -CAfile ca.pem cert.pem
# 测试特定 TLS 版本
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_312. 防火墙诊断
bash
# iptables 查看规则
iptables -L -n -v
iptables -L -n -v --line-numbers
# 查看特定链
iptables -L INPUT -n -v
# 查看 NAT 规则
iptables -t nat -L -n -v
# 查看连接跟踪
cat /proc/sys/net/netfilter/nf_conntrack_count
# conntrack 工具
conntrack -L # 列出所有连接
conntrack -L -s 192.168.1.100 # 按来源 IP 过滤
# nftables(新版本)
nft list ruleset📝 实战案例汇总
案例 1:网站打不开
bash
# 第一步:DNS 解析
dig example.com
# 第二步:连通性
ping example.com
# 第三步:路由追踪
mtr example.com
# 第四步:端口测试
nc -zv example.com 443
# 第五步:HTTP 测试
curl -v https://example.com
# 第六步:抓包分析
tcpdump -i eth0 host example.com -w debug.pcap案例 2:网络延迟高
bash
# 第一步:mtr 定位延迟节点
mtr target.com
# 第二步:对比不同目标
mtr 8.8.8.8 # 国际
mtr 114.114.114.114 # 国内
# 第三步:检查本地网络
iperf3 -c local-server -t 30
# 第四步:检查 DNS 延迟
dig example.com | grep "Query time"案例 3:服务间歇性不可用
bash
# 第一步:监控连接状态
watch -n 1 'ss -s'
# 第二步:检查连接队列
ss -tlnp | grep -E 'Recv-Q|Send-Q'
# 第三步:检查 TIME_WAIT 数量
ss -tan state time-wait | wc -l
# 第四步:检查 SYN flood
ss -tan state syn-recv | wc -l
# 第五步:抓包分析
tcpdump -i eth0 'tcp[tcpflags] == tcp-syn' -c 100📋 工具速查表
| 工具 | 主要用途 | 所在层级 |
|---|---|---|
| ping | 连通性测试 | 网络层 |
| mtr | 路由追踪+延迟分析 | 网络层 |
| dig | DNS 诊断 | 应用层 |
| ss | 连接状态统计 | 传输层 |
| nmap | 端口扫描+服务识别 | 传输层 |
| nc | 端口连通性测试 | 传输层 |
| iperf3 | 带宽测试 | 传输层 |
| curl | HTTP 性能测试 | 应用层 |
| tcpdump | 命令行抓包 | 所有层 |
| Wireshark | 图形化抓包分析 | 所有层 |
| openssl | TLS/SSL 诊断 | 应用层 |
🔗 相关文章
- 流媒体工具全家桶 — 流媒体相关工具
- IP 纯净度检测 — IP 质量诊断
- VPS 性能测试脚本汇总 — 服务器性能测试
- 全能工具箱 — VPS 综合工具
- Uptime Kuma 服务监控 — 持续监控方案
