很多人第一次在阿里云买服务器,程序装好、服务也跑起来了,浏览器一访问却超时,折腾半天才发现是端口没放行。搭网站、跑接口、连数据库都可能碰到这个问题。端口不通,服务器里的服务再完整,外面也用不了。

这篇文章从实际场景出发,说明端口是怎么回事,安全组里具体怎么加规则,以及几个容易踩的坑。照着做一遍,基本就能自己解决。
一、端口和安全组是怎么回事
Nginx、Tomcat、MySQL 这些程序启动后都会监听某个端口。可以把端口理解成服务器上的门牌号,外部请求要带着对应的号码,才能找到你的服务。
阿里云出于安全考虑,默认只对 SSH 的 22 端口放行,其他端口基本都是关闭的。程序在服务器里跑得再正常,外部请求也会被挡在门外。这种设计能减少被扫描和攻击的机会,但对新手来说,最容易误以为是程序有问题。
所以需要对外提供服务的端口,要在控制台的安全组里主动添加规则。
二、一个博客部署的例子
小王在阿里云买了一台轻量应用服务器,装好 Nginx,又把自己写的 Node.js 博客跑在 3000 端口上。他在服务器本机用 curl 测试,返回正常,可在浏览器里输入公网 IP 加端口号,页面却一直转圈。
他查了程序日志,没有报错。后来同事提醒他检查安全组,他进控制台一看,入方向规则里只有 22 和 80,3000 根本没放行。他添加了一条规则,端口范围填 3000/3000,授权对象填 0.0.0.0/0,保存后页面立刻就打开了。
这个例子很典型。程序没问题,问题出在网络层:服务器内部能通,外部却被安全组拦住了。
三、安全组里具体怎么加规则
1. 进入安全组配置页
登录阿里云后打开“云服务器 ECS”控制台,在实例列表里点开你的服务器,进入详情页,切到“安全组”或“防火墙”标签,再点对应安全组的链接。如果用的是轻量应用服务器,入口在“轻量应用服务器”里,流程差不多,只是页面叫法略有不同。
2. 手动添加入方向规则
在入方向选项卡里点“手动添加”,表单主要填下面几项:
- 规则方向:选入方向。
- 授权策略:选允许。
- 优先级:保持默认的 1 就行,除非你已经有多条规则需要排序。
- 协议类型:看服务是什么,网站和接口一般选 TCP。
- 端口范围:单个端口要写成“起始/结束”的形式,比如 3000/3000。只写 3000 有时会报错。
- 授权对象:0.0.0.0/0 表示所有 IP 都能访问。如果只给自己或某个团队用,就填具体的 IP 或 IP 段。
保存后规则一般立即生效,不需要重启服务器。
3. 检查系统防火墙
很多人只配了安全组,却忘了服务器系统自带的防火墙。Ubuntu 上一般看 ufw,CentOS 上要看 firewalld。以 ufw 为例,在服务器里执行 sudo ufw allow 3000/tcp 放行端口,再执行 sudo ufw status,确认列表里出现了这个端口。两层都放行,外部访问才算真正通了。
4. 从外部验证端口
在本地电脑上用 telnet 测试:telnet 你的公网IP 3000。能连上,说明端口已经通了;一直超时,就回头检查安全组和系统防火墙。连通之后再用浏览器访问,才能确认程序本身也正常。
四、容易踩的几个坑
- 程序只监听了 127.0.0.1:这种情况下服务只接受本机请求,安全组配得再对也没用。把程序的监听地址改成 0.0.0.0 再测试。
- 授权对象写窄了:填具体 IP 段时,如果段写错了,外部用户会被拦住,排查时还很容易怀疑到程序上。调试阶段可以先用 0.0.0.0/0 确认能通,再收窄范围。
- 端口范围格式不对:单端口写成 3000/3000,别只写 3000。
- 数据库和缓存直接暴露在公网:3306(MySQL)、6379(Redis)一旦对所有 IP 开放,很容易被扫描和爆破。这类端口最好只对固定 IP 开放,或者通过内网、VPN 访问。
五、开放端口时的安全习惯
每开一个端口,服务器就多一个对外的入口,所以开之前先想清楚它为什么要对外。网站的 80 和 443 属于正常需求;管理后台、数据库这类服务,能不放在公网就不放。
另外,隔一段时间翻一翻安全组,删掉已经停用的服务留下的旧规则。规则越少,出问题时越好查。
六、小结
排查访问不通的问题,按两步走:先看安全组有没有对应的入方向规则,再看系统防火墙有没有放行。两层都确认后,用 telnet 测一下,大多数问题都能在这里定位。