Linux 服务器端口无法访问排查实录
2026/6/13 16:17:54 网站建设 项目流程

全文目录

    • 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 核心排查顺序

  1. 端口监听 → 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 ✅(8001172.18.0.5:80)│ │ ↓ │ │ 路由决策 → 需要转发到容器网络 │ │ ↓ │ │ ip_forward=0❌ ← 在这里被阻断! │ │ ↓ │ │ 流量被丢弃,无法进入 FORWARD 链 │ └─────────────────────────────────────────────────────────┘

5 解决方案

5.1 开启 IP 转发

sysctl-wnet.ipv4.ip_forward=1

5.2 持久化配置

echo"net.ipv4.ip_forward = 1">>/etc/sysctl.confsysctl-p

6 知识点总结

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 复盘总结

本次排查涉及的关键环节

  1. 服务层:端口监听、本机访问
  2. 网络层:抓包确认流量到达
  3. 防火墙层:iptables INPUT/FORWARD/NAT 各链
  4. 系统层:ip_forward 内核参数

写在最后

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


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询