Docker Redis 本地能 Ping 通但 6379 端口连不上?排查记录与解决

这是一篇为您定制的 CSDN 风格博文。您可以直接复制到 CSDN 编辑器中发布。


🐛 Docker Redis 本地能 Ping 通但 6379 端口连不上?排查记录与解决

摘要 :在 Linux 服务器上部署 Redis Docker 容器,本地连接正常,但远程主机 telnet 端口不通。经过层层排查,最终发现是 Linux 内核参数 net.ipv4.ip_forward 被关闭导致的。本文记录了完整的排查思路与解决方案。

🔴 问题现象

环境信息:

  • 宿主机 IP192.168.105.222 (CentOS)
  • Redis 版本redis:7.4.6 (Docker)
  • 端口映射0.0.0.0:6379->6379/tcp

故障表现:

在宿主机本地使用 redis-cli 连接一切正常,但在远程 Windows 机器上测试:

  1. Ping 正常(网络层通畅)
  2. Telnet 失败(TCP 连接拒绝/超时)
powershell 复制代码
PS C:\Users\User> ping 192.168.105.222
来自 192.168.105.222 的回复:字节=32 时间=1ms TTL=64

PS C:\Users\User> telnet 192.168.105.222 6379
正在连接192.168.105.222...无法打开到主机的连接。 在端口 6379: 连接失败

🔍 排查过程

第一步:检查 Redis 配置(排除法)

最常见的原因是 Redis 开启了保护模式或设置了密码。

bash 复制代码
$ docker exec redis redis-cli CONFIG GET protected-mode
1) "protected-mode"
2) "no"  ✅ 已关闭

$ docker exec redis redis-cli CONFIG GET requirepass
1) "requirepass"
2) ""    ✅ 无密码

结论:Redis 配置没有问题。

第二步:检查 Docker 端口映射

确认 Docker 是否真的在监听外部端口。

bash 复制代码
$ docker ps --format "table {{.Names}}\t{{.Ports}}"
NAMES    PORTS
redis    0.0.0.0:6379->6379/tcp, :::6379->6379/tcp

$ ss -tlnp | grep 6379
LISTEN 0 1024 *:6379 *:* users:(("docker-proxy",pid=44615,fd=4))

结论 :端口映射正常,docker-proxy 正在监听 0.0.0.0

第三步:检查防火墙与 iptables

bash 复制代码
$ systemctl status firewalld
Active: inactive (dead)  ✅ 防火墙已关闭

$ iptables -L -n | grep 6379
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:6379 ✅ 规则存在

结论:防火墙未拦截,NAT 规则已生成。

第四步:检查 IP Forwarding(🔥 锁定元凶)

Docker 容器网络依赖宿主机的 IP 转发 功能。如果该功能被禁用,宿主机将无法将数据包从物理网卡转发到 Docker 网桥。

bash 复制代码
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0  ❌ 发现异常!

分析

虽然 iptables 允许了流量,但 Linux 内核层面的 IP 转发开关是关闭的 (0)。这意味着当外部请求到达宿主机网卡后,内核拒绝将其转发给 Docker 容器,导致连接在 TCP 层直接被丢弃。


🛠️ 解决方案

方法一:临时修复(立即生效,重启失效)

bash 复制代码
sudo sysctl -w net.ipv4.ip_forward=1

方法二:永久修复(推荐,写入配置)

编辑 /etc/sysctl.conf,添加或修改以下参数:

bash 复制代码
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sudo sysctl -p

✅ 验证结果

再次执行检查,确认参数已变为 1:

bash 复制代码
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

此时远程机器再次尝试连接:

powershell 复制代码
PS C:\Users\User> telnet 192.168.105.222 6379
Connected to 192.168.105.222.  (连接成功!)

💡 原理分析:为什么需要 ip_forward?

Docker 默认使用 bridge 网络模式,这是一种 NAT(网络地址转换)模式:

复制代码
[远程客户端] -> (宿主机 IP:6379) -> [docker-proxy] -> (iptables NAT) -> [容器 IP:6379]
  1. 接收包:数据包到达宿主机的物理网卡(eth0)。
  2. 路由判断:内核发现目标 IP 是容器 IP(172.17.0.x),需要将包发送到 docker0 网桥。
  3. 转发检查 :因为是从一个接口进,另一个接口出,这属于**转发(Forwarding)**行为。
    • 如果 net.ipv4.ip_forward = 0:内核直接丢弃包 ❌
    • 如果 net.ipv4.ip_forward = 1:内核允许包通过,交由 iptables 处理 ✅

📝 总结

遇到 "本地能通,远程不通" 的 Docker 端口问题时,除了检查防火墙和端口映射,千万别忽略内核参数 net.ipv4.ip_forward

特别是有些系统安全加固脚本或最小化安装的系统,默认会关闭此参数,导致 Docker 网络功能受损。


如果你觉得这篇博文对你有帮助,欢迎点赞 👍 收藏 ⭐ 支持一下!

相关推荐
Horn Still Sounds11 小时前
Linux网络编程|UDP与TCP传输层协议深度梳理
linux·网络·tcp/ip·udp
Mortalbreeze12 小时前
深入理解 Linux IO 模型(一):阻塞 IO、非阻塞 IO 与信号驱动 IO
linux·运维·服务器
一直C12 小时前
Linux应用软件编程|TCP协议与Socket全套编程(三次握手、四次挥手、报文头部、核心机制)
linux·网络协议·tcp/ip·wireshark·vim·visual studio
2301_7807896612 小时前
CDN提供商常用的DDoS缓解技术与策略
linux·运维·服务器·人工智能·架构
夏炳辉.13 小时前
Rocky Linux 8 从零安装 psql(PostgreSQL 客户端)
linux·运维·postgresql
β添砖java13 小时前
学习笔记:实战章节:在Linux上部署各类软件
linux·笔记·学习
老当益壮梁奶奶13 小时前
Linux软件编程学习笔记(十一):深入浅出 TCP 协议与 Socket 编程实践
linux·c语言·笔记·学习·tcp/ip
MetaLite13 小时前
SpringBoot防重复提交-加一把Redis锁就够吗
spring boot·redis·后端
speop14 小时前
hell-gpu| TASK01-2
linux·运维·算法
byte轻骑兵14 小时前
【BlueZ 】用户态入口:main.c 核心函数与程序启动流程
linux·人工智能·bluez·电脑蓝牙·嵌入式蓝牙