在云主机上,安全组和系统防火墙不是二选一的关系,而是必须协同工作的两道防线安全组管“谁可以进”,防火墙管“进来后能做什么”。
很多人在云主机上配置完安全组发现端口还是不通,或者开了防火墙又把自己锁在外面,根本原因就是没搞清这两层机制的区别,下面直接拆开讲。
云主机安全组和系统防火墙有什么区别?先理清职责边界
安全组是云平台提供的“虚拟防火墙”,工作在虚拟机外面,由云厂商的底层网络设备实现,你控制不了它的内核代码,只能通过控制台或API添加规则,系统防火墙(比如Linux的iptables、firewalld,Windows的防火墙)跑在云主机内部,占用CPU和内存,规则由操作系统处理。
安全组和iptables/firewalld的工作层级不同
- 安全组作用于虚拟网卡,过滤流量发生在流量到达云主机之前。
- 系统防火墙作用于内核协议栈,流量已经进入操作系统后才被处理。
这意味着:安全组拒绝的流量,根本不消耗云主机资源;而系统防火墙放行的流量,则会先经过安全组,如果安全组没放行,系统防火墙规则写得再漂亮也没用。
默认策略的差异决定了配置顺序
- 多数云厂商的安全组默认拒绝所有入站流量,需要显式添加放行规则。
- 系统防火墙(如firewalld)默认拒绝未允许的服务,但ssh端口通常默认放行。
- iptables如果清空规则,默认策略通常是ACCEPT,这时候裸奔风险很大。
行业共识认为,安全组应该做“白名单”控制,只放行必要端口;系统防火墙用于填补安全组无法覆盖的细节,比如限制源IP、限速、防暴力破解。
安全组与系统防火墙协同配置的实操步骤
搞懂区别之后,重点来了:怎么配置才能不互相打架?这里以国内主流云厂商的Linux云主机为例,从零走一遍。
第一步:先在安全组层面放行必要端口
登录云厂商控制台,找到“安全组”或“网络与安全”入口,不同叫法不同,但逻辑一样,比如简米云叫“安全组”,酷番云叫“安全组”,华为云也叫“安全组”,只是入口位置略有差别。
- 创建安全组时,入站规则通常需要手动添加。
- 至少放行22(SSH)、80(HTTP)、443(HTTPS)等常用端口。
- 如果数据库需要远程访问,再放行3306或5432,但建议限制源IP,不要用0.0.0.0/0。
这里有个关键点:安全组规则是“先匹配先生效”还是有优先级? 多数云厂商的规则列表就是优先级顺序,上面规则先匹配,所以放行规则要放在拒绝规则之前。
第二步:在系统防火墙中配置与安全组一致的放行策略
以CentOS 7/8的firewalld为例:
# 查看当前防火墙状态 systemctl status firewalld # 永久放行服务 firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https # 永久放行端口(TCP)+ 限制源IP firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="22" protocol="tcp" accept' # 重载配置 firewall-cmd --reload
如果是Ubuntu的ufw,命令更简单:
sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow from 192.168.1.100 to any port 22 proto tcp
系统防火墙的规则建议比安全组更严格,比如安全组放行了80端口给所有人,系统防火墙里就可以同时加一个限制,只允许特定IP访问管理接口。
第三步:验证协同效果,避免“端口开了但连不上”
安全组和防火墙都配置完后,先别急着测试,按照顺序排查:
# 看端口是否在监听 ss -tlnp | grep :80 # 查看防火墙当前规则 firewall-cmd --list-all # 查看安全组是否生效(在另一台机器上telnet或nc测试) telnet 你的云主机公网IP 80
如果telnet不通,先检查安全组入站规则是否包含对应端口,再看系统防火墙是否放行,多数情况下,问题出在安全组只改了出方向规则,忘了入方向。
云服务器安全组配置常见疑问:放行端口为什么还是不生效?
这个问题几乎每周都有人在技术社区里问,其实答案早就写在云厂商的文档里,但很多人根本没注意到两个隐藏的坑。
坑一:安全组绑定到了错误的网卡或实例
安全组必须绑定到对应的云主机实例上,有时候你创建了规则,但忘了把安全组关联到实例,或者关联错了,检查时不要只看规则列表,要进到实例详情页里确认绑定的安全组ID,如果云主机有多个网卡,安全组是绑定在主网卡而不是辅助网卡上的。
坑二:系统防火墙的默认区域搞错了
firewalld有多个zone(区域),默认区域是public,如果你把端口加到了internal区域,但接口还在public区域,规则自然不生效,用firewall-cmd --get-default-zone查看当前默认区域,需要时把接口改到对应区域:
# 把eth0接口从public改为internal firewall-cmd --permanent --zone=internal --change-interface=eth0 firewall-cmd --reload
坑三:安全组规则里的端口范围写错了
安全组配置里,端口范围是“起始端口-结束端口”的格式,如果只想放行单个端口,两端填同一个数字就行,不少人在控制台里把“端口范围”填成80/80,结果就是不生效。
出现冲突时,以谁为准?
流量必须同时通过安全组和防火墙才能到达应用。 任一层拒绝,连接就建立不了,所以不存在“安全组放行了防火墙就管不着”的情况,如果排查下来两层规则都没问题,再检查云主机内部的selinux或apparmor,它们也会拦截端口访问。
不同场景下安全组与系统防火墙的协同策略建议
实际操作中,配置策略不是死的,不同用途的云主机,侧重点完全不一样。
个人博客或小型网站(按年付费的云主机为例)
假设你买了一台国内厂商的入门级云主机,一年几百块,部署WordPress,安全组放行22、80、443即可,系统防火墙额外做两件事:
- 限制22端口只允许你家里的固定IP访问。
- 对80/443端口的连接进行速率限制,防止被刷。
# 限制80端口每秒不超过20个新连接 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="80" protocol="tcp" accept limit value="20/s"'
香港云主机做跨境业务
香港云主机的优势是不用备案,但网络环境更复杂,安全组配置时,建议只放行业务端口,并且把常用管理端口全部改为高位端口,系统防火墙则开启ssh防暴力破解工具。
- 安全组入方向放行80、443、以及自定义的SSH端口(比如22026)。
- 系统防火墙用
fail2ban监控登录日志,超过3次失败自动封禁IP。
数据库专用云主机
数据库一般不允许直接暴露公网,安全组里只放行业务云主机的私有IP访问3306或5432,公网入方向全部拒绝,系统防火墙再叠加一层,通过子网或IP段限制,这里可以做一个规则对比表:
| 层次 | 安全组 | 系统防火墙 | 效果 |
|---|---|---|---|
| 公网访问 | 拒绝所有入站 | 不配置公网规则 | 公网无法直连 |
| 内网业务访问 | 放行指定VPC网段 | 放行指定业务IP | 私有网络内安全互通 |
| 管理系统访问 | 放行公司出口IP | 限制账号登录白名单 | 双重校验 |
这样即使安全组被误改放行了公网防火墙,系统防火墙也能拦住。
安全组和防火墙规则都要改时怎么办?
先加规则,再删旧规则。 无论是安全组还是系统防火墙,删除规则导致断连的情况太多了,比如你要把SSH端口从22改成22026,先在系统防火墙放行22026,再在安全组放行22026,测试连接成功后,再依次删掉旧的22端口规则,记住这个顺序,能少踩不少坑。
Q&A:云主机安全组配置相关疑问解答
安全组和系统防火墙规则冲突时会怎么样?
冲突的结果就是拒绝优先,比如安全组放行了80端口,但系统防火墙拒绝了80,连接无法建立,反过来一样,所以协同配置的核心就是保证两层规则一致,或者系统防火墙更严格。
更换安全组会中断现有连接吗?
如果新安全组放行了当前连接所用的源IP和端口,现有连接一般不会中断,但部分云厂商的默认安全组可能没有放行那些端口,比如某些厂商的默认安全组只放行22端口,在更换前,先确认新安全组放行了你的管理端口,否则可能连不上。
能不能只靠安全组不装系统防火墙?
可以,如果云主机没有暴露额外端口,且安全组规则足够细,理论上可以关闭系统防火墙,但行业共识认为:安全组是租户隔离机制,系统防火墙是主机加固机制,两者互补,对于公网暴露的端口,建议保留系统防火墙以应对安全组覆盖不到的防护需求,比如应用层恶意请求检测。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/659647.html





