今天线上突然有一台机器的所有外网依赖接口开始报警。根据日志排查了下初步定为是该机器无法访问外网了。把机器脱离七层后开始排查问题。搞起~

第一反应就是先访问下外网地址。

SHELL
curl baidu.com

确定了是一个必现的问题。之后先随意 Ping 了一下域名。

SHELL
ping baidu.com

发现无论Ping任何域名都会返回如下的信息:

SHELL
Destination Host Unreachable

那么接下来开始排查网络是哪一步出了问题。

SHELL
ping 127.0.0.1

如果 ping 的通说明tcp协议栈没有问题。

SHELL
ping 主机地址

如果Ping的通说明网卡没有问题。

查看主机地址

SHELL
ifconfig -a
SHELL
ping 路由默认网关

Ping的通说明包可以到达路由器。

查看默认路由

SHELL
route -n
SHELL
ping DNS服务器地址

Ping的通说明DNS服务期解析没有问题。

查看DNS服务器

SHELL
cat /etc/resolv.conf 

最后发现路由默认的网关地址无法 ping 通。

这时候突然想到昨天运维同学帮忙解决其他问题的时候重启过这台机器。这台机器的默认网卡和默认路由不是相同的网卡。猜测之前负责的同学是临时设置的,重启后路由默认网关应该是被重置为最原始配置了。

找到问题就简单了。把路由的默认网关改为正确的网关ip就好。

SHELL
#删除之前的默认网关 (此步骤非必须,不同的网卡可以设置多个默认网关。)

route delete default gw x.x.x.x eth0

#添加正确的的默认网关

route add default gw x.x.x.x eth0

验证

SHELL
curl baidu.com

<html>

<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">

</html>

完美解决!问题到不是很难,但是排查和学习的过程很有趣。记录下、方便日后查询。

参考资料#

linux Destination Host Unreachable

4种在Linux中检查默认网关或路由器IP地址的方法-51CTO.COM

如何在Linux上添加或更改默认网关

Linux 如何查看修改DNS配置_wsxlgg的博客-CSDN博客_查看服务器dns