全文目录
- 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 核心排查顺序
- 端口监听 → 2. 抓包分析 → 3. iptables 各链 → 4. NAT 转发 → 5. 系统配置
3 详细排查过程
3.1 第一阶段:确认服务状态
1. 检查端口监听
ss-tlnp|grep8001输出:
LISTEN04096*:8001 *:* users:(("docker-proxy",pid=188408,fd=4))结论:✅ 端口正常监听,绑定所有网卡(*:8001)
2. 本机自测
curl-Ihttp://127.0.0.1:8001输出:
HTTP/1.1307Temporary Redirect Location: /login结论:✅ 本机访问正常,服务本身没问题
3.2 第二阶段:抓包分析流量
1. 客户端测试
telnet2.2.2.28001现象:Trying... 卡住,无响应2. 服务端抓包
tcpdump-iany port8001-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-LINPUT-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-LFORWARD-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-tnat-LPREROUTING-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. 检查容器网络路由
iproute get172.18.0.5输出:
172.18.0.5 dev br-229d245aa9a2 src172.18.0.1结论:✅ 路由正常,容器在 br-229d245aa9a2 网桥上
3. 多接口抓包验证
- 在入接口抓包
tcpdump-ibond4 port8001-nn- 在容器网桥抓包
tcpdump-idocker0 port80-nn结果:
- bond4 收到了 SYN 包 ✅
- docker0 没有流量 ❌
结论:DNAT 执行了,但流量没有转发到容器网络
3.5 第五阶段:系统配置排查(最终定位)
检查 IP 转发
sysctlnet.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-wnet.ipv4.ip_forward=15.2 持久化配置
echo"net.ipv4.ip_forward = 1">>/etc/sysctl.confsysctl-p6 知识点总结
6.1 Docker 流量路径
外部请求 → PREROUTING(DNAT) → FORWARD → POSTROUTING(MASQUERADE) → 容器不是走 INPUT 链!
6.2 排查关键点
┌────────────┬─────────────────────────────────────┬──────────────────┐ │ 检查项 │ 命令 │ 说明 │ ├────────────┼─────────────────────────────────────┼──────────────────┤ │ 端口监听 │ ss-tlnp│ 确认服务是否启动 │ ├────────────┼─────────────────────────────────────┼──────────────────┤ │ 本机测试 │curl127.0.0.1:端口 │ 排除服务本身问题 │ ├────────────┼─────────────────────────────────────┼──────────────────┤ │ 抓包分析 │ tcpdump-iany port 端口 │ 确认流量是否到达 │ ├────────────┼─────────────────────────────────────┼──────────────────┤ │ INPUT 链 │ iptables-LINPUT-n│ 普通服务检查 │ ├────────────┼─────────────────────────────────────┼──────────────────┤ │ FORWARD 链 │ iptables-LFORWARD-n-v│ Docker 服务检查 │ ├────────────┼─────────────────────────────────────┼──────────────────┤ │ NAT 表 │ iptables-tnat-LPREROUTING-n-v│ 端口映射检查 │ ├────────────┼─────────────────────────────────────┼──────────────────┤ │ IP 转发 │sysctlnet.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 复盘总结
本次排查涉及的关键环节:
- 服务层:端口监听、本机访问
- 网络层:抓包确认流量到达
- 防火墙层:iptables INPUT/FORWARD/NAT 各链
- 系统层:ip_forward 内核参数
写在最后
文章整体总结分析了一次端口访问异常的问题排查和定位过程,详细介绍了定位的过程及思路,希望对您有所帮助,也欢迎关注、点赞和收藏。
博主专注运维和SRE领域,拥有多年大厂经验。欲了解更多,欢迎关注我的博客,目前专栏《运维Linux基础》和《真实问题案例》也在持续更新中,有需要的朋友,欢迎查看、点赞、收藏和评论!!!