docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker Redis本地能Ping但6379端口连不上

Docker Redis本地能Ping通但6379端口连不上的排查与解决方法

作者:weixin_45363959

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

问题现象

环境信息:

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

  1. Ping 正常(网络层通畅)
  2. Telnet 失败(TCP 连接拒绝/超时)
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 开启了保护模式或设置了密码。

$ 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 是否真的在监听外部端口。

$ 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

$ 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 网桥。

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0  ❌ 发现异常!

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

解决方案

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

sudo sysctl -w net.ipv4.ip_forward=1

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

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

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sudo sysctl -p

验证结果

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

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

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

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

到此这篇关于Docker Redis本地能Ping通但6379端口连不上的排查与解决方法的文章就介绍到这了,更多相关Docker Redis本地能Ping但6379端口连不上内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文