欢迎光临
我们一直在努力

Linux 服务器端口无法访问排查实录

全文目录

    • 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 | grep 8001

    输出:

    LISTEN 0 4096 *:8001 *:* users:(("dockerproxy",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 ✅ (8001172.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 复盘总结

    本次排查涉及的关键环节:

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

  • 写在最后

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


    赞(0)
    未经允许不得转载:171主机测评 » Linux 服务器端口无法访问排查实录
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址