很多新手打开 EC2 控制台,看到“安全组”总会发懵:这到底是什么?为什么服务器连不上?为什么配了规则还是不行?
这篇文章用最直白的话讲清楚:安全组是什么、入站出站怎么分、规则怎么写,以及新手常踩的坑。
1. 引言:先建立直觉印象
把安全组想象成云服务器的门卫,或者叫虚拟防火墙。
它只干两件事:
决定谁能进你的服务器(入站)
决定你的服务器能访问谁(出站)
搞懂这两个方向,后面就简单了。
2. 什么是 AWS 安全组?
安全组是 AWS 里的虚拟防火墙,挂在实例或弹性网络接口上,控制进出流量。
除了 EC2,RDS、负载均衡器、弹性网络接口等都可以关联安全组。
三个核心特点:
只能设“允许”规则,不能设“拒绝”规则。
新建安全组默认没有入站规则,默认拒绝所有入站流量。
默认开放所有出站流量,规则可删。
新手重点:安全组默认全关,只开你允许的。
3. 最容易懵的点:入站规则 vs 出站规则
入站规则:别人能不能访问你的实例。比如 SSH 登录 EC2,需要入站允许 22 端口。
出站规则:你的实例能不能访问外部。比如执行yum update,需要出站允许访问互联网。
外部用户 / 其他服务器
│
▼
[入站规则] ──> EC2 实例
│
▼
[出站规则] ──> 外部服务/互联网
误区:以为配了入站出站就自动放行。实际上两者是独立的两套规则,互不影响。
4. 安全组规则由哪些部分组成?
一条规则包含以下信息:
组成部分说明示例
协议TCP、UDP、ICMP 等TCP
端口范围允许访问的端口22、80、443、0-65535
源/目标入站叫“源”,出站叫“目标”0.0.0.0/0
描述可选,方便识别“允许 SSH 访问”
“源/目标”常见写法:
IPv4 CIDR:如203.0.113.0/24
IPv6 CIDR:如2001:db8:1234:1a00::/64
前缀列表 ID:如pl-1234abc1234abc123
安全组 ID:如sg-1234567890abcdef0
新手重点:入站“源”表示谁可以进来;出站“目标”表示你可以去找谁。
5. 新手进阶:引用安全组是什么意思?
规则里除了写 IP,还可以写另一个安全组 ID。
比如入站规则的源填sg-1234567890abcdef0,表示所有关联了这个安全组的实例都可以访问你的实例。
好处:
不用关心 IP 会变。
新实例关联该安全组后自动获得访问权限。
经典三层架构:
负载均衡器安全组(允许互联网访问 80/443)
│
▼
Web 服务器安全组(只允许来自负载均衡器安全组的流量)
│
▼
数据库服务器安全组(只允许来自 Web 服务器安全组的数据库端口流量)
注意:如果经过 NAT 或网关转发,引用安全组可能不生效,因为源 IP 变成了中间设备。这种情况建议用实例私有 IP 或子网 CIDR。
6. 安全组的默认行为与多个安全组
新建安全组时:
入站规则:空,默认全部拒绝。
出站规则:默认允许所有,可删。
如果实例关联多个安全组,规则会聚合(并集)。比如 A 允许 22,B 允许 80,实例同时绑定 A、B,则 22 和 80 都开放。不是取交集。
7. 新手最容易踩的坑
坑 1:只配入站,不配出站。服务器能收请求,但主动访问外部 API 超时。
坑 2:以为能写“拒绝规则”。安全组没有拒绝,只能靠不加允许来拒绝。要显式拒绝请用网络 ACL。
坑 3:来源写0.0.0.0/0。这等于对全世界开放。尤其是 22/3389 管理端口,必须限制为办公 IP。
坑 4:开错端口。SSH=22,RDP=3389,MySQL=3306,SQL Server=1433,HTTP=80,HTTPS=443。
坑 5:分不清“引用安全组”和“写 IP”。安全组适合组内互通,IP 适合固定来源。
坑 6:安全组没绑定资源。不绑定实例或网络接口,规则不生效。
8. 常见安全组配置示例
例 1:Web 服务器
入站:HTTP 80、HTTPS 443,来源0.0.0.0/0
出站:默认全部允许
例 2:Linux EC2 远程管理
入站:SSH 22,来源你的办公 IP(如203.0.113.0/24)
出站:默认全部允许
例 3:Windows EC2 远程桌面
入站:RDP 3389,来源你的办公 IP
出站:默认全部允许
例 4:数据库服务器
入站:MySQL 3306、PostgreSQL 5432、SQL Server 1433,来源均为 Web 服务器安全组 ID
出站:默认全部允许
注意:数据库来源千万别写0.0.0.0/0。
例 5:负载均衡器到 Web 服务器
Web 服务器安全组入站:TCP 80、443,来源为负载均衡器安全组 ID
这样用户不能直接访问后端。
9. 安全组和网络 ACL 有什么区别?
对比项安全组网络 ACL
作用层级实例/弹性网络接口级别子网级别
默认行为默认拒绝入站,默认允许出站需自行配置
规则类型只支持允许支持允许 + 拒绝
是否有状态有状态(返回流量自动允许)无状态(返回流量需单独允许)
适用场景精细访问控制子网级广泛控制
“有状态”指允许入站后,返回流量自动放行;网络 ACL 则要单独配。
最佳实践:优先用安全组做精细控制;只有需要子网级防护时再用网络 ACL。
10. 总结:一句话记住安全组
安全组 = 实例周围的虚拟门卫
入站管“谁能进来”
出站管“你能出去找谁”
默认:外面的人进不来,你可以主动出去。
配置三步:
看方向(入站/出站)
看协议和端口
看来源/目标
想清楚这三点,安全组就不会再让你懵了。
FAQ 部分
Q1:AWS 安全组可以设置拒绝规则吗?
不能。安全组只支持允许规则,默认拒绝入站。要显式拒绝,请用网络 ACL。
Q2:新建安全组后,为什么无法 ping 通实例?
因为没有入站规则。需要在入站里添加 ICMP 协议(或对应端口规则)。
Q3:两个实例在同一个安全组,默认能互通吗?
不一定。默认若没有允许规则,实例间不能互通。需要在规则里允许该安全组 ID 作为源。
Q4:修改安全组规则后需要重启实例吗?
不需要。规则更改后通常立即生效。
Q5:出站规则可以删除吗?
可以。删除后实例无法主动访问外部,所有出站流量都会被拒绝。