网站或数据库部署到阿里云ECS后,外网访问不了是很常见的情况。程序明明已经启动,浏览器却一直转圈,这时很多人第一反应是去阿里云服务器关闭防火墙,看看问题能不能立刻消失。关掉之后页面确实通了,但这一步往往只是把问题遮住了。这篇文章讲清楚阿里云服务器上的防火墙有哪几层,排查时该按什么顺序来,以及什么情况下关闭才算合理。

阿里云服务器上的防火墙有两层
平时说的“防火墙”,经常指两个不同的东西,改错地方就会白忙。第一层是云平台侧的安全组,在阿里云ECS控制台里配置,规则决定哪些来源IP能访问实例上的哪些端口。第二层是操作系统自己的防火墙,Alibaba Cloud Linux或CentOS上通常是firewalld,Ubuntu上常见的是ufw,也有人直接写iptables规则。两层是叠加关系,只要任何一层拦住了,外部请求就到不了你的应用。所以排查时,只确认其中一层放行了,并不能说明问题解决。
一次“网站打不开”的实际排查
某小型电商团队在阿里云ECS上部署了一个Node.js后台,程序监听8080端口。服务器本机用curl访问一切正常,外网浏览器却一直超时。工程师的第一反应是关闭系统防火墙,关掉后网站确实能打开。问题是,两天后服务器上出现大量异常登录尝试,SSH端口也等于对全网敞开了。事后复盘,原因很简单:安全组没有放行8080端口,系统防火墙其实并没有拦截任何东西。
这件事的代价在于,关防火墙解决了眼前的访问问题,却把整台机器的保护撤掉了。下次遇到同样的现象,应该先看安全组,再动系统层。
排查顺序
- 先确认应用真的在监听。登录服务器,执行 ss -tlnp 查看端口状态。如果程序绑定在127.0.0.1上,外部请求无论怎么放行都进不来,这时要改应用的监听地址,而不是动防火墙。
- 再检查云端安全组。在ECS控制台的安全组里,为需要对外提供服务的端口添加入方向规则。授权对象尽量写成具体IP段,比如办公网出口地址,避免图省事直接填0.0.0.0/0。
- 然后检查系统防火墙。用 firewall-cmd –list-all 或 ufw status 查看当前规则。如果确实有拦截,只放行对应端口,不要整体停掉服务。
- 最后才考虑临时关闭。这一步只用于判断故障范围,排查完必须恢复,并记下操作时间。
确实需要临时关闭时
在内网调试,或者需要判断故障到底出在哪一层时,临时停掉系统防火墙是可以接受的。firewalld的停止命令是 systemctl stop firewalld,恢复用 systemctl start firewalld,如果希望开机后自动生效,还要执行 systemctl enable firewalld。ufw则是 ufw disable 和 ufw enable。这些操作本身都能撤回,但有两个地方容易漏。第一,关闭期间服务器没有系统层过滤,安全组必须同时收紧,否则等于完全暴露在公网上。第二,恢复之后要核对规则,和关闭前的 firewall-cmd –list-all 或 ufw status 输出对比一下,确认没有多出或少掉的条目。
几条实际建议
- SSH端口不要对全网开放。固定办公网出口IP做白名单,或者通过堡垒机登录。临时出差需要连接时,可以单独加一条规则,用完立刻删除。
- MySQL、Redis这类数据库端口不应暴露在公网。只允许应用服务器的内网地址访问,应用和数据库分开部署时,同一VPC内的内网IP更合适。
- 每次修改安全组或系统防火墙规则,都在备注里写明原因和时间。过半年再回头看,才能分清哪些规则仍然必要。
- 定期到阿里云安全中心查看异常登录和攻击记录。发现某个IP频繁尝试SSH时,直接收紧白名单,不要等出事后再处理。
小结
阿里云服务器关闭防火墙在排障时偶尔有用,但不适合当成长期方案。先分清安全组和系统防火墙各管哪一层,只放行真正需要的端口,把暴露面控制在可接受的范围内,大多数访问问题都能定位。遇到具体报错时,把端口监听结果和当前规则整理出来,逐层核对,比直接关掉更省事,也更安全。