服务已经启动,外部却访问不了,这是阿里云上部署网站、数据库或远程桌面时很常见的情况。多数时候是端口没有放行。ECS 通过安全组控制进出流量,新建实例默认只放行少数端口,其他端口会被挡在外面。

一、开端口前先确认服务在监听
安全组只决定流量能不能到达服务器,服务本身还得在该端口上监听。登录服务器后,Linux 执行 ss -tlnp,Windows 执行 netstat -ano,看目标端口是否处于 LISTEN 状态。如果服务只绑定在 127.0.0.1 上,外部照样连不进来。这时把监听地址改成 0.0.0.0,或改成 ECS 的私网 IP,然后重新检查一次。
二、在安全组添加入方向规则
登录阿里云控制台,进入“云服务器 ECS”,在实例详情页找到“安全组”,点击“配置规则”,切换到“入方向”,再点“手动添加”。几个字段需要留意:
- 授权策略:选“允许”。
- 优先级:数字越小优先级越高,默认 1 通常够用。
- 协议类型:Web、MySQL、SSH 一般选 TCP,DNS 这类服务选 UDP。
- 端口范围:单个端口填 8080/8080,连续端口填 6000/6010。
- 授权对象:填允许访问的 IP 或网段。只允许一台机器时,写成单个地址加 /32。
- 描述:写清用途,否则过半年就没人敢删这条规则。
保存后一般立即生效,不需要重启服务器。控制台改版后入口位置可能变化,找不到时直接在 ECS 控制台搜索“安全组”。
三、三个常见场景
案例一:Nginx 网站打不开
某小程序后端跑在 ECS 上,Nginx 已经监听 80 端口,用户却反馈浏览器访问 IP 超时。排查后发现安全组里只放行了 22 端口。补上协议 TCP、端口 80/80、授权对象 0.0.0.0/0,网站就恢复了。之后如果启用 HTTPS,443 也要放行。这一步漏掉的话,证书配好了也进不来。
案例二:Navicat 连不上云上 MySQL
开发者想用本地 Navicat 连云上 MySQL,初次设置时图省事,把 3306 端口的授权对象填成了 0.0.0.0/0。一周后,数据库日志里出现大量登录失败记录。数据库端口暴露在公网上,这类结果很快就会出现。更稳妥的做法是把授权对象改成办公室固定公网 IP,例如 203.0.113.25/32。需要多人访问时,改走 VPN 或堡垒机,别直接向全网开放数据库端口。如果用的是云数据库 RDS,还要在 RDS 的访问白名单里单独加上这个 IP。安全组放行并不等于数据库允许连接。
案例三:改了 SSH 端口后连不上服务器
某运维把 SSH 端口从 22 改成 2222,修改 sshd 配置并重启后,连接马上断开。原因是安全组没有放行 2222,新连接建立不起来。正确顺序是先在安全组添加 2222 端口规则,用新端口登录确认没问题,再删除 22 端口的规则。修改关键服务配置前,先保留一个已登录的会话,改错了还能回头处理。
四、排查时常见的几个坑
- 规则加了还是不通:先确认实例绑定的是哪个安全组。一台实例可以绑定多个安全组,规则要加到实际生效的那一个里。
- 服务器本机防火墙拦截:Ubuntu 检查 ufw,CentOS 检查 firewalld。以 firewalld 为例,执行 sudo firewall-cmd –add-port=8080/tcp –permanent,再执行 sudo firewall-cmd –reload。
- 规则互相冲突:优先级更高的拒绝规则会盖过允许规则,同一安全组里的拒绝规则要逐条检查。
- 经过负载均衡访问:端口需要在 SLB 的监听配置里添加,ECS 侧的安全组也要确认放行了负载均衡的访问。
- 测试连通性:在本地执行 telnet 公网IP 端口,或执行 nc -vz 公网IP 端口。连接成功说明这一层已经放行,连不上就回到前面几步逐项核对。
五、安全建议
- 只开放业务必需的端口。数据库、Redis、远程桌面不要对 0.0.0.0/0 开放。
- 定期检查安全组,不再使用的规则及时删除。
- 每条规则写清用途和负责人,之后接手的人才看得懂。