Linux防火墙未关闭踩的坑—— No route to host

网络服务很多时候和Linux防火墙都有着很多的关系,经常因为没有关闭Linux防火墙而导致一些奇葩问题的出现。

现有两台服务器 S1 和 S2,在 S1 上部署程序 P1,在 S2 上部署 P2,发现 P1,P2 连接报错,日志只有很简单的 connect S2_IP fail!

试了下在 S1 上部署 P1,P2。能直接连接上。

最后为了找到问题,又找了个服务器 S3,在 S3 上同时部署 P1 和 P2,在 S1 上部署程序 P1,在 S2 上部署 P2。然后gdb S1 和 S3 上的 P1。

最后发现问题在于这一行代码

    getsockopt(s, SOL_SOCKET, SO_ERROR, &error, &len);

    /*
     * 根据 error 的值做相应的处理
    */

在 S3 上的 P1,执行完此行后 error 的值是 0 。但在 S1 上执行完此行后, error 的值是 113 。

搜了下 SO_ERROR 值 113 是什么错,搜了上 getsocktopt SO_ERROR 113 。找到 SO_ERROR values 的值为 113 是因为 no route to host 。(在 /usr/include/asm-generic/errno.h 文件可以找到)

#define EHOSTUNREACH 113 /* No route to host */

也就是没找到主机的路由,搜了下这大概是什么原因造成的,一眼看到防火墙未关闭几个大字,就明白了。因为 S2 上的防火墙没有关闭,所以 P1 连接 P2 fail!

手动关闭 S2 上的防火墙,再运行 S1 上的 P1 和 S2 上的 P2,发现连接成功。注意 Redhat 7 不支持 service iptables stop 了,需要用 systemctl 。

参考博客、文章:
getsockopt和setsockopt函数

Linux getsockopt SO_ERROR values (errno.h)

Connect error: No route to host(errno:113) 连接错误解决办法--关闭iptables防火墙

Redhat Linux 7 关闭防火墙命令

linux systemctl命令详解

linux防火墙

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值