跳转至

第19章 网络测试工具

掌握网络测试工具是诊断问题的关键。本章介绍常用的网络测试工具及其使用方法。

19.1 Ping与Traceroute

19.1.1 Ping基础

Ping的作用:

功能:
1. 测试网络连通性
2. 检测延迟(RTT)
3. 检测丢包率
4. 初步诊断网络问题

原理:
发送ICMP Echo Request包
等待ICMP Echo Reply响应
计算往返时间

限制:
⚠️ 某些服务器禁ping
⚠️ ICMP可能被限速
⚠️ 不能测试端口
⚠️ 防火墙可能拦截

Ping命令使用:

# Linux/macOS基础用法
ping google.com

# 发送指定数量的包
ping -c 10 google.com

# 设置包大小(字节)
ping -s 1000 google.com

# 设置间隔时间(秒)
ping -i 0.5 google.com

# 持续ping并记录
ping google.com > ping.log &

# Windows用法
ping google.com

# 发送10个包
ping -n 10 google.com

# 持续ping
ping -t google.com

# 设置TTL
ping -i 64 google.com

结果分析:

输出示例:
64 bytes from 142.250.185.46: icmp_seq=1 ttl=116 time=35.2 ms
64 bytes from 142.250.185.46: icmp_seq=2 ttl=116 time=34.8 ms
64 bytes from 142.250.185.46: icmp_seq=3 ttl=116 time=35.5 ms

--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 34.8/35.2/35.5/0.3 ms

参数解读:
- icmp_seq:序列号
- ttl:生存时间(跳数限制)
- time:往返时间(延迟)
- packet loss:丢包率
- rtt min/avg/max:最小/平均/最大延迟

健康指标:
✓ 丢包率 < 1%
✓ 延迟稳定(mdev小)
✓ TTL正常(>50)

异常情况:
❌ Request timeout:无响应
❌ Destination host unreachable:目标不可达
❌ 高丢包率:网络不稳定
❌ 延迟波动大:网络拥堵

19.1.2 Traceroute路由追踪

Traceroute作用:

功能:
1. 显示数据包路径
2. 识别网络瓶颈
3. 定位故障节点
4. 分析路由策略

原理:
逐步增加TTL值
每个路由器返回ICMP超时
收集路径信息

基础使用:

# Linux
traceroute google.com

# 指定最大跳数
traceroute -m 20 google.com

# 使用ICMP(默认UDP)
traceroute -I google.com

# TCP方式(端口80)
traceroute -T -p 80 google.com

# 不解析域名
traceroute -n google.com

# Windows(tracert)
tracert google.com

# 不解析域名
tracert -d google.com

# 指定最大跳数
tracert -h 20 google.com

# macOS
traceroute google.com
# 或
traceroute -I google.com

结果分析:

输出示例:
traceroute to google.com (142.250.185.46), 30 hops max, 60 byte packets
 1  192.168.1.1 (192.168.1.1)  1.234 ms  1.156 ms  1.089 ms
 2  10.0.0.1 (10.0.0.1)  5.432 ms  5.389 ms  5.301 ms
 3  202.97.33.1 (202.97.33.1)  8.765 ms  8.721 ms  8.678 ms
 4  202.97.50.253 (202.97.50.253)  15.234 ms  15.198 ms  15.167 ms
 5  * * *
 6  108.170.242.65 (108.170.242.65)  180.456 ms  180.423 ms  180.391 ms
 7  142.250.185.46 (142.250.185.46)  181.234 ms  181.201 ms  181.178 ms

分析要点:

1. 第一跳:本地网关
   192.168.1.1 → 家用路由器
   延迟应 < 5ms

2. 第二跳:ISP接入
   10.0.0.1 → 运营商接入点
   延迟应 < 10ms

3. 中间跳:骨干网
   202.97.x.x → 中国电信骨干网
   延迟逐步增加

4. * * * :不响应
   - 防火墙阻止ICMP
   - 路由器配置不响应
   - 正常现象

5. 突然延迟增大:
   如从15ms跳到180ms
   → 国际出口/海底光缆

6. 最后一跳:目标服务器
   延迟应与ping相近

典型路由分析:

