给ECS实例开通之后,很多人最先碰到的就是安全组:外部能不能连上服务器,哪些端口要开,哪些流量要挡在外面,基本都由它决定。可以把它想成云服务器前面的一道虚拟防火墙。它在网络层过滤进出的数据包,不依赖操作系统内部的程序运行。

安全组和系统防火墙有什么不同
阿里云安全组是有状态的包过滤机制,绑定在ECS实例的网卡上。每条规则由方向、协议、端口范围和授权对象组成,方向分为入方向和出方向。入方向管外部访问实例的流量,出方向管实例主动访问外部的流量。
不少人会把安全组和Linux的iptables、Windows防火墙混在一起。其实两者可以同时用,相当于双层防护。安全组在云平台侧生效,就算系统内的防火墙被误关,云上的规则仍然起作用。另外,安全组可以按实例或网卡灵活绑定,几台同类服务器共用一套规则模板,改起来比逐台调整系统配置省事。
规则怎么设计
最常用的原则是最小权限:只开放业务必需的端口,授权对象也尽量收窄。比如一台跑Nginx的Web服务器,一般只需要对公网放行80和443。SSH的22端口则应该限制在运维人员的固定IP上,如果填0.0.0.0/0,等于把登录入口敞开给所有人。
阿里云安全组默认拒绝所有入方向流量,所以只需要显式添加允许规则。规则之间按优先级匹配,同一优先级下允许和拒绝规则的处理顺序要特别留意。另外,单个安全组的规则条数有上限,默认是200条。规则一多,就容易变成几十上百条记录的大杂烩,最后没人说得清哪条还在用。更稳妥的做法是按角色拆分,Web层、应用层、数据库层各用一个安全组。
一次误配置引发的排查
某电商团队在大促前,把测试环境的MySQL迁到了新的ECS上。为了省事,他们在安全组里直接放行了3306端口,授权对象填的是0.0.0.0/0。上线几天后,监控发现数据库连接数异常,日志里出现大量陌生IP的登录失败记录。排查结果是扫描器在批量探测公网开放的3306端口,弱口令账号已经被尝试了上万次。
处理过程很直接:先把3306的授权对象改成应用服务器所在的内网安全组,再重置数据库密码,并开启访问审计。整个过程不到半小时。但如果没有及时发现,后果很可能是数据泄露。这类问题很少卡在技术上,多半是图省事留下的风险一点点攒起来。
常见误区
- 把0.0.0.0/0当成默认值。临时调试时放开的规则很容易忘记收回。建议给临时规则写上备注和到期时间,用完立刻删。
- 只盯着入方向。出方向默认全部放行。服务器一旦被入侵,外发数据和挖矿程序的回连都不会被拦。敏感服务器可以按需收紧出方向规则。
- 指望安全组单独扛住所有风险。安全组只是网络层的一道防线,还要配合主机加固、及时打补丁和访问日志审计。
- 规则没人维护。每条规则最好记下用途和负责人,定期清理闲置规则。
推荐的操作流程
- 按业务给服务器分组,每类服务器建一个安全组,并统一命名,比如web-prod、db-prod,名字一看就知道用途。
- 先梳理业务依赖哪些端口、从哪里访问,再只添加必要的入方向规则。
- SSH、RDP这类管理端口,授权对象限定为固定办公IP或堡垒机地址。
- 服务之间的通信优先引用安全组作为授权对象,而不是直接写IP段。扩容时新机器加入同一安全组即可,不用逐条改规则。
- 定期用云安全中心或配置审计检查高风险规则,重点看全端口开放和数据库端口暴露公网的情况。
- 每次改完规则都做一次连通性测试,确认业务正常,并保留变更记录,出问题时能快速回滚。
阿里云安全组的功能本身并不复杂,难的是规则能长期保持干净。很多安全事件的起因,往往是某条早已被遗忘的放行规则。分组清楚、只开必要端口、定期复查,这三件事做到位,风险基本能控制在可管理的范围内。