这是一篇为您定制的 CSDN 风格博文。您可以直接复制到 CSDN 编辑器中发布。
🐛 Docker Redis 本地能 Ping 通但 6379 端口连不上?排查记录与解决
摘要 :在 Linux 服务器上部署 Redis Docker 容器,本地连接正常,但远程主机
telnet端口不通。经过层层排查,最终发现是 Linux 内核参数net.ipv4.ip_forward被关闭导致的。本文记录了完整的排查思路与解决方案。
🔴 问题现象
环境信息:
- 宿主机 IP :
192.168.105.222(CentOS) - Redis 版本 :
redis:7.4.6(Docker) - 端口映射 :
0.0.0.0:6379->6379/tcp
故障表现:
在宿主机本地使用 redis-cli 连接一切正常,但在远程 Windows 机器上测试:
- Ping 正常(网络层通畅)
- 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]
- 接收包:数据包到达宿主机的物理网卡(eth0)。
- 路由判断:内核发现目标 IP 是容器 IP(172.17.0.x),需要将包发送到 docker0 网桥。
- 转发检查 :因为是从一个接口进,另一个接口出,这属于**转发(Forwarding)**行为。
- 如果
net.ipv4.ip_forward = 0:内核直接丢弃包 ❌ - 如果
net.ipv4.ip_forward = 1:内核允许包通过,交由 iptables 处理 ✅
- 如果
📝 总结
遇到 "本地能通,远程不通" 的 Docker 端口问题时,除了检查防火墙和端口映射,千万别忽略内核参数 net.ipv4.ip_forward。
特别是有些系统安全加固脚本或最小化安装的系统,默认会关闭此参数,导致 Docker 网络功能受损。
如果你觉得这篇博文对你有帮助,欢迎点赞 👍 收藏 ⭐ 支持一下!