国内访问国外:
1  本地网关           1ms
2  ISP接入            5ms
3  城域网            10ms
4  省骨干网          15ms
5  国家骨干网        25ms
6  国际出口         150ms  ← 延迟剧增
7  海外ISP          180ms
8  目标服务器       185ms

绕路示例(北京访问香港):
应该:北京 → 广州 → 香港(~40ms)
实际:北京 → 上海 → 日本 → 香港(~120ms)
→ 路由次优,需要优化线路

丢包节点识别:
 5  202.97.50.1    50% loss  ← 此节点有问题
 6  202.97.60.1    50% loss
 7  8.8.8.8        0% loss   ← 实际是上游问题
→ 从第一个高丢包节点开始排查

19.2 MTR路由测试

19.2.1 MTR简介

MTR优势:

MTR = My Traceroute
= Ping + Traceroute 结合

优势:
✓ 实时持续监控
✓ 显示每跳丢包率
✓ 显示每跳延迟统计
✓ 更准确的诊断

vs Traceroute:
- Traceroute:单次快照
- MTR:持续监控,统计分析

安装MTR:

# Ubuntu/Debian
sudo apt install mtr -y

# CentOS/RHEL
sudo yum install mtr -y

# macOS
brew install mtr

# Windows
# 下载WinMTR
# https://sourceforge.net/projects/winmtr/

19.2.2 MTR使用

基础命令:

# 图形界面(推荐新手)
mtr google.com

# 报告模式(生成统计报告)
mtr --report google.com

# 指定测试次数
mtr --report-cycles 100 google.com

# 不解析域名(更快)
mtr -n google.com

# TCP模式(测试端口)
mtr --tcp --port 443 google.com

# 输出到文件
mtr --report --report-cycles 100 google.com > mtr_report.txt

# JSON格式输出
mtr --json google.com

# CSV格式输出
mtr --csv google.com

图形界面操作:

运行: mtr google.com

界面显示:
                             My traceroute  [v0.95]
HOST: localhost               Loss%   Snt   Last   Avg  Best  Wrst StDev
1. 192.168.1.1                0.0%   100    1.2   1.3   1.0   2.1   0.2
2. 10.0.0.1                   0.0%   100    5.4   5.6   5.2   7.8   0.5
3. 202.97.33.1                0.0%   100   12.3  12.5  11.8  15.6   0.8
4. ???                       100.0%  100    0.0   0.0   0.0   0.0   0.0
5. 108.170.242.65             5.0%   100  185.3 186.2 180.1 195.4   3.2
6. 142.250.185.46             0.0%   100  186.5 187.1 182.3 196.8   3.5

字段说明:
- Loss%:丢包率
- Snt:已发送包数
- Last:最后一次延迟
- Avg:平均延迟
- Best:最佳延迟
- Wrst:最差延迟
- StDev:标准差(波动)

操作键:
d:切换显示模式
n:切换域名/IP显示
p:暂停/继续
q:退出
r:重置统计

19.2.3 结果分析

健康网络示例:

HOST                          Loss%   Snt   Avg
1. 192.168.1.1                0.0%   100   1.2
2. 10.0.0.1                   0.0%   100   5.4
3. 202.97.33.1                0.0%   100  12.3
4. 142.250.185.46             0.0%   100  35.6

特征:
✓ 无丢包(0%)
✓ 延迟稳定(StDev小)
✓ 延迟递增合理

问题网络识别:

场景1:中间节点丢包
HOST                          Loss%   Snt   Avg
1. 192.168.1.1                0.0%   100   1.2
2. 10.0.0.1                  15.0%   100   5.4  ← 问题节点
3. 202.97.33.1               15.0%   100  12.3
4. 目标                      15.0%   100  35.6

诊断:ISP接入点有问题,联系运营商

场景2:仅中间节点丢包
HOST                          Loss%   Snt   Avg
1. 192.168.1.1                0.0%   100   1.2
2. 10.0.0.1                  20.0%   100   5.4
3. 202.97.33.1                0.0%   100  12.3  ← 后续正常
4. 目标                       0.0%   100  35.6

诊断:第2跳限速/限制ICMP,不影响实际使用

场景3:延迟突增
HOST                          Loss%   Snt   Avg
1. 192.168.1.1                0.0%   100    1.2
2. 10.0.0.1                   0.0%   100    5.4
3. 国际出口                   0.0%   100  180.5  ← 延迟剧增
4. 目标                       0.0%   100  185.3

