实验室需要一个新的 redis 服务器,作为内网的公共服务。所以配了个内存 20G 硬盘 15G 的奇葩货。 这货的操作系统为 CentOS, 基本什么都没装, 通过 ISO 捣腾出来后,就用 yum 更新了下,加了个 tmux 和 redis, 一通配置完毕 chkconfig redis on, 然后自嗨了下。

[root@localhost ~]# redis-cli ping
PONG

这种小事做起来毫无压力,写写代码看看俺妹顺便搞定操作系统,三线操作真是毫无压力,收工的时候,顺手测试下远程ping下--本来只是走个程序而已,意外发现居然没有得到需要的 PONG.

[yu@argcv ~]$ redis-cli -h xx.xx.xx.xx
Could not connect to Redis at xx.xx.xx.xx:6379: No route to host
not connected> 

我了个擦,这是毛情况。 redis的.conf 文件中如果有内容如下:

bind 127.0.0.1

那么它就会被配置为仅接受本地的请求,这个是早就知道的,所以在此之前已经设置为

# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
#
# bind 127.0.0.1
bind 0.0.0.0

无误,但为什么还是有问题呢? google 很久,大多是一些愚蠢的错误,比如service居然不知道开的什么的。从一地鸡毛中终于找到了一些关键线索: iptables。

iptables 是管理系统 IO 的重要工具,里面一坨坨的规则让系统知道什么地址来了做什么,顺便还有防火墙和 log 记录的功效。CentOS 编译完毕后,预设了一大堆的规则,导致我亲爱的 redis 直接被挡在 VM 里面了。

通过命令

# iptables -L -n

或者

# iptables --list

可以发现了一组 CentOS 预设的规则信息,具体是否某个内容挡道了,不甚了然。 反正在内网,关掉试试先。

RH系列可以通过如下命令搞定

/etc/init.d/iptables save
/etc/init.d/iptables stop

然后再试试,发现搞定了。果然是它的问题。

其它发行版也可以使用下面这组命令 -- 这组命令对RH用户同样有效,大意是删掉所有 iptables 的规则。

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

生效后一般不会出现问题了.

当然,防火墙什么的还是要有的,安全还是不能忽视的。我这个 VM 是在内网中使用,安全稍微随意点,但到了外网,还是要做好工作的,iptables 的设置可以参考 References 之 2.

一般情况下, redis 会开放&监听 6379 端口,我们只需要开放此端口一般就可以了。

iptables -A INPUT -p tcp --dport 6379 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 6379 -j ACCEPT

这样打开 6379 的 IO 就可以了. 然后保存一下。

需要说明的是,CentOS默认使用的已经不是iptables了,所以重启后可能有点奇怪的事情发生,各位可以考虑看看这个配置下。

References

  1. No Route to Host error and solution
  2. redis “No route to host” when pinging a remote redis host
来自的你,很高兴你能看到这儿。若本文对你有所用处,或者内容有什么不足之处,敬请毫不犹豫给个回复。谢谢!