我正在做关于 AWS 的课程。我想要做的是设置一个带有两台 Linux 服务器的 VPC。我已经设置了具有两个子网的 VPC。我已经在每个服务器中放置了一台服务器。这个想法是一个子网是公共的,另一个是私有的。
我创建了两个网络 ACL,并与每个子网关联了一个。
我可以从我的机器通过 SSH 连接到公共子网中的服务器。当我尝试从该服务器通过 SSH 连接到我的私有子网中的服务器时,我遇到了连接超时。
我不确定我需要在两个网络 ACL 中设置什么规则才能使 SSH 正常工作。任何人都可以帮忙吗?鉴于我正在学习,我会很感激解释为什么规则应该是,而不仅仅是规则应该是什么。
我有一个名为 MyVPC 且 CIDR 10.0.0.0/16 的 VPC
我的第一个子网称为 MyVPCSub1 CIDR
10.0.1.0/24 我的第二个子网称为 MyVPCSub2 CIDR 10.0.2.0/24
我有一个名为 MyInternetRoute 的路由表,与 MyVPCSub1 关联的路由是:
|Dest |Targ |
|10.0.0.0/16 |local |
|0.0.0.0/0 |igw |
我有一个名为 MyPrivate 的路由表,与 MyVPCSub2 关联的路由是:
|Dest |Targ |
|10.0.0.0/16 |local |
我有一个名为 MyWeb 的网络 ACL 与 MyVPCSub1 相关联,其中包含以下规则:
入境:
| # | Type | Protocol | Ports | Source | A/D
| 99 | HTTP | TCP | 80 | {My IP}/32 | D
| 100 | HTTP | TCP | 80 | 0.0.0.0/0 | A
| 200 | HTTPS| TCP | 443 | 0.0.0.0/0 | A
| 300 | SSH | TCP | 22 | {My IP}/32 | A
| * | ALL | ALL | ALL | 0.0.0.0/0 | D
出境:
| # | Type | Protocol | Ports | Source | A/D
| 50 | ALL | ALL | ALL | 0.0.0.0/0 | A
| 100 | HTTP | TCP | 80 | 0.0.0.0/0 | A
| 200 | HTTPS | TCP | 443 | 0.0.0.0/0 | A
| 300 | Custom | TCP | 1024-65535 | 0.0.0.0/32 | A
| * | ALL | ALL | ALL | 0.0.0.0/0 | D
我有一个名为 MyPrivate 的网络 ACL 与 MyVPCSub2 相关联,其中包含以下规则:
入境:
| # | Type | Protocol | Ports | Source | A/D
| 100 | ALL | ALL | ALL | 0.0.0.0/0 | A
| * | ALL | ALL | ALL | 0.0.0.0/0 | D
出境:
| # | Type | Protocol | Ports | Source | A/D
| 100 | ALL | ALL | ALL | 0.0.0.0/0 | A
| * | ALL | ALL | ALL | 0.0.0.0/0 | D
首先是定义一些术语的含义。
NACLS - 网络访问控制列表,是在子网级别应用的无状态数据包过滤器。记住“无状态”方面很重要,这意味着您需要明确所有进入和离开子网的流量。例如,使用“状态完整”规则方法(这是 AWS 中的安全组所应用的),您可以简单地为 SSH 指定 TCP/22 的入站流量,它将自动允许出站流量。对于 NACLS,情况并非如此,您需要在每个方向上指定一个规则以允许流量通过。
安全组 - 这些是状态完整的规则组,可应用于 VPC 中的一个或多个实例。请注意,它们适用于实例级别。可以将安全组与传统的全状态防火墙进行比较,但由于它应用于单个实例级别,因此即使在同一子网中也可以将实例彼此隔离,这很好。而且因为它们是状态完整的,如果你想允许流量进入服务器(例如 TCP/22 用于 SSH),你不必担心创建相应的出站规则,平台会自动处理,所以它们更容易管理——这也意味着出错的机会更少。
有一个很好的表格比较了这两者:VPC Security Comparison
该页面上还有一个很好的图表,显示了根据流向应用流量的顺序......所以检查一下。
然后就子网而言,我们有:
公共子网 - 在 AWS 术语中,这只是一个附加了路由表的子网,该路由表通过附加的 Internet 网关具有 0.0.0.0/0 路由
私有子网 - 这是相反的,即它没有通过连接的 Internet 网关的 0.0.0.0/0 路由。请注意,它仍然可以通过 NAT 网关或您环境中的类似代理拥有 0.0.0.0/0 路由,只是不是直接的。
问题是,当您拥有 NACLS 和安全组时 - 您使用哪个。AWS 将 NACL 描述为“您的 VPC 的可选安全层”。确实,通常安全组就足够了,它们更灵活并提供相同的保护。以我的经验,在一些典型的情况下,我看到使用了 NACLS:
AWS 还提供了一些关于此处可用的一些配置方案的指导:为您的 VPC 推荐的网络 ACL 规则
虽然我的指导通常是安全组提供适当的保护,更易于理解和配置,并且在其应用程序中更加灵活和精细。NACL 确实为您提供了人为错误或更高级配置的额外支持,但对于基本用途,它们通常不使用。因此,我假设为什么 AWS 将它们称为“可选”。
我会将 NACL 保留在其默认配置中(允许所有进出流量),而现在专注于安全组,因为使用 NACL 作为第二层只会增加额外的复杂性,这在您的场景中可能不需要。从学习的角度来看,很高兴知道它们在那里,它们是无状态的,它们适用于子网级别,并且它们在路由决策之后和安全组之前应用于进入子网的流量。
关于您的具体情况,因为您使用的是 NACL,所以您需要记住它们是无状态的。因此,需要考虑进出子网的所有流量——这就是安全组如此简单的主要原因。所以在你的情况下,你有:
您需要在您的出站公共子网 ACL 上添加一条类似规则 #300 的规则(但请注意,您的源 IP 格式稍有错误 - 见下文),但在绑定时,与私有子网的源一起使用。然后假设您的安全组配置良好,那么您应该一切顺利。
希望有帮助。
要添加 - 根据其他答案 - 公共子网的出站规则集上的规则 #300 格式错误。它应该是 0.0.0.0/0 而不是 0.0.0.0/32,但是在您的情况下,您并没有达到这一点,因为第 50 条规则首先被击中并且无论如何都允许所有流量 - 所以虽然它不起作用,但它是'实际上并没有导致你的问题。
ACL 是无状态的。
您的“公共”子网可能会阻止来自私有子网的 SSH 连接的返回路径。对于入站端的所有端口,您还需要一个与出站等效的规则,尽管您可以将其限制为子网范围 10.0.2.0/24。
编辑添加:此外,0.0.0.0/32 的出站规则是错误的。除非你的 IP 正好是 0.0.0.0,否则它是行不通的。