防火墙和安全组到底差在哪?用端口放行场景讲清两者分工
防火墙和安全组经常被混为一谈,但两者作用的位置不同:防火墙跑在服务器操作系统里,安全组由云平台在网络外侧管理。
只配好其中一个,另一个没放行,端口照样连不上。
两者分别管哪一段流量
用一次 SSH 连接来理解最直观。
你在本地执行 ssh root@服务器IP,数据包先到达云平台,被安全组规则检查一次;
通过后才进入服务器网卡,再被系统防火墙(firewalld、ufw 或 iptables)检查一次。
两道关卡都放行,连接才能建立。
- 安全组:云厂商在实例外层提供的虚拟防火墙,规则绑定在实例或网卡上,在操作系统之外生效。即使服务器系统卡死,安全组规则依然在拦截流量。
- 防火墙:运行在服务器系统内的软件,如 CentOS 的 firewalld、Ubuntu 的 ufw,或底层的 iptables/nftables。它能看到具体进程和本机日志,规则修改立即生效。
判断依据很简单:如果云控制台里能看到“安全组”菜单,说明流量会先经过平台侧;
服务器内部再用 systemctl status firewalld 或 ufw status 检查系统防火墙状态。
放行一个端口时两边各做什么
假设要对外提供 8080 端口的 Web 服务,完整操作分两层。
云平台侧(以常见控制台路径为例):
- 进入实例详情,找到“安全组”或“防火墙”页签。
- 添加入方向规则:协议
TCP,端口范围8080/8080,来源按需填写,测试阶段可先填0.0.0.0/0,正式环境建议限制为固定 IP 段。 - 保存后确认规则已绑定到目标实例。
服务器系统侧(以 firewalld 为例):
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
firewall-cmd --list-ports
如果系统使用 ufw,对应命令是 ufw allow 8080/tcp,再用 ufw status 查看结果。
只改一边的典型现象:安全组放行了,系统防火墙没放行,本机 curl 127.0.0.1:8080 能通,外网访问超时;
反过来系统防火墙放行了,安全组没放行,本机和服务内网都正常,外网依然连不上。
规则顺序和来源判断上的差别
安全组规则通常按优先级或拒绝优先策略匹配,具体行为取决于云厂商实现,配置时以控制台说明为准。
系统防火墙则按规则链顺序逐条匹配,iptables -L -n --line-numbers 可以看到实际顺序。
来源 IP 的判断方式也不同:安全组看到的是经过云网络转换后的地址,部分场景下服务器系统日志里记录的来源 IP 可能不是真实客户端地址;
系统防火墙直接看到到达网卡的地址。
排查“为什么来源 IP 对不上”时,先确认流量经过了几层网络转换。
怎么验证配置真正生效
改完两边规则后,从外部机器执行:
telnet 服务器IP 8080
# 或
nc -zv 服务器IP 8080
出现 connected 或 succeeded 说明链路已通。
如果不通,按顺序排查:先在服务器本机 curl 127.0.0.1:8080 确认服务本身在监听,再用 ss -lntp | grep 8080 确认监听地址不是仅 127.0.0.1,最后回到控制台检查安全组规则是否绑定到了正确实例。
需要留意的边界:安全组是云平台能力,物理服务器或自建机房没有这个概念;
系统防火墙规则在重启后是否保留,取决于是否加了 --permanent 或是否执行过 ufw enable 持久化。
改动防火墙前建议先保留一条可用的 SSH 放行规则,避免把自己锁在门外。