0Pricing
AWS Solutions Architect · 课时

网络 ACL 与安全组

比较无状态网络 ACL 与有状态安全组,并了解何时使用各者来构建分层网络防御。

网络 ACL 与安全组 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。

网络安全的两层防护

AWS 在 VPC 中提供两种不同的防火墙机制。Security Groups 作用于实例级别(严格来说是 ENI 级别),并且具有状态。Network Access Control Lists(NACLs) 作用于子网级别,并且无状态。任何进入或离开子网及其关联实例的流量都要经过这两者的检查。结合使用二者可以实现纵深防御:将 NACL 作为子网边界的第一道防线,将安全组作为每个实例的防火墙。SAA-C03 考试经常比较这两种机制。

Network ACL:子网级无状态防火墙

Network ACL(NACL) 是应用于所有跨越子网边界流量的编号规则列表。NACL 是无状态的,每个数据包都会被独立评估。如果您允许入站 TCP 80 端口,则必须明确允许出站返回流量(临时端口 1024-65535),以便响应离开子网。规则按数字顺序进行评估(数字越小越先);第一条匹配的规则生效,后续规则不再检查。每个 VPC 都有一个默认 NACL,允许所有入站和出站流量。

# Deny all traffic from a specific IP in the NACL
aws ec2 create-network-acl-entry \
  --network-acl-id acl-12345678 \
  --ingress \
  --rule-number 90 \
  --protocol tcp \
  --cidr-block 203.0.113.10/32 \
  --rule-action deny \
  --port-range From=0,To=65535

NACL 规则编号与顺序

NACL 规则按规则编号升序(1 到 32766)进行评估,一旦某条规则匹配,评估就会停止;对于相同流量,编号较小的 Allow 规则可能被编号更小的 Deny 规则覆盖。AWS 建议以 10 或 100 的增量为规则编号,以便日后插入规则。每个 NACL 都以默认规则(* DENY)结尾,该规则会拒绝所有未被任何显式规则匹配的流量。此兜底规则无法编辑或删除。

# Example NACL ruleset:
# Rule 100: Allow  HTTPS (443) from 0.0.0.0/0
# Rule 200: Allow  HTTP (80)  from 0.0.0.0/0
# Rule 300: Deny   All         from specific-bad-IP
# Rule *:   Deny   All         from 0.0.0.0/0 (default, implicit)

无状态 NACL:临时端口

由于 NACL 是无状态的,您必须考虑每个连接的两个方向。当互联网客户端通过 443 端口连接到您的 EC2 实例时,实例会将响应发回客户端的临时端口(随机的高位端口,Linux 通常为 1024-65535,Windows 通常为 49152-65535)。您的 NACL 出站规则必须明确允许此端口范围。常见的 NACL 配置错误是创建允许入站 443 端口的 Allow 规则,却忘记允许出站临时端口,导致连接能够建立,但响应被静默丢弃。

# NACL outbound rule allowing return traffic on ephemeral ports
aws ec2 create-network-acl-entry \
  --network-acl-id acl-12345678 \
  --egress \
  --rule-number 100 \
  --protocol tcp \
  --cidr-block 0.0.0.0/0 \
  --rule-action allow \
  --port-range From=1024,To=65535

Security Groups 回顾

提醒一下:security groups 附加到实例(或 ENI)上,只允许显式的 Allow 规则(没有 Deny),具有状态(允许入站流量的响应会自动允许出站,无需额外规则),并使用 OR 逻辑共同评估所有已附加的规则。您可以将其他安全组 ID 作为源或目标进行引用,这比使用 IP 范围更易维护。安全组是实例级访问控制的主要机制,而 NACL 则提供额外的子网级防护层。

关键差异:NACL 与 Security Groups

考试中的重要对比:

  • 级别:NACL = 子网;SG = 实例(ENI)
  • 状态:NACL = 无状态;SG = 有状态
  • 规则:NACL = Allow AND Deny;SG = 仅 Allow(隐式拒绝)
  • 评估:NACL = 按顺序评估(第一条匹配的规则生效);SG = 评估所有规则(任意 Allow 生效)
  • 范围:NACL 适用于子网中的所有实例;SG 仅适用于关联的实例
  • 入站/出站:NACL 需要为两个方向分别设置显式规则;SG 具有状态(响应流量只需入站规则)

何时使用 NACL

