很多从事Linux运维相关工作的人员,往往都会遇到这样一种比较常见的情况:
明明相关服务已经完成启动,通过ss -lntp命令也能够看到对应端口处于LISTEN监听状态,但是使用浏览器进行访问时却没有办法正常打开,远程连接同样无法建立。甚至还会出现本机访问完全正常,但是从外部网络进行访问时,却始终无法连接的状况。
那么,这个问题到底出现在什么位置?
实际上,端口已经处于正常监听状态,只能够说明对应的应用进程已经启动,并且已经做好了接收连接请求的准备,却并不能代表从外部客户端到应用服务之间的整条访问链路已经完全打通。
一次相对完整的外部访问,通常需要经过多个不同的网络以及系统环节。
客户端发出的请求,可能会依次经过公网入口、云服务器安全组、路由或者NAT转换、Linux系统防火墙、反向代理服务、应用监听端口,最后才会真正到达后端应用,并由应用返回相对应的响应结果。
在这一整条访问路径当中,只要任何一个环节出现配置错误、策略限制或者服务异常,都有可能导致用户看到连接超时、连接被拒绝、HTTP 502、HTTP 504以及其他相关问题。
所以,在排查“服务已经启动但外部无法访问”这一类问题时,不能只是反复查看进程有没有运行,也不能简单地把端口处于LISTEN状态,当作网络已经完全正常的依据。
本文会通过一套相对完整的排查思路,帮助大家理解Linux服务在对外开放的过程当中,每一个环节分别承担什么样的职责,以及不同问题应该从什么位置开始进行定位。