15.6.7 网络故障排查与调试工具
网络故障排查思路与流程#
原理草图:排查路径与层级#
标准流程与可执行步骤#
- 明确现象:无法解析、无法连接、连接不稳、吞吐低、丢包高、端口不可达。
- 定位层级:DNS → 路由/转发 → 防火墙/NAT → 端口监听 → 应用协议。
- 端到端验证:容器内 → 宿主机 → 其他容器/外部目标。
- 固化结论:记录网络模式、网段、端口映射、服务名、时间点与日志。
示例:完整排查路径(从容器到外部)#
# 1) 进入容器
docker exec -it web sh
# 2) DNS 解析
cat /etc/resolv.conf
dig +short example.com
# 3) 路由与网关
ip a
ip r
# 4) 连通性与端口
ping -c 2 8.8.8.8
nc -vz example.com 443
# 5) 应用协议验证
curl -I https://example.com
预期效果:解析成功、路由存在、端口可达、HTTP 状态码返回。
常见故障类型与排查要点#
1. DNS 解析失败#
- 检查容器内
/etc/resolv.conf、/etc/hosts。 - 检查是否同一自定义网络、服务名是否可见。
示例
# 容器内 DNS 配置
cat /etc/resolv.conf
# 检查服务名
getent hosts db
2. 端口不可达#
- 应用端口是否监听在
0.0.0.0。 -p映射是否正确。- 宿主机防火墙是否放行。
示例
# 容器内检查监听
ss -lntup
# 宿主机检查端口映射
docker port web
# 宿主机防火墙(firewalld)
firewall-cmd --list-ports
3. 容器间不通#
- 是否在同一自定义网络。
- 网络驱动是否 bridge/overlay。
- iptables 转发策略是否允许。
示例
docker network ls
docker network inspect app_net
4. 外部访问失败#
- 宿主机路由、云安全组、NAT、反向代理。
示例
# 宿主机检查 NAT
iptables -t nat -L -n -v
5. 多主机网络异常#
- Overlay/VXLAN 端口是否被阻断。
- 节点互通是否正常。
示例
# 以 VXLAN 端口 4789 为例
nc -vz <node_ip> 4789
关键排查命令与工具#
工具安装(容器内排查镜像)#
# 以 alpine 为例,准备常用工具
apk add --no-cache curl bind-tools tcpdump iproute2 iputils busybox-extras
Docker 内建与系统工具(命令解释)#
docker network ls # 查看网络列表
docker network inspect app_net # 查看子网/网关/已连接容器
docker port web # 查看容器端口映射
docker exec -it web sh # 进入容器
ip a # 查看接口/地址
ip r # 查看路由
ss -lntup # 查看监听端口
iptables -t nat -L -n -v # 查看 NAT 规则
连通性与协议诊断(示例)#
# ICMP 与路径定位
ping -c 2 8.8.8.8
traceroute 8.8.8.8
# TCP 端口验证
nc -vz 10.0.0.10 3306
# HTTP 验证
curl -I http://10.0.0.10:8080
# DNS 验证
dig +short api.local
抓包示例(验证三次握手)#
# 在宿主机抓容器端口 8080
tcpdump -i any tcp port 8080 -nn
预期效果:可见 SYN/SYN-ACK/ACK,说明 TCP 建连正常。
容器内网络检查清单#
- IP 地址、网关、DNS 是否正确。
- 应用是否监听在
0.0.0.0而非127.0.0.1。 - 容器内安全策略是否限制端口。
- 服务依赖是否使用正确的服务名或容器名。
快速自检脚本
#!/bin/sh
echo "=== IP ==="
ip a
echo "=== Route ==="
ip r
echo "=== DNS ==="
cat /etc/resolv.conf
echo "=== Listen ==="
ss -lntup
典型故障案例#
1) 端口映射错误#
现象:外部访问 80 端口失败。
原因:应用监听 8080,但映射为 -p 80:80。
修复
docker run -d --name web -p 80:8080 nginx
预期效果:curl http://宿主机IP 返回 200。
2) 容器间解析失败#
现象:curl http://db:3306 解析失败。
原因:容器不在同一自定义网络。
修复
docker network create app_net
docker network connect app_net db
docker network connect app_net web
预期效果:getent hosts db 有返回。
3) 外部访问超时#
现象:外部访问超时。
原因:宿主机防火墙未放行端口。
修复
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
预期效果:端口可达。
4) 多主机通信失败#
现象:跨节点容器互通失败。
原因:VXLAN 端口被阻断。
修复
# 开放 VXLAN 端口 4789
firewall-cmd --add-port=4789/udp --permanent
firewall-cmd --reload
排查结论与优化建议#
- 统一网络规划:固定网段、命名规范、服务发现标准化。
- 监控网络指标:延迟、丢包、连接数、重传率。
- 保留工具镜像:预置
curl/dig/tcpdump便于应急排查。
示例:调试专用镜像
docker run --rm -it --net app_net nicolaka/netshoot bash
练习题#
- 创建两个容器放入同一网络,使用服务名互相访问,记录解析结果与
curl返回码。 - 制造端口映射错误并修复,记录
docker port输出变化。 - 用
tcpdump抓取 TCP 建连过程,输出三次握手报文。 - 关闭防火墙端口,观察外部访问失败现象并恢复。
- 使用
traceroute定位访问外部失败的跳点。