在阿里云上部署好网站或接口,外部访问却一直超时,新手大多会遇到这个情况。问题通常不出在程序本身。ECS实例默认拦截大部分入站流量,外部要能连上服务,云端安全组和服务器系统防火墙都得放行。排查时两层都要看。

安全组和网络ACL的区别
在阿里云上开放端口,主要靠安全组。安全组可以理解为绑在实例上的虚拟防火墙,决定哪些入站请求能进来,哪些出站请求能出去。它是有状态的:入方向请求放行后,对应的返回数据自动放行,不需要再单独加出方向规则。
如果实例位于专有网络(VPC)里,还可能受网络ACL影响。网络ACL作用在子网上,规则是无状态的,入方向和出方向要分别放行。个人和小型项目一般只配安全组。端口已经放行却还是不通,再去查网络ACL。
在安全组里添加规则
下面以开放8080端口的Web服务为例。控制台界面会随版本变化,具体菜单名以阿里云官网当期文档为准。
- 登录ECS管理控制台,进入“实例”列表,找到目标实例。
- 点击实例ID进入详情页,切换到“安全组”页签,再点击绑定的安全组ID。
- 在安全组页面选择“手动添加”,进入入方向规则。
- 授权策略选“允许”。优先级保持默认即可,数值越小优先级越高,需要覆盖其他规则时再调整。协议类型选“自定义TCP”,端口范围填“8080/8080”。
- 授权对象按用途填写。只允许一台办公电脑访问时,填它的公网IP加“/32”,例如“203.0.113.10/32”。只有确实要面向所有人开放时,才填“0.0.0.0/0”。
- 保存后规则在数秒内生效,不用重启实例。
三个容易出错的地方
- 端口范围格式要正确。单个端口写成“8080/8080”,连续多个端口写成“8000/8100”。端口栏里只放端口号和斜杠,不要混入协议名或空格。
- 协议选错会直接不通。HTTP和大多数Web接口用TCP。DNS查询、部分游戏服务可能用UDP,部署前先确认服务用的是哪种协议。
- 规则要加在真正生效的安全组上。一台实例可以绑定多个安全组,先在实例详情页看清实际绑定了哪一个,再去添加规则。
服务器内部防火墙
安全组放行后,如果系统防火墙仍在拦截,外部照样连不上。CentOS和Alibaba Cloud Linux一般用firewalld,Ubuntu一般用ufw。以firewalld为例,执行:
sudo firewall-cmd –permanent –add-port=8080/tcp
sudo firewall-cmd –reload
Ubuntu上执行sudo ufw allow 8080/tcp即可。只有系统防火墙已经开启时才需要这一步。
确认服务监听的是外部地址
还有一种常见情况:程序只监听了127.0.0.1。这时即使安全组和防火墙都放行,外部请求也到不了服务,因为服务只接受本机的连接。在服务器上执行下面的命令看一眼:
ss -lntp | grep 8080
如果输出是“127.0.0.1:8080”,把程序的监听地址改成“0.0.0.0:8080”,然后重启服务。如果输出是“0.0.0.0:8080”或“*:8080”,说明服务已经对外监听,问题在别处。
从外部测试端口
在自己的电脑或另一台服务器上执行:
nc -vz 公网IP 8080
输出“succeeded”或“Connected”,说明端口可达。如果超时,按这个顺序查:安全组规则是否生效,授权对象是否包含你的出口IP,系统防火墙,服务监听地址。一层一层排除,通常十分钟内能找到原因。
案例一:Flask接口一直超时
某开发者在ECS上部署了一个Flask接口,监听5000端口。本地测试正常,外部访问却一直超时。他检查后发现两个问题:
- 安全组只放行了22和80端口,5000端口没有规则,这是首要原因。
- 程序用的是app.run()默认配置,只监听127.0.0.1。
他在安全组里加了“自定义TCP、5000/5000、授权对象0.0.0.0/0”的规则,同时把启动参数改成host=0.0.0.0,接口恢复正常。这只是测试接口,所以他后来把授权对象收窄到了固定的前端服务器IP。
案例二:MySQL被暴力破解
另一位用户为了方便远程连接数据库,把安全组的3306端口授权给了“0.0.0.0/0”。不到两天,云监控提示登录失败次数异常增多,数据库里还出现了陌生账号。
他的处理分三步。第一,删除3306端口的全网开放规则。第二,只允许办公网出口IP访问,规则写成“办公网IP/32”。第三,修改数据库密码,清理异常账号。如果确实需要远程访问数据库,更稳妥的做法是使用RDS白名单,或者通过VPN、堡垒机连接,不要直接把数据库端口暴露在公网上。
开放端口的几条原则
- 按需开放。只开业务实际用到的端口。为省事而全部开放,会让服务器的攻击面变大。
- 限制来源。22、3389和数据库端口这类管理端口,授权对象尽量只填固定IP。
- 及时清理。测试结束后马上删除临时规则,别让它长期留在安全组里。
- 保持服务更新。端口只是入口,对外的服务要及时修补漏洞,否则放行端口反而增加风险。