安全组已放行 8080 端口,服务还是访问不了?三层排查法一次讲清
问题现象
在华为云弹性云服务器 ECS 上部署了一个 Spring Boot 应用,监听 8080 端口。已经在控制台把安全组的入方向规则放行了 8080 端口,源地址写的是 0.0.0.0/0,可浏览器访问 服务器公网IP:8080 还是打不开,提示连接超时。
很多人第一反应是“安全组没生效,再点一次”。其实,从公网请求到达应用要经过三道关卡:安全组(云上防火墙)、系统防火墙(firewalld/iptables)、应用监听地址。任何一层没放通,结果都一样:超时。按下面三层从外到内排查,一般十分钟就能定位。
第一层:安全组——方向、端口、源地址
安全组是云上的虚拟防火墙,默认拒绝所有入方向流量,必须显式放行。
- 进控制台:弹性云服务器,找到实例,安全组,配置规则,入方向规则。
- 核对四项:协议端口填 8080/8080(或端口范围包含 8080),源地址填 0.0.0.0/0(测试阶段;生产环境建议只放行可信 IP 段),方向必须是入方向,优先级不要被一条拒绝规则压住。
- 注意:如果实例挂了多个安全组,规则是并集生效,放行一条就够;但如果安全组还关联了网络 ACL,ACL 是另一层,需要同时放行。
- 改完立刻验证:telnet 公网IP 8080 能通,说明安全组这层没问题。
第二层:系统防火墙——最容易被忽略的一层
安全组放行了,不代表操作系统里的 firewalld 也放行了。EulerOS、CentOS 默认可能开启 firewalld,而 Ubuntu 常用 ufw。
# 查看 8080 是否在监听
ss -tlnp | grep 8080
# 查看 firewalld 当前放行的端口
sudo firewall-cmd --list-ports
# 放行 8080 并重载(firewalld)
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
# 如果是 iptables 规则
sudo iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
判断方法很简单:在服务器本机上 curl 127.0.0.1:8080 能通,说明应用本身正常,问题在防火墙或安全组;本机都 curl 不通,问题在应用层。
第三层:应用监听地址——127.0.0.1 的坑
这是最隐蔽的一种。应用启动时绑定了 127.0.0.1,只接受本机连接,外部请求根本进不来。本机 curl 正常、端口也在监听,但公网就是访问不了。
# 只看监听地址这一列
ss -tlnp | grep 8080
# 如果显示 127.0.0.1:8080,就是只监听了本地回环地址
# 正常应为 0.0.0.0:8080 或 :::8080
Spring Boot 的修复方法是在 application.properties 里写上:
server.address=0.0.0.0
server.port=8080
改完重启应用,再用 ss -tlnp 确认监听地址变成 0.0.0.0:8080。
三层定位口诀
现象:本机 curl 127.0.0.1:8080 不通,定位:应用本身没起来,看日志和监听地址。
现象:本机通,telnet 公网IP 8080 不通,定位:安全组或系统防火墙,逐层放行。
现象:telnet 通,浏览器打不开,定位:检查应用返回、反向代理或域名解析。
安全提醒
排查时图方便可以临时把源地址放宽到 0.0.0.0/0,但问题定位后一定要收紧回来。22、3389、3306、6379 这类端口不要长期对公网全开,改用指定 IP 白名单或跳板机访问。
总结
安全组放行只是第一步,系统防火墙和应用监听地址同样会挡住流量。记住顺序:先确认监听地址是 0.0.0.0,再放行系统防火墙,最后核对安全组,下次再遇到端口不通,就不用一层层瞎试了。
- 点赞
- 收藏
- 关注作者
评论(0)