诊断:国际出口,正常现象;如延迟过高考虑换线路

场景4:高抖动
HOST                          Loss%   Snt   Avg  StDev
1. 192.168.1.1                0.0%   100   1.2   0.1
2. WiFi路由                   0.0%   100  15.4  25.3  ← 高抖动
3. 目标                       0.0%   100  35.6   5.2

诊断:WiFi不稳定,建议使用有线连接

19.3 SpeedTest速度测试

19.3.1 命令行SpeedTest

安装:

# 官方CLI
# Ubuntu/Debian
curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh | sudo bash
sudo apt install speedtest

# CentOS/RHEL
curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh | sudo bash
sudo yum install speedtest

# macOS
brew install speedtest-cli

# 或使用Python版本
pip install speedtest-cli

基础使用:

# 自动选择最佳服务器
speedtest

# 列出附近服务器
speedtest --servers

# 指定服务器测试
speedtest --server-id=服务器ID

# 仅测试下载
speedtest --download

# 仅测试上传
speedtest --upload

# JSON格式输出
speedtest --json

# 简洁模式
speedtest --simple

# 分享结果(生成链接)
speedtest --share

输出示例:

Speedtest by Ookla

Server: China Telecom - Beijing (id = 5083)
ISP: China Telecom
Latency:     8.34 ms   (2.15 ms jitter)
Download:   95.67 Mbps (data used: 112.4 MB)
Upload:     28.45 Mbps (data used: 42.1 MB)
Packet Loss:     0.0%
Result URL: https://www.speedtest.net/result/c/xxxxx

分析:
- Latency < 50ms:良好
- Jitter < 10ms:稳定
- Packet Loss < 1%:健康
- 下载速度:接近带宽上限为佳

19.3.2 代理速度测试

通过代理测速:

# 方法1:设置环境变量
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
speedtest

# 方法2:使用proxychains
# 安装
sudo apt install proxychains4

# 配置 /etc/proxychains4.conf
[ProxyList]
socks5 127.0.0.1 7890

# 使用
proxychains4 speedtest

# 对比直连和代理速度
echo "直连速度:"
speedtest --simple

echo "代理速度:"
export http_proxy=http://127.0.0.1:7890
speedtest --simple
unset http_proxy

Fast.com测速:

# 安装fast-cli
npm install --global fast-cli

# 测速
fast

# 上传下载都测
fast --upload

# JSON输出
fast --json

# 单位设置
fast --units bits  # 或 bytes

优势:
 Netflix CDN
 测试流媒体速度
 简单易用

19.3.3 批量测速脚本

多节点对比脚本:

#!/bin/bash
# speed_compare.sh

echo "=== 网络速度对比测试 ==="
echo ""

# 直连测速
echo "【直连测速】"
speedtest --simple
echo ""

# 代理1测速
echo "【代理1测速】"
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
speedtest --simple
unset http_proxy https_proxy
echo ""

# 代理2测速
echo "【代理2测速】"
export http_proxy=http://127.0.0.1:7891
export https_proxy=http://127.0.0.1:7891
speedtest --simple
unset http_proxy https_proxy
echo ""

echo "测试完成!"

19.4 端口连通性检测

19.4.1 Telnet测试

基础用法:

# 安装telnet
# Ubuntu
sudo apt install telnet

# CentOS
sudo yum install telnet

# 测试端口
telnet 服务器IP 443

# 成功输出:
Trying 1.2.3.4...
Connected to 1.2.3.4.
Escape character is '^]'.

# 失败输出:
telnet: Unable to connect to remote host: Connection refused
# 或
telnet: Unable to connect to remote host: Connection timed out

# 退出telnet
Ctrl + ]
quit

批量端口测试:

#!/bin/bash
# check_ports.sh

HOST="your-server.com"
PORTS=(22 80 443 8443 10000)

for port in "${PORTS[@]}"; do
    echo -n "Testing port $port... "
    timeout 3 bash -c "echo >/dev/tcp/$HOST/$port" 2>/dev/null
    if [ $? -eq 0 ]; then
        echo "✓ Open"
    else
        echo "✗ Closed"
    fi
