6.1 网络故障排查基础:连通性测试与抓包分析
模块一:ping、nc、telnet、tcpdump 实操知识点
1.ping(ICMP 连通性与延迟测试)
原理:发送 ICMP Echo Request,等待 Echo Reply
用途:Ping 是最基础、最快速的网络连通性测试工具,用于检查本机到目标主机是否可达以及网络延迟情况。
关键参数:
# Linux ping -c 3 192.168.0.1 # 只发3个包,然后自动停止 ping -i 0.5 192.168.0.1 # 每 0.5 秒发一个包(默认1秒) ping -s 1500 192.168.0.1 # 发送大包(测试MTU问题) ping -W 2 192.168.0.1 # 超时 2 秒就认为失败 # Windows ping -n 3 192.168.0.1 # 发 3 个包 ping -t 192.168.0.1 # 持续ping(ctrl+c停止) ping -l 1500 192.168.0.1 # 发送大包- 使用场景:
1. 测试网络是否通
# 是否能上网 ping 8.8.8.8 # 测试是否能访问百度 ping www.baidu.com # 测试内网服务器(ping内网IP) ping 192.168.0.112. 排查网络故障的第一步
# 从近到远逐步排查 ping 127.0.0.1 # 1. 本机网卡是否正常 ping 192.168.0.1 # 2. 网关是否通 ping 192.168.0.160 # 3. 目标主机是否通 ping 8.8.8.8 # 4. 外网是否通 ping www.baidu.com # 5. DNS 解析是否正常3. 监控网络稳定性(持续观察丢包和延迟)
# 持续 ping,观察是否有丢包 ping -c 100 192.168.0.1 # 发100个包后自动停止 # 观察延迟变化 ping 192.168.0.1 # 输出示例: # 64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.523 ms # time=0.523 ms 就是延迟时间(越小越好)4. 测试网络质量
# 检查丢包率 ping -c 100 192.168.0.160 | grep loss # 输出示例:0% packet loss(最好)、5% packet loss(有问题) # 快速 ping 测试(每秒发多个包) ping -f 192.168.0.1 # flood ping(需要 root 权限)
- ping的结果解读
1. 关键信息:
time=0.523 ms:延迟时间(越小越快)
0% packet loss:丢包率(0% 最好)
ttl=64:生存时间(Linux 通常是 64)2. 失败的输出含义
输出 含义 常见原因 Destination Host Unreachable目标主机不可达 网络不通、路由错误、交换机问题 Request timeout请求超时 防火墙拦截、主机宕机、网络拥塞 Unknown host未知主机名 DNS 解析失败、域名写错 Network is unreachable网络不可达 网卡没配置、网线没插、路由表错误
2.telnet(TCP 端口连通性测试)
用途:Telnet 现在基本不用来远程管理了(因为不安全,明文传输),但作为网络排查工具依然非常有用。尤其是:测试A到B的某个端口是否通畅。
实例:
1. 简单用法:测试端口连通性
# 1. 测试 Web 服务是否正常 telnet 192.168.0.160 80 # 2. 测试 MySQL 数据库端口 telnet 192.168.0.160 3306 # 3. 测试 Redis 缓存 telnet 192.168.0.160 6379 # 4. 测试 HTTPS(虽然看不懂,但能连上就说明通的) telnet www.baidu.com 4432. 进阶用法手动与文本协议交互
对于HTTP、SMTP等明文协议,可以手动模拟客户端请求
(1)测试HTTP服务
telnet 192.168.0.160 80 Trying 192.168.0.160... Connected to 192.168.0.160. GET / HTTP/1.1 Host: 192.168.0.160 # 按两次回车,会看到服务器返回的 HTTP 响应
GET= 请求获取资源(HTTP方法)
/= 网站根目录/首页像:index.html(请求路径)
HTTP/1.1= 协议版本为HTTP1.1版本
请求行 含义 GET /index.html HTTP/1.1获取 index.html 文件 GET /api/users HTTP/1.1调用 API 接口 POST /login HTTP/1.1提交登录表单(POST 方法) GET /images/logo.png HTTP/1.1获取图片资源 (2)测试Redis服务
telnet 192.168.0.160 6379 Trying 192.168.0.160... Connected to 192.168.0.160. PING # 会看到 +PONG 响应(3)测试SMTP服务
telnet smtp.example.com 25 HELO test.com MAIL FROM:<test@test.com> RCPT TO:<user@example.com> DATA Subject: Test Hello . QUIT
操作 快捷键 退出 Telnet 连接 Ctrl + ],然后输入quit回车断开但保留客户端 Ctrl + ],然后输入close查看帮助 Ctrl + ],然后输入?
结果与含义
结果表现 含义 下一步 Connected to xxx端口通,有服务监听 服务正常,可以用对应客户端连接 Connection refused端口没开,或服务没启动 启动服务,或检查端口号是否正确 卡在 Trying...防火墙拦截,或主机不可达 检查防火墙规则、安全组、网络路由 Connection timed out网络超时(通常也是防火墙) 同上方,检查中间网络设备
3. nc(netcat,端口测试与数据传输)
NC 被称为"网络工具中的瑞士军刀",功能比
ping和telnet强大得多。它既能做客户端,也能做服务端,支持 TCP 和 UDP。常见的应用场景
1. 测试端口连通性(代替telnet)
# 测试 TCP 端口 nc -zv 192.168.0.160 22 # -z: 只扫描不发送数据 # -v: 显示详细信息 # 输出示例: # Connection to 192.168.0.160 22 port [tcp/ssh] succeeded! # 测试 UDP 端口(telnet 做不到) nc -zvu 192.168.0.160 53 # -u: UDP 模式 # 扫描常见端口(但如果第一个端口没开放,就直接显示失败,感觉不太好用) nc -zv 192.168.0.160 20-100 # 一般就只扫描1个端口 nc -zv 192.168.0.160 80 # 不能几个一起:nc -zv 192.168.0.160 80 22 3306 # 扫描并显示开放的端口 nc -zv 192.168.0.160 1-1000 2>&1 | grep -i succeeded | connected2. 传输文件
# 接收端(目标机器上监听) nc -l 9999 > received_file.txt # 发送端(源机器上推送) nc 192.168.0.160 9999 < send_file.txt # 传输完成后自动断开3. 快速创建临时聊天/通信
# 机器 A:监听端口 nc -l 8888 # 机器 B:连接过去 nc 192.168.0.100 8888 # 双方输入文字,实时看到(类似聊天室)4. 手动与各种服务交互
# HTTP 服务 echo -e "GET / HTTP/1.1\nHost: example.com\n" | nc example.com 80 # Redis 服务 echo "PING" | nc 192.168.0.160 6379 # 抓取网页标题 echo -e "GET / HTTP/1.1\nHost: baidu.com\n" | nc www.baidu.com 80 | grep -i title
这是一个标准的 HTTP/1.1 请求格式:
GET /:请求根路径
HTTP/1.1:使用 HTTP 1.1 协议
Host: example.com:指定要访问的主机名(HTTP/1.1 必需)最后的空行表示请求头结束
6. 端口转发/代理(高级用法)
# 将本地 8080 转发到远程 80 nc -l 8080 -c "nc 192.168.0.160 80" # 访问 localhost:8080 等于访问 192.168.0.160:80
-l(Listen 模式)
- 监听模式:让nc作为服务器,在本地监听指定端口
- 等待其他客户端来连接,而不是主动连接别人
- 相当于nc -l 8080 会在本地8080端口启动一个服务
-c(Command 执行)
执行命令:当有客户端连接时,执行
-c后面的命令
4.tcpdump(抓包分析)
- Tcpdump 是最强大的网络抓包工具,用于抓取和分析网络数据包。当
ping、telnet、nc这些工具告诉你"通"或"不通",但你想知道具体发生了什么时,就用 tcpdump。 - 常用的应用场景
1. 抓取特定主机的所有通信
# 抓取与 192.168.0.160 的所有包(我这里默认是virb0) sudo tcpdump host 192.168.0.160 # 抓取192.168.0.160 指定网卡的包 sudo tcpdump -i enss host 192.168.0.160 # 只抓源地址(从该机器发出的) sudo tcpdump -i ens33 src host 192.168.0.160 # 只抓目标地址(发往该机器的) sudo tcpdump -i ens33 dst host 192.168.0.1602. 抓取特定端口
# 抓取 80 和 443 端口 sudo tcpdump -i ens33 port 80 or port 443 # 抓取特定范围的端口 sudo tcpdump -i ens33 portrange 20-1003. 排查卡在Trying的问题(也是抓取特定连接的完整过程)
# 当 telnet 卡住时,抓包看发生了什么 sudo tcpdump host 192.168.0.100 and port 23 # 在另一个终端执行 telnet telnet 192.168.0.100 # 观察抓包输出: # - 有 [S.]SYN 发出,无 SYN+ACK 返回 → 防火墙丢弃 # - 有 [P.]PSH+ACK 返回 → 连接成功 # - 有 [R.]RST 返回 → 端口拒绝 # 检查防火墙是否丢包 # - tcpdump 看到包 → 网络通,问题可能在应用层 # - tcpdump 看不到包 → 中间防火墙拦截或路由问题4. 保存到文件供后续分析
# 抓包保存到文件(方便后续用 Wireshark 分析) sudo tcpdump -i eth0 -w capture.pcap host 192.168.0.160 # 限制抓包数量(1000个包) sudo tcpdump -c 1000 -w capture.pcap # 从文件读取分析 tcpdump -r capture.pcap tcpdump -r capture.pcap host 192.168.0.1605. 常见过滤表达式-基础过滤
# 组合条件(and/or/not) sudo tcpdump host 192.168.0.160 and port 80 sudo tcpdump port 80 or port 443 sudo tcpdump not port 22 and not port 53 # IP 范围 sudo tcpdump net 192.168.0.0/24 # 多个 IP sudo tcpdump host 192.168.0.160 or host 192.168.0.1616. 常见过滤表达式-协议过滤
# 只抓 TCP sudo tcpdump tcp # 只抓 UDP sudo tcpdump udp # 只抓 ICMP (ping) sudo tcpdump icmp # 只抓 ARP sudo tcpdump arp7. TCP包标志位
Flags [S] = SYN # 发起连接 Flags [.] = ACK # 确认 Flags [P] = PSH # 推送数据 Flags [F] = FIN # 关闭连接 Flags [R] = RST # 重置连接(拒绝) Flags [S.] = SYN+ACK # 响应连接 Flags [FP.] = FIN+ACK # 关闭确认
5. 组合使用 && 对比
# 完整排查流程示例 # 1. 先 ping 看通不通 ping -c 3 192.168.0.160 # 2. 用 nc 测试端口 nc -zv 192.168.0.160 8080 # 3. 如果失败,抓包看原因 sudo tcpdump -i eth0 host 192.168.0.160 and port 8080 -nn # 4. 在另一个终端重试 telnet 192.168.0.160 8080 # 5. 分析抓包结果 # - 看到 SYN 发出,无响应 → 防火墙丢弃 # - 看到 RST 返回 → 端口没开 # - 看到 SYN+ACK 返回 → 端口通,问题在应用层| 工具 | 看到什么 | 适合场景 |
|---|---|---|
ping | 通/不通、延迟 | 快速检查网络状态 |
telnet/nc | 端口是否开放 | 测试服务可达性 |
tcpdump | 每个数据包的详细内容 | 深入排查问题、分析协议 |
模块二:模拟端口不通、DNS 异常故障排查知识点
1. 端口不通的排查逻辑(TCP/UDP)
可能原因:
服务未启动
防火墙(iptables/nftables/安全组/云防火墙)
监听地址错误(127.0.0.1 vs 0.0.0.0)
网络 ACL / 路由不通
排查步骤(逐层):
本机检查:
ss -tlnp/netstat -tlnp看服务是否监听正确端口防火墙:
iptables -L -n、firewall-cmd --list-all本地端口测试:
nc -v 127.0.0.1 <端口>跨机测试:
telnet <目标IP> <端口>或nc -v <目标IP> <端口>跟踪路由:
traceroute -T -p <端口> <目标IP>(TCP 模式)抓包确认:
客户端发 SYN 无响应 → 丢包或被防火墙 drop
收到 RST → 服务未监听或被拒绝
收到 ICMP Unreachable → 路由/网络问题
2. DNS 异常故障排查
典型异常表现:
ping domain报Unknown hostnslookup超时或 ServFail浏览器无法打开网站但 IP 能访问
排查工具与顺序:
- 核心概念:DNS 解析流程
你输入 www.baidu.com ↓ 1. 查 /etc/hosts (本地静态文件) ↓ 2. 查 /etc/resolv.conf (看用哪个DNS服务器) ↓ 3. 向DNS服务器发请求 → 得到IP (如 110.242.68.66) ↓ 4. 用IP访问目标服务器| 工具 | 作用 |
|---|---|
nslookup <域名> [DNS服务器] | 手动查询,可指定 DNS |
dig <域名> | 更详细:查询类型、权威、TTL |
host <域名> | 简洁结果 |
cat /etc/resolv.conf | 查看本机 DNS 服务器配置 |
ping 8.8.8.8 | 排除基础网络不通 |
nslookup - 手动查询,可指定DNS
1. 基本用法
# 使用本机默认DNS查询 nslookup www.baidu.com # 指定DNS服务器查询(绕过本机配置) nslookup www.baidu.com 8.8.8.8 nslookup www.baidu.com 114.114.114.1142. 输出解读
$ nslookup www.baidu.com Server: 8.8.8.8 # 使用的DNS服务器 Address: 8.8.8.8#53 # DNS端口53 Non-authoritative answer: # 非权威答案(从缓存中来的) www.baidu.com canonical name = www.a.shifen.com. # 别名 www.a.shifen.com canonical name = www.wshifen.com. Name: www.wshifen.com # 解析的IP Address: 103.235.46.102 Name: www.wshifen.com Address: 103.235.46.1153. 一般使用场景
# 1. 查询特定类型的记录 nslookup -type=A www.baidu.com # A记录(IPv4地址) nslookup -type=AAAA www.baidu.com # AAAA记录(IPv6地址) nslookup -type=CNAME www.baidu.com # CNAME记录(别名) nslookup -type=MX baidu.com # MX记录(邮件服务器) nslookup -type=NS baidu.com # NS记录(域名服务器) # 2. 反向查询(IP查域名) nslookup 110.242.68.66 # 3. 进入交互模式 nslookup > set type=MX > baidu.com > exit
dig - 最详细的DNS查询工具
# 标准查询 dig www.baidu.com # 指定服务器查询 dig @8.8.8.8 www.baidu.com # 只显示答案部分 dig www.baidu.com +noall +answer # 只显示短IP dig www.baidu.com +short # 输出:110.242.68.66 # 查询特定类型 dig baidu.com MX # 邮件服务器 dig baidu.com NS # 权威域名服务器 dig baidu.com TXT # TXT记录(如SPF验证)host - 简洁结果
# 标准查询 host www.baidu.com # 指定DNS服务器 host www.baidu.com 8.8.8.8 # 查询特定类型 host -t MX baidu.com host -t NS baidu.com # 反向查询 host 110.242.68.66 # 详细输出 host -v www.baidu.com/etc/resolv.conf
cat /etc/resolv.conf # 典型输出: nameserver 192.168.0.1 # 主DNS服务器 nameserver 114.114.114.114 # 备用DNS服务器 search localdomain # 搜索域(自动补全) options timeout:2 attempts:3 # 超时和重试3. 快速参考卡
| 需求 | 命令 |
|---|---|
| 快速查IP | dig +short 域名 |
| 查特定DNS | dig @8.8.8.8 域名 |
| 查看本机DNS | cat /etc/resolv.conf |
| 反向查询 | nslookup IP |
| 查邮件服务器 | dig 域名 MX |
| 查权威服务器 | dig 域名 NS |
| 追踪解析路径 | dig 域名 +trace |
| 测试网络 | ping 8.8.8.8 |
4. 常见错误及解决
| 错误 | 原因 | 解决 |
|---|---|---|
Unknown host | DNS解析失败 | 检查DNS配置、网络连通 |
Connection timed out | DNS服务器无响应 | 换DNS服务器 |
NXDOMAIN | 域名不存在 | 检查域名拼写 |
SERVFAIL | DNS服务器内部错误 | 换DNS服务器重试 |
记忆口诀:
网络不通先
ping 8.8.8.8DNS问题用
dig看配置查
/etc/resolv.conf指定DNS用
@符号
