
全文目录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目标端口8001Docker 容器映射端口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,pid188408,fd4))结论✅ 端口正常监听绑定所有网卡*:80012. 本机自测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_forward0 根本原因找到了IP 转发未开启导致 DNAT 后的流量无法转发到容器网络。4 问题根因4.1 流量路径分析┌─────────────────────────────────────────────────────────┐ │ 流量路径分析 │ ├─────────────────────────────────────────────────────────┤ │ 客户端 SYN 包 │ │ ↓ │ │ bond4 接口接收 ✅ │ │ ↓ │ │ PREROUTING 链 DNAT ✅(8001→172.18.0.5:80)│ │ ↓ │ │ 路由决策 → 需要转发到容器网络 │ │ ↓ │ │ ip_forward0❌ ← 在这里被阻断 │ │ ↓ │ │ 流量被丢弃无法进入 FORWARD 链 │ └─────────────────────────────────────────────────────────┘5 解决方案5.1 开启 IP 转发sysctl-wnet.ipv4.ip_forward15.2 持久化配置echonet.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 REJECTTrying… 卡住防火墙 DROP 或 ip_forward0本机通外部不通监听 127.0.0.1 或 iptables 问题Docker 端口不通FORWARD 链 DROP 或 ip_forward07 排查流程图7.1 排查流程图8 复盘总结本次排查涉及的关键环节服务层端口监听、本机访问网络层抓包确认流量到达防火墙层iptables INPUT/FORWARD/NAT 各链系统层ip_forward 内核参数写在最后文章整体总结分析了一次端口访问异常的问题排查和定位过程详细介绍了定位的过程及思路希望对您有所帮助也欢迎关注、点赞和收藏。博主专注运维和SRE领域拥有多年大厂经验。欲了解更多欢迎关注我的博客目前专栏《运维Linux基础》和《真实问题案例》也在持续更新中有需要的朋友欢迎查看、点赞、收藏和评论