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 网络功能受损。


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

相关推荐
洛水水6 小时前
Redis 实现限流功能的几种方法
数据库·redis·缓存
Python-AI Xenon6 小时前
Linux逻辑卷(LVM)初始化与文件系统选型全指南
linux·运维·性能测试·存储
米高梅狮子6 小时前
Redis
数据库·redis·mysql·缓存·docker·容器·github
z202305087 小时前
RDMA之RoCEv2 无损网络PFC 、DCQCN 和ECN (7)
linux·服务器·网络·人工智能·ai
dadaobusi7 小时前
MRIF说明
linux
我星期八休息7 小时前
Linux系统编程—库制作与原理
linux·运维·服务器·数据结构·人工智能·python·散列表
一个在高校打杂的7 小时前
honeypot之opencanary(轻量化蜜罐)
linux·网络安全·网络攻击模型·安全威胁分析·策略模式
s_w.h7 小时前
【 linux 】认识make和makefile
linux·运维·bash
不怕犯错,就怕不做7 小时前
ARM设备异常断电容易造成数据损坏,硬件如何设计
linux·驱动开发·嵌入式硬件