done

19.4.2 Netcat(nc)测试

功能更强大的测试:

# 安装
sudo apt install netcat

# 测试TCP端口
nc -zv 服务器IP 443

# 输出:
Connection to 服务器IP 443 port [tcp/https] succeeded!

# 测试UDP端口
nc -zvu 服务器IP 53

# 扫描端口范围
nc -zv 服务器IP 1-1000

# 设置超时(秒)
nc -zv -w 3 服务器IP 443

# 保持连接(交互模式)
nc 服务器IP 80
GET / HTTP/1.1
Host: example.com

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

# 连接测试(客户端)
nc 服务器IP 12345

高级用法:

# 测试HTTP响应
echo -e "GET / HTTP/1.1\nHost: google.com\n\n" | nc google.com 80

# 测试HTTPS握手
echo | openssl s_client -connect google.com:443 2>/dev/null | grep "Verify return code"

# 文件传输测试
# 接收端
nc -l 12345 > received_file

# 发送端
nc 目标IP 12345 < file_to_send

19.4.3 Nmap扫描

安装和使用:

# 安装
sudo apt install nmap

# 扫描单个端口
nmap -p 443 服务器IP

# 扫描多个端口
nmap -p 22,80,443 服务器IP

# 扫描端口范围
nmap -p 1-1000 服务器IP

# 快速扫描常用端口
nmap --top-ports 100 服务器IP

# TCP SYN扫描(需root)
sudo nmap -sS 服务器IP

# UDP扫描
sudo nmap -sU -p 53 服务器IP

# 服务版本检测
nmap -sV 服务器IP

# 操作系统检测
sudo nmap -O 服务器IP

# 详细输出
nmap -v 服务器IP

输出解读:

