15.6.7 网络故障排查与调试工具

网络故障排查思路与流程#

原理草图:排查路径与层级#

文章图片

标准流程与可执行步骤#

  1. 明确现象:无法解析、无法连接、连接不稳、吞吐低、丢包高、端口不可达。
  2. 定位层级:DNS → 路由/转发 → 防火墙/NAT → 端口监听 → 应用协议。
  3. 端到端验证:容器内 → 宿主机 → 其他容器/外部目标。
  4. 固化结论:记录网络模式、网段、端口映射、服务名、时间点与日志。

示例:完整排查路径(从容器到外部)#

# 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

练习题#

  1. 创建两个容器放入同一网络,使用服务名互相访问,记录解析结果与 curl 返回码。
  2. 制造端口映射错误并修复,记录 docker port 输出变化。
  3. tcpdump 抓取 TCP 建连过程,输出三次握手报文。
  4. 关闭防火墙端口,观察外部访问失败现象并恢复。
  5. 使用 traceroute 定位访问外部失败的跳点。