全文目录
-
- 1 问题背景
-
- 1.1 问题描述
- 1.2 环境说明
- 2 排查思路总览
-
- 2.1 流量流向说明
- 2.2 核心排查顺序
- 3 详细排查过程
-
- 3.1 第一阶段:确认服务状态
- 3.2 第二阶段:抓包分析流量
- 3.3 第三阶段:iptables 排查
- 3.4 第四阶段:NAT 转发排查
- 3.5 第五阶段:系统配置排查(最终定位)
- 4 问题根因
-
- 4.1 流量路径分析
- 5 解决方案
-
- 5.1 开启 IP 转发
- 5.2 持久化配置
- 6 知识点总结
-
- 6.1 Docker 流量路径
- 6.2 排查关键点
- 6.3 常见问题速查
- 7 排查流程图
-
- 7.1 排查流程图
- 8 复盘总结
写在前面
这篇博文复盘了一个docker服务进程端口在本机访问正常,但在外部客户端无法访问的问题追查定位及解决的全过程,希望对有类似问题的读者有帮助。
1 问题背景
1.1 问题描述
客户端访问服务端端口不通
1.2 环境说明
- 服务端:1.1.1.1
- 客户端:2.2.2.2
- 目标端口:8001(Docker 容器映射端口)
2 排查思路总览
2.1 流量流向说明
流量流向:客户端 → 网络链路 → 服务端网卡 → iptables → 服务进程 ↓ ┌────────────┐ │ 1. 网络层排查 │ │ 2. 防火墙排查 │ │ 3. 服务层排查 │ │ 4. 容器网络排查 │ └────────────┘
2.2 核心排查顺序
3 详细排查过程
3.1 第一阶段:确认服务状态
1. 检查端口监听
ss -tlnp | grep 8001
输出:
LISTEN 0 4096 *:8001 *:* users:(("docker–proxy",pid=188408,fd=4))
结论:✅ 端口正常监听,绑定所有网卡(*:8001)
2. 本机自测
curl -I http://127.0.0.1:8001
输出:
HTTP/1.1 307 Temporary Redirect
Location: /login
结论:✅ 本机访问正常,服务本身没问题
3.2 第二阶段:抓包分析流量
1. 客户端测试
telnet 2.2.2.2 8001
现象:Trying... 卡住,无响应
2. 服务端抓包
tcpdump -i any port 8001 -nn
输出:
18:34:08 IP 2.2.2.2 > 1.1.1.1.8001: Flags [S] # 只有 SYN 包
18:34:12 IP 2.2.2.2 > 1.1.1.1.8001: Flags [S] # 重传
18:34:21 IP 2.2.2.2 > 1.1.1.1.8001: Flags [S] # 重传
关键发现:
- ✅ 服务端收到了 SYN 包
- ❌ 服务端没有回复 SYN-ACK 或 RST
- 💡 流量被静默丢弃
3.3 第三阶段:iptables 排查
1. 检查 INPUT 链
iptables -L INPUT -n –line-numbers
输出:
Chain INPUT (policy ACCEPT)
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:8001
结论:✅ INPUT 链已放行
▎ ⚠️ 重要知识点:Docker 流量走 FORWARD 链,不走 INPUT 链!
2. 检查 FORWARD 链
iptables -L FORWARD -n -v –line-numbers
输出:
Chain FORWARD (policy ACCEPT)
num pkts bytes target
1 0 0 ACCEPT all — * * 0.0.0.0/0 172.18.0.0/16
…
关键发现:pkts 全是 0,流量没有进入 FORWARD 链!
3.4 第四阶段:NAT 转发排查
1. 检查 NAT 表 PREROUTING 链
iptables -t nat -L PREROUTING -n -v –line-numbers
输出:
Chain PREROUTING (policy ACCEPT)
num pkts bytes target
1 27 1620 DNAT tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8001 to:172.18.0.5:80
2 1671K 99M DOCKER all — * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
关键发现:
- DNAT 规则匹配了 27 个包
- 说明 DNAT 执行成功了
- 但 FORWARD 链 pkts 为 0,说明 DNAT 后流量消失
2. 检查容器网络路由
ip route get 172.18.0.5
输出:
172.18.0.5 dev br-229d245aa9a2 src 172.18.0.1
结论:✅ 路由正常,容器在 br-229d245aa9a2 网桥上
3. 多接口抓包验证
- 在入接口抓包
tcpdump -i bond4 port 8001 -nn
- 在容器网桥抓包
tcpdump -i docker0 port 80 -nn
结果:
- bond4 收到了 SYN 包 ✅
- docker0 没有流量 ❌
结论:DNAT 执行了,但流量没有转发到容器网络
3.5 第五阶段:系统配置排查(最终定位)
检查 IP 转发
sysctl net.ipv4.ip_forward
输出:
net.ipv4.ip_forward = 0
🎯 根本原因找到了!
IP 转发未开启,导致 DNAT 后的流量无法转发到容器网络。
4 问题根因
4.1 流量路径分析
┌─────────────────────────────────────────────────────────┐
│ 流量路径分析 │
├─────────────────────────────────────────────────────────┤
│ 客户端 SYN 包 │
│ ↓ │
│ bond4 接口接收 ✅ │
│ ↓ │
│ PREROUTING 链 DNAT ✅ (8001 → 172.18.0.5:80) │
│ ↓ │
│ 路由决策 → 需要转发到容器网络 │
│ ↓ │
│ ip_forward = 0 ❌ ← 在这里被阻断! │
│ ↓ │
│ 流量被丢弃,无法进入 FORWARD 链 │
└─────────────────────────────────────────────────────────┘
5 解决方案
5.1 开启 IP 转发
sysctl -w net.ipv4.ip_forward=1
5.2 持久化配置
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
6 知识点总结
6.1 Docker 流量路径
外部请求 → PREROUTING(DNAT) → FORWARD → POSTROUTING(MASQUERADE) → 容器
不是走 INPUT 链!
6.2 排查关键点
┌────────────┬─────────────────────────────────────┬──────────────────┐
│ 检查项 │ 命令 │ 说明 │
├────────────┼─────────────────────────────────────┼──────────────────┤
│ 端口监听 │ ss -tlnp │ 确认服务是否启动 │
├────────────┼─────────────────────────────────────┼──────────────────┤
│ 本机测试 │ curl 127.0.0.1:端口 │ 排除服务本身问题 │
├────────────┼─────────────────────────────────────┼──────────────────┤
│ 抓包分析 │ tcpdump -i any port 端口 │ 确认流量是否到达 │
├────────────┼─────────────────────────────────────┼──────────────────┤
│ INPUT 链 │ iptables -L INPUT -n │ 普通服务检查 │
├────────────┼─────────────────────────────────────┼──────────────────┤
│ FORWARD 链 │ iptables -L FORWARD -n -v │ Docker 服务检查 │
├────────────┼─────────────────────────────────────┼──────────────────┤
│ NAT 表 │ iptables -t nat -L PREROUTING -n -v │ 端口映射检查 │
├────────────┼─────────────────────────────────────┼──────────────────┤
│ IP 转发 │ sysctl net.ipv4.ip_forward │ 转发功能开关 │
└────────────┴─────────────────────────────────────┴──────────────────┘
6.3 常见问题速查
| Connection refused | 端口未监听或 INPUT REJECT |
| Trying… 卡住 | 防火墙 DROP 或 ip_forward=0 |
| 本机通,外部不通 | 监听 127.0.0.1 或 iptables 问题 |
| Docker 端口不通 | FORWARD 链 DROP 或 ip_forward=0 |
7 排查流程图
7.1 排查流程图

8 复盘总结
本次排查涉及的关键环节:
写在最后
文章整体总结分析了一次端口访问异常的问题排查和定位过程,详细介绍了定位的过程及思路,希望对您有所帮助,也欢迎关注、点赞和收藏。 博主专注运维和SRE领域,拥有多年大厂经验。欲了解更多,欢迎关注我的博客,目前专栏《运维Linux基础》和《真实问题案例》也在持续更新中,有需要的朋友,欢迎查看、点赞、收藏和评论!!!