在以下情况下使用 NACL:阻止特定 IP(安全组无法拒绝,只能允许;NACL 可以添加显式 Deny 规则,阻止已知的恶意 IP 或爬虫)。子网范围的规则(无需修改单个安全组,即可将同一规则应用于子网中的所有实例)。额外的防护层(如果安全组配置错误而意外开放访问,子网边界的 NACL Deny 规则仍可阻止流量)。在实践中,大多数团队主要通过安全组管理访问,只将 NACL 用于明确阻止 IP。

默认 NACL 与自定义 NACL

默认 NACL(随每个 VPC 创建)允许所有入站和出站流量,其中包含规则 100 Allow All Inbound 和 100 Allow All Outbound。未明确关联自定义 NACL 的子网会使用默认 NACL。如果创建自定义 NACL,它起初只有默认的 Deny-All 规则(规则 *),在添加显式 Allow 规则之前会阻止所有流量。这意味着将新的自定义 NACL 关联到子网后,所有流量会立即被阻止;请务必先添加 Allow 规则,再将其关联到生产子网。

# Create a custom NACL (starts with DENY ALL)
aws ec2 create-network-acl --vpc-id vpc-12345678

# Associate it with a subnet
aws ec2 replace-network-acl-association \
  --association-id aclassoc-12345678 \
  --network-acl-id acl-custom-id

评估顺序:NACL 与 Security Groups

对于进入 EC2 实例的入站流量:流量首先经过子网边界的 NACL(按规则顺序评估)。如果 NACL 允许流量,流量随后会到达实例上的安全组,而安全组也必须允许该流量。两者都必须允许,流量才能到达实例。对于出站流量:先评估安全组(具有状态,如果流量是对已允许入站流量的响应,则允许通过),然后评估 NACL(无状态,必须具有显式的出站 Allow)。理解这一顺序后,您就能明白为什么即使使用有状态的安全组,仍然需要为无状态 NACL 配置返回流量规则。

使用 NACL 进行故障排查

NACL 的无状态特性使其成为网络问题中难以排查的常见来源。常见症状包括:连接已建立但数据停止流动(缺少出站临时端口规则);流量只能单向传输(忘记配置入站或出站规则);特定 IP 无法连接(编号更小的 Deny 规则先于 Allow 规则匹配)。排查方法:使用 VPC Flow Logs 查看数据包在 NACL 级别是 ACCEPT 还是 REJECT。流日志会显示被拒绝数据包及其源和目标,从而帮助您定位缺失的规则。

# Athena query to find NACL-rejected flows
SELECT sourceaddress, destinationaddress, destinationport, action
FROM vpc_flow_logs
WHERE action = 'REJECT'
  AND interfaceid LIKE 'eni-%'
LIMIT 100;

分层安全架构

多层 VPC 安全的推荐模式是:在公有子网中使用 NACLs,仅允许来自互联网的 80、443 端口以及所需的临时端口,拒绝其他所有流量。ALB 的公有子网安全组允许来自 0.0.0.0/0 的 80/443 流量。私有应用安全组仅允许来自 ALB 安全组 ID 的流量。私有数据安全组仅允许来自应用安全组 ID 的流量。这种纵深防御可确保即使某一层配置错误,另一层仍能提供保护——这项原则称为每一层都采用最小访问权限。

快速检查

测试您对本课 AWS Solutions Architect(SAA-C03)相关概念的理解。

课程回顾

本课您学习了:NACLs 是无状态的子网级防火墙,支持 Allow 和 Deny 规则,并按照编号顺序进行评估;安全组是有状态的实例级防火墙,仅支持 Allow 规则,所有规则会一并进行评估;以及使用 NACLs 进行明确的 IP 阻止和子网范围规则控制,使用安全组进行细粒度的实例访问控制。至此,VPC 基础模块已经完成——接下来我们将学习 AWS 上的 RDS 和关系数据库。

常见问题解答

「网络 ACL 与安全组」课时是免费的吗?

是的 — 「网络 ACL 与安全组」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。

「网络 ACL 与安全组」这节课中我会学到什么?

比较无状态网络 ACL 与有状态安全组,并了解何时使用各者来构建分层网络防御。 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AWS Solutions Architect 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「网络 ACL 与安全组」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AWS Solutions Architect 课中编写并运行代码吗?

能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. VPC 架构与 CIDR 块
  2. 互联网网关与路由表
  3. NAT 网关与私有子网
  4. 网络 ACL 与安全组
← 返回 AWS Solutions Architect