Mar*_*own 1 ssh access-control-list amazon-web-services amazon-vpc
我正在 AWS 上做一门课程。我想要做的是设置一个带有两台 Linux 服务器的 VPC。我已经设置了具有两个子网的 VPC。我在每个服务器中都放置了一台服务器。这个想法是一个子网是公共的,另一个是私有的。
我创建了两个网络 ACL,并为每个子网关联了一个。
我可以从我的机器通过 SSH 连接到公共子网中的服务器。当我尝试通过 SSH 连接到我的私有子网中的服务器时,我遇到了连接超时。
我不确定需要在我的两个网络 ACL 中设置什么规则才能使 SSH 正常工作。任何人都可以帮忙吗?鉴于我正在学习,我希望能解释为什么规则应该是,而不仅仅是规则应该是什么。
我有一个名为 MyVPC 的 VPC,其 CIDR 为 10.0.0.0/16
我的第一个子网名为 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 |
Run Code Online (Sandbox Code Playgroud)
我有一个名为 MyPrivate 的路由表与 MyVPCSub2 相关联的路由是:
|Dest |Targ |
|10.0.0.0/16 |local |
Run Code Online (Sandbox Code Playgroud)
我有一个名为 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
Run Code Online (Sandbox Code Playgroud)
出站:
| # | 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
Run Code Online (Sandbox Code Playgroud)
我有一个名为 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
Run Code Online (Sandbox Code Playgroud)
出站:
| # | 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
Run Code Online (Sandbox Code Playgroud)
首先是定义一些术语的含义。
NACLS - 网络访问控制列表,是一种应用于子网级别的无状态数据包过滤器。记住“无状态”方面很重要,这意味着您需要明确所有进入和离开子网的流量。例如,使用“全状态”规则方法(AWS 中的安全组适用的方法),您可以简单地为 SSH 指定 TCP/22 的入站流量,它会自动允许出站流量。对于 NACLS,情况并非如此,您需要在每个方向指定一个规则以允许流量通过。
安全组 - 这些是可应用于 VPC 中的一个或多个实例的完整规则组。请注意,它们适用于实例级别。安全组可以与传统的全状态防火墙进行比较,但由于它应用于单个实例级别,您甚至可以在同一子网内将实例彼此隔离,这很好。并且因为它们是全状态的,如果您想允许流量进入服务器(例如用于 SSH 的 TCP/22),您不必担心创建相应的出站规则,平台会自动处理,所以它们更容易管理 - 这也意味着出错的机会更少。
有一个很好的表格比较了这两者:VPC 安全性比较
该页面上还有一个很好的图表,它显示了根据流动方向应用于流量的事物的顺序......所以请检查一下。
然后就子网而言,我们有:
公共子网 - 在 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 条规则首先被命中并且无论如何都允许所有流量 - 所以虽然它不起作用,但它不是实际上并没有导致你的问题。