127.0.0.1,localhost和0.0.0.0暨🐼一次两次的神神秘秘的debug记录

前记

潘达某天在本机docker部署了他的服务,但是发现无论如何都无法ping通,他冥(疯)思(狂)苦(谷)想(歌),逛遍了GitHub上的各种issues,stack overflow上的各种回答,各种博客文章,都没有解决他的问题,直到他的mentor来到他的电脑前,一通命令猛如虎啊,发现他竟然在docker内监听了容器中的127.0.0.1的端口,那必然会访问不到,检查发现原来是在服务的config中写了magic number,让服务开在了127.0.0.1,在本地这样必然是没问题的,但是如果要与外部进行通信,那就要改成0.0.0.0了。

又是一天,潘达又部署起了他的rpc服务,想在服务器上部署一个微服务然后本机去访问,测试框架是否可以通过域名通信各个微服务,然而,服务器上启动成功,本地依然迟迟无法连接,上来就是一个curl: (7) Failed to connect to ababab.ababab port ababa: Connection refused,安全组也放行了对应的端口,然后他看到了一行127.0.0.1,但是他感觉不是这个问题,继续debug,然后再次呼叫他的mentor,希望得到帮助,还是一顿操作猛如虎,找到了那个127.0.0.1的监听服务,乐。

于是,这篇blog就诞生了。

127.0.0.1 和 localhost

127.0.0.1是回路地址中的一个,在计算机中127.*.*.*被称为回路地址,所有对这些地址的请求都会让本机接收,最最重要的是,外部设备也不能通过这个地址访问到本机的服务。 localhost其实是一个域名,他一般指代本机的网络,大多数机器都会默认localhost指向127.0.0.1,可以自行修改为其他地址。

0.0.0.0

可能我们都会以为localhost为本地的网络地址,但实际上真正的本地网络是0.0.0.0,但是他是不能被ping通的。在服务器中,0.0.0.0并不是一个真实的的IP地址,它表示本机中所有的ipv4地址。监听0.0.0.0的端口,就是监听本机中所有IP的端口。如果服务监听在0.0.0.0,那么外部访问的所有ip都可以通过对应的端口访问这个服务。

所以问题得到了解答,如果是在本机的话,127.0.0.1的话显然是没问题的,但是如果要将服务上云或者容器,就需要进行调整,首先要避开127.0.0.1,再根据是否只允许内网ip访问进行端口映射和服务监听。

后记

这两次问题前前后后折腾了半天,本想自己找到解决办法,查了不少资料后还是要寻求运维☁️的帮助,其实问题并不是很大,还是自己的知识储备不够,不能准确定位的问题的所在。另外,计网应该开始看了。🐼。

0%