No route to host 错误的解决

实验室需要一个新的 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

No Route to Host error and solution

redis “No route to host” when pinging a remote redis host