网站、数据库或其他服务部署到阿里云之后,最常见的问题是服务在服务器上明明已经跑起来了,外面却打不开。多数时候程序本身没问题,是云服务器的安全组没有放行对应端口。这篇文章按实际操作顺序讲阿里云添加端口的方法,also 说明安全组之外还要检查哪些地方。

为什么端口要单独放行
阿里云ECS默认会限制入站流量。服务器上的进程可能已经在监听80、3306或8080,但只要安全组里没有对应的允许规则,外部请求会在云平台这一层就被挡住,到不了服务器系统。
这样设计是为了减少暴露面。开放的端口越多,可被扫描和攻击的入口就越多。所以只放行业务确实需要的端口,图省事全部打开并不可取。
操作前先确认四件事
- 服务是否已经在服务器上正常运行。可以用 netstat -tlnp 或 ss -tlnp 查看端口是否处于监听状态。
- 协议用TCP还是UDP。多数Web服务和数据库使用TCP,协议开错等于没开。
- 访问来源是否需要限制。比如数据库只允许公司办公网出口IP连接。
- 当前账号是否有修改安全组的权限,权限不足时规则会改不进去。
在控制台添加安全组规则
登录阿里云控制台,进入“云服务器ECS”,在左侧菜单“网络与安全”下找到“安全组”。选中实例绑定的安全组,点击“配置规则”,切换到“入方向”标签页,再点“手动添加”。
表单里主要填写以下几项:
- 规则方向:选入方向。
- 授权策略:一般选“允许”。
- 协议类型:按服务选TCP、UDP或自定义协议。
- 端口范围:单个端口写成 3000/3000,连续端口写成 8000/8100。
- 授权对象:填IP或网段。填 0.0.0.0/0 表示全网可访问,除非是确实要公开的服务,否则不建议这样填。
保存后规则一般立即生效,不需要重启实例。
案例:Node.js接口服务开放3000端口
一个小团队在ECS上部署了Node.js接口,监听3000端口。服务器本机执行 curl localhost:3000 正常,同事在外网访问却一直超时。他们的排查顺序是这样的:
- 先执行 ss -tlnp,确认进程绑定的是0.0.0.0:3000,也就是所有网卡地址。
- 再看安全组入方向规则,发现只放行了22和80。
- 新增一条TCP规则,端口填3000/3000,授权对象设为办公网出口IP。
- 重新测试,外网访问恢复。
这个案例有两点值得记住。服务如果只绑定127.0.0.1,安全组开得再大也没用。另外,把授权对象限定到办公网IP,接口既能给需要的人用,也不会被全网扫到。
案例:数据库端口怎么开才稳妥
远程连接MySQL是另一个常见场景。有人为了省事,直接对0.0.0.0/0放开3306,几天后数据库日志里就出现了大量登录失败记录。比较稳妥的做法是:
- 只对固定的运维跳板机或办公IP开放3306。
- 数据库账号使用强密码,并限制允许登录的主机来源。
- 如果只有本机或同VPC内的服务要连,直接用内网地址,不必对公网开放。
判断标准其实很朴素:端口开放的范围,应该和实际访问需求大小一致。
规则加了还是打不开,按这几处查
1. 绑定的不是你改的那个安全组
一台实例可以绑定多个安全组,规则只在它所属的安全组里生效。先确认实例绑定了哪几个安全组,再去对应的那个里修改。
2. 系统防火墙还在拦
Ubuntu上的ufw、CentOS上的firewalld同样会拦截流量。以firewalld为例,可以执行 firewall-cmd –permanent –add-port=3000/tcp,再执行 firewall-cmd –reload 让配置生效。
3. 服务只监听127.0.0.1
很多框架默认绑定本地地址。需要在启动参数或配置文件里改成0.0.0.0,或者明确绑定服务器的内网IP。
4. 前面挂了负载均衡
如果服务位于SLB(负载均衡)后面,客户端访问的是SLB的地址和监听端口。这时ECS安全组要放行的是来自SLB的流量,客户端IP并不是直接来源,这一点很容易漏掉。
5. 端口已被占用
服务启动失败却没有明显报错时,可以用 lsof -i:端口号 看看这个端口是否已被其他进程占用。
安全建议
添加端口本身很简单,真正需要花心思的是控制暴露范围。几条基本习惯:
- 定期清理不再使用的安全组规则。旧规则往往是最容易被忽略的入口。
- SSH(22)和远程桌面(3389)优先限定源IP,不要对全网开放。
- 开通阿里云云安全中心,关注异常登录和端口扫描告警。
- 敏感服务尽量放在私有网络里,通过VPN或堡垒机访问。
小结
在阿里云添加端口,核心动作是在ECS安全组的入方向规则里,为对应协议和端口设置合适的授权对象。如果规则已经加了还是访问不了,依次检查服务监听地址、安全组绑定关系和系统防火墙,大部分问题都能定位。端口不必一次开全,按业务需要逐步放行就够了。