Starting Nmap 7.80 ( https://nmap.org )
Nmap scan report for example.com (1.2.3.4)
Host is up (0.035s latency).

PORT    STATE  SERVICE  VERSION
22/tcp  open   ssh      OpenSSH 8.2p1
80/tcp  open   http     nginx 1.18.0
443/tcp open   ssl/http nginx 1.18.0

状态说明:
- open:端口开放
- closed:端口关闭
- filtered:被防火墙过滤
- unfiltered:可达但状态未知

⚠️ 注意:
仅扫描自己的服务器
未授权扫描可能违法

19.5 TLS握手测试

19.5.1 OpenSSL测试

基础TLS测试:

# 连接测试
openssl s_client -connect google.com:443

# 指定SNI
openssl s_client -connect IP:443 -servername domain.com

# 显示证书
openssl s_client -connect google.com:443 -showcerts

# 测试特定TLS版本
openssl s_client -connect google.com:443 -tls1_2
openssl s_client -connect google.com:443 -tls1_3

# 测试特定加密套件
openssl s_client -connect google.com:443 -cipher 'ECDHE-RSA-AES128-GCM-SHA256'

# 简洁输出
echo | openssl s_client -connect google.com:443 2>/dev/null | grep -E "subject|issuer|Verify"

证书信息查看:

# 查看证书详情
echo | openssl s_client -connect google.com:443 2>/dev/null | openssl x509 -noout -text

# 证书有效期
echo | openssl s_client -connect google.com:443 2>/dev/null | openssl x509 -noout -dates

# 证书颁发者
echo | openssl s_client -connect google.com:443 2>/dev/null | openssl x509 -noout -issuer

# 证书主体
echo | openssl s_client -connect google.com:443 2>/dev/null | openssl x509 -noout -subject

# 证书SAN(Subject Alternative Name)
echo | openssl s_client -connect google.com:443 2>/dev/null | openssl x509 -noout -ext subjectAltName

19.5.2 SSL Labs测试

在线测试工具:

1. SSL Labs Server Test
   https://www.ssllabs.com/ssltest/

功能:
✓ 全面的SSL/TLS分析
✓ 证书验证
✓ 协议支持检测
✓ 加密套件检测
✓ 漏洞扫描
✓ 评分(A+到F)

使用:
1. 输入域名
2. 等待扫描(1-2分钟)
3. 查看详细报告

重点关注:
- Overall Rating:总评分
- Certificate:证书状态
- Protocol Support:协议支持
- Cipher Suites:加密套件
- Vulnerabilities:已知漏洞

命令行测试:

# 使用testssl.sh
# 下载
git clone https://github.com/drwetter/testssl.sh.git
cd testssl.sh

# 测试
./testssl.sh google.com

# 测试特定端口
./testssl.sh google.com:443

# 快速测试
./testssl.sh --fast google.com

# 仅测试协议
./testssl.sh --protocols google.com

# 仅测试证书
./testssl.sh --certinfo google.com

# JSON输出
./testssl.sh --jsonfile result.json google.com

19.5.3 证书链验证

完整验证:

# 获取证书链
echo | openssl s_client -connect google.com:443 -showcerts 2>/dev/null > cert_chain.pem

# 提取服务器证书
openssl x509 -in cert_chain.pem -out server_cert.pem

# 验证证书链
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt server_cert.pem

# 输出:
server_cert.pem: OK  # 验证成功

# 检查证书是否过期
openssl x509 -in server_cert.pem -noout -checkend 86400
# 输出:
Certificate will not expire  # 未过期

# 证书指纹
openssl x509 -in server_cert.pem -noout -fingerprint -sha256

Let's Encrypt证书检查:

# 检查证书颁发者
echo | openssl s_client -connect your-domain.com:443 2>/dev/null | \
  openssl x509 -noout -issuer

# 应显示:
issuer=C = US, O = Let's Encrypt, CN = R3

# 检查有效期
echo | openssl s_client -connect your-domain.com:443 2>/dev/null | \
  openssl x509 -noout -dates

# 输出:
notBefore=Jan  1 00:00:00 2024 GMT
notAfter=Apr  1 00:00:00 2024 GMT

# 计算剩余天数
echo | openssl s_client -connect your-domain.com:443 2>/dev/null | \
  openssl x509 -noout -enddate | cut -d= -f2 | xargs -I {} date -d {} +%s | \
  awk -v now=$(date +%s) '{print int(($1-now)/86400)" days"}'

本章小结

本章介绍了常用的网络测试工具:

核心工具:

  1. Ping
  2. 基础连通性测试
  3. 延迟和丢包检测
  4. 快速初步诊断

  5. Traceroute

  6. 路由路径追踪
  7. 识别网络瓶颈
  8. 定位故障节点

  9. MTR

  10. Ping + Traceroute结合
  11. 持续监控统计
  12. 更准确的诊断

  13. SpeedTest

  14. 带宽速度测试
  15. 延迟抖动测试
  16. 代理性能对比

  17. 端口检测

  18. Telnet:简单测试
  19. Netcat:功能强大
  20. Nmap:全面扫描

  21. TLS测试

  22. OpenSSL:命令行测试
  23. SSL Labs:在线分析
  24. testssl.sh:自动化测试

工具选择指南:

快速检查连通性:
→ ping

查看网络路径:
→ traceroute

深入路由分析:
→ mtr

测试速度:
→ speedtest / fast

检查端口:
→ nc / telnet

扫描服务:
→ nmap

验证TLS:
→ openssl / testssl.sh

全面SSL分析:
→ SSL Labs

诊断流程:

1. Ping测试
2. 能ping通?
   是 → 端口测试(nc/telnet)
   否 → 路由追踪(traceroute/mtr)
3. 端口通?
   是 → TLS测试(openssl)
   否 → 防火墙/端口问题
4. TLS正常?
   是 → 速度测试(speedtest)
   否 → 证书/配置问题

实用技巧:

# 一键诊断脚本
#!/bin/bash
HOST="your-server.com"
PORT=443

echo "=== 网络诊断报告 ==="
echo "目标:$HOST:$PORT"
echo ""

echo "【Ping测试】"
ping -c 5 $HOST
echo ""

echo "【端口测试】"
nc -zv -w 3 $HOST $PORT
echo ""

echo "【TLS测试】"
echo | openssl s_client -connect $HOST:$PORT 2>/dev/null | grep "Verify return code"
echo ""

echo "【MTR测试】"
mtr --report --report-cycles 10 $HOST

至此,第六部分"故障排查篇"全部完成!


实践任务:

  1. 熟练使用ping和traceroute
  2. 掌握MTR分析方法
  3. 进行速度对比测试
  4. 检测服务器端口状态
  5. 验证TLS证书配置