Redis 无法本地连接?可能是这个问题

如果 Redis 能够远程访问而不能本地连接,那你可以考虑是不是防火墙的配置出现了问题。

问题描述

我打算在云服务器上部署一个 Java 应用,需要连接 Redis,我设置了 Redis 密码并开放了相应的端口,使用远程客户端成功连接 Redis。接着,我将 Redis 的配置加入到 Spring 的 yml 文件中,完成打包并部署到云服务器上。然而,启动 Java 应用时出现失败,查看日志后发现了错误信息。
在这里插入图片描述

原因分析

既然可以远程连接 Redis,说明 Redis 配置没有问题。那么为什么本地连接失败呢?我尝试了多种方法,最后发现问题出在防火墙配置上。

为了说明问题,假设服务器的 IP 地址为 29.125.56.221

环境说明

我的 Java 应用和 Redis 是部署在同一台服务器的,并且在 6379 端口限制 IP 访问,仅允许我本地的电脑访问。考虑到后面可能会用 docker 部署,我 Java 应用关于 Redis 的配置并没有使用 localhost,而是 29.125.56.221(我服务器的 IP)。

错误分析

我错误地认为向 29.125.56.221 发送请求就等同于向 127.0.0.1 发送请求,因此不会受到防火墙的限制。其实,向这两者发送数据包是有本质区别的。因为发送到 29.125.56.221 的数据包源 IP 和目标 IP 都是外部 IP,而不是回环地址,这导致数据包会被防火墙拦截。而向 127.0.0.1 发送数据包是通过回环接口,不会经过物理网卡,也不受防火墙的限制。

具体分析如下:

方面向 127.0.0.1 (localhost)向 29.125.56.221 (服务器自身的 IP)
数据路径直接通过回环接口(lo),不经过物理网卡,完全在内核中处理。数据包经过物理网卡(如 eth0),再通过路由返回本机。
源 IP127.0.0.129.125.56.221
目标 IP127.0.0.129.125.56.221
防火墙链主要涉及 OUTPUTINPUT 链。涉及 PREROUTINGFORWARDPOSTROUTINGINPUTOUTPUT 链。
数据包处理流程1. 数据包生成后直接进入 OUTPUT 链。1. 数据包生成后进入 OUTPUT 链。
2. 从回环接口进入 INPUT 链,交付给本地应用程序。2. 从物理网卡出发,进入 POSTROUTING 链。
3. 数据包通过网络栈路由后重新进入 PREROUTING 链。
4. 若目标为本机,数据包进入 INPUT 链,交付给本地应用程序。
性能开销较低,无需经过网卡和物理路由。较高,需要经过网卡和完整的网络路由。
安全性默认被视为可信任通信,防火墙通常较少限制。数据包会被视为普通外部流量,防火墙规则可能会更严格。

解决方法

使用 localhost

如果不打算使用 docker 部署,那么不如将将 Redis 的配置修改为 localhost,这样,数据包将通过回环接口,不会受到防火墙的限制,从而确保 Redis 能成功连接。

在防火墙配置中放行本机 IP

这听起来有些奇怪,但是确实有用。如果不想将 Redis 配置为 localhost,可以通过以下方法放行本机 IP 的 6379 端口。

步骤:

  1. 针对本机 IP 放行 6379 端口:firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="29.125.56.221" port port="6379" protocol="tcp" accept'
  2. 防火墙重载配置:firewall-cmd --reload
  3. 查看端口的放行情况:firewall-cmd --list-all | grep 6379

这样设置后,Java 应用就可以正常连接 Redis 了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值