安全组是无状态的轻量级包过滤机制,仅基于五元组静态匹配,不维护连接状态;而状态检测防火墙通过conntrack表跟踪连接上下文,能区分新请求与响应包,实现隐式放行。

服务器安全组配置,本质上是云厂商在虚拟网络边界部署的一层包过滤机制,它工作在网络层(L3)和传输层(L4),基于五元组做静态匹配;而传统防火墙的状态检测,则是在此基础上叠加连接状态跟踪能力,能识别“这是不是某个合法会话的回包”。两者常被混用,但底层逻辑、生效位置和防护深度有明显区别。
安全组是轻量级包过滤,不维护连接状态
云平台的安全组(如阿里云、AWS Security Group)本质是分布式ACL(访问控制列表),运行在宿主机内核或虚拟交换机层面。它只看单个数据包的:源IP、目的IP、协议类型(TCP/UDP/ICMP)、源端口、目的端口——也就是标准五元组。规则一旦匹配,就执行允许或拒绝,不记录SYN是否发出、ACK是否收到、连接是否已关闭。
这意味着:
- 它无法区分“新连接请求”和“已有连接的响应包”,所以必须显式放行双向流量(比如想让SSH连入,得同时允许入向22端口+出向任意端口;否则响应包会被拦)
- 没有超时清理机制,不会自动删除“僵死连接”的状态条目
- 不支持FTP、SIP这类需要ALG(应用层网关)动态开临时端口的协议
- 规则顺序不重要——安全组规则是“全匹配生效”,非传统ACL的“自上而下逐条匹配”
状态检测防火墙靠conntrack表识别合法会话
像iptables启用-m state --state ESTABLISHED,RELATED,或硬件防火墙开启状态检测模式,核心是维护一张连接跟踪表(conntrack table)。这张表记录每个活跃连接的完整上下文:协议、源/目的IP与端口、TCP状态码(SYN_SENT、ESTABLISHED、FIN_WAIT等)、序列号窗口、超时时间等。
当一个新包到达时,防火墙先查这张表:
- 如果是已有连接的后续包(如HTTP响应、TCP ACK),直接放行,无需再比对ACL规则
- 如果是新连接请求(SYN包),才走常规规则匹配流程;匹配通过后,才会在conntrack表中新建一条记录
- 连接关闭或超时(如TCP默认2小时),对应表项自动清除,后续包不再被识别为“合法回包”
这种机制天然支持“仅放行入向新连接,自动允许出向响应”,也有效抵御SYN Flood、IP碎片重放等无状态攻击。
为什么安全组不做成状态检测?
不是不能,而是设计取舍:
- 性能优先:云环境每台宿主机要承载数百虚拟机,安全组需做到微秒级转发延迟;conntrack查表+状态更新带来显著CPU开销
- 确定性更强:包过滤规则行为完全可预测,便于自动化编排与策略审计;状态检测引入隐式放行逻辑,策略调试更复杂
- 职责分离:云厂商把基础网络隔离交给安全组,把深度防护(如WAF、入侵防御)交给独立产品,避免功能耦合
所以你在ECS实例上看到“安全组已放通80端口”,不代表HTTP流量一定可达——还得看实例本地是否启用了iptables或firewalld,且其状态检测规则没二次拦截。
实际配置建议:分层设防,各司其职
不要指望安全组干完所有事,也不必在云服务器上硬套传统防火墙那一套:
- 安全组聚焦“谁可以连我”:只放开最小必要端口(如22、443),源IP尽量精确到办公网段或跳板机IP
- 操作系统防火墙(如firewalld)启用状态检测:用--state ESTABLISHED,RELATED自动放行响应,再配合fail2ban封禁暴力破解IP
- Web服务前加WAF或NGFW:识别SQL注入、XSS等应用层攻击,这部分安全组完全看不到
- 日志必须打开:安全组要记录被拒绝的尝试(尤其SSH爆破),本地防火墙要记录conntrack丢包原因,便于溯源

















