项目部署到阿里云ECS之后,服务明明已经在跑,浏览器却打不开,这种情况很常见。多数时候是端口没有放行。阿里云上的访问控制分成几层,弄清楚每层管什么,排查会快很多。下面以一台普通的云服务器为例,说明阿里云设置端口时需要碰到哪些地方。

先搞清楚两层放行
外部请求到达服务器上的应用,一般要过两道关。第一道是阿里云的安全组,在云平台网络层拦截,决定哪些流量能进入实例。第二道是服务器系统自带的防火墙,常见的有firewalld、ufw和iptables。两道都放行,请求才能真正到达应用进程。
还有一个容易被忽略的地方,是应用监听的地址。如果服务只绑定在127.0.0.1上,哪怕安全组和系统防火墙都已放行,外部依然连不上。这种情况要修改应用的监听配置,改成0.0.0.0或具体的内网IP。
在控制台配置安全组规则
登录阿里云控制台,进入“云服务器ECS”,在实例列表里找到目标服务器,点击实例ID进入详情页,切换到“安全组”标签,再点“配置规则”。在入方向页签中点击“手动添加”,按下面几项填写:
- 规则方向:入方向
- 授权策略:允许
- 优先级:默认1就行,数字越小,优先级越高
- 协议类型:HTTP、HTTPS这类常用服务直接选对应预设;其他端口选自定义TCP
- 端口范围:比如80/80、443/443,或者3000/3000
- 授权对象:要全网访问就填0.0.0.0/0。只给办公网络用,就填具体的公网IP或网段,比如203.0.113.10/32,范围会小很多
保存之后规则几秒内生效,不需要重启实例。
案例:Node.js接口加Nginx反向代理
假设一台ECS上跑着Node.js接口服务,应用监听3000端口,前面由Nginx做反向代理,对外只提供80和443。安全组规则可以这样安排:
- 80和443对0.0.0.0/0放行,供用户访问网站。
- 3000端口在安全组里不需要放行。Nginx和应用在同一台机器上,本机转发就够了,公网根本不用碰这个端口。多加一条规则,反而多一个暴露面。
- 22端口用于SSH登录,只对运维人员的固定IP开放,别图省事写0.0.0.0/0。
- 3306端口的MySQL不要在安全组里对公网放行。应用通过内网地址连接数据库,访问范围限制在内网即可。
这样划分看起来麻烦,但能把攻击面压到最小。不少安全事故的起点,正是数据库或远程管理端口直接暴露在0.0.0.0/0上。
系统防火墙怎么放行
如果服务器用的是firewalld,先执行firewall-cmd –permanent –add-port=80/tcp添加规则,再执行firewall-cmd –reload让它生效。注意只加–permanent而不reload,规则不会立刻起作用。Ubuntu通常用ufw,直接执行ufw allow 443/tcp即可。改完后用firewall-cmd –list-ports或ufw status确认一下,别想当然。
端口不通时按这个顺序查
访问失败时,建议按下面的顺序逐项排查,别在某一步反复打转:
- 确认服务已经启动,用ss -tlnp看端口是否处于LISTEN状态。
- 检查监听地址。如果显示127.0.0.1:3000,说明只接受本机连接,需要改成0.0.0.0或具体内网IP。
- 核对安全组的协议、端口和授权对象有没有填错,同时看看有没有优先级更高的拒绝规则把它覆盖了。
- 检查系统防火墙状态,确认对应端口确实放行了。
- 在本地电脑上用telnet IP 端口或nc -vz IP 端口测试连通性。
这几步走下来,大多数问题十分钟内能定位。如果规则都没问题仍打不开,再确认公网IP是否正常绑定,域名解析是否指向了这台服务器。
长期维护的小习惯
端口配置最容易出问题的地方,是临时放开之后忘了收回。每次开放端口时,在规则备注里写清楚用途和负责人,定期清理已经用不到的规则。生产环境还可以打开阿里云云安全中心,看看哪些端口处于暴露状态,把端口管理从一次性操作变成日常检查。