这和这和这 与我的问题非常相关。虽然它似乎已经回答了很多人的问题,但我仍然很难理解这种设置是特定于 AWS 还是一般网络。如果是后者,那么我需要重新回顾我的基础知识。我已经怀疑了,因此才提出这个问题。
我的理解
如果专用网络连接到互联网,则其主机需要具有公共 IP,以便在互联网上唯一可识别。所有到互联网的流量(入站或出站)都通过此公共 IP 地址进行。此网络的主机连接到互联网时会获得公共 IP。从此主机发出到 www.google.com 的数据包将包含主机的专用地址,而该地址最终将被 NAT 设备(安装在路由器/默认网关上)替换为其公共 IP 地址,如图所示这里。这是大多数互联网(IPV6 除外)的运行方式。
现在,在 AWS 中
- 当你创建一个公共子网并启用自动分配公共 IP,您实际上是在通知 Internet 网关在互联网上路由其请求时,将来自此 EC2 实例的请求数据包中的 EC2 实例的私有地址与 EC2 实例的公有 IP 地址进行切换,反之亦然。我的理解对吗?
当你创建一个私有子网(不将其连接到互联网网关),您将其保密。然后,我们有意识地确保我们保留自动分配公网 IP已禁用。因此,当我们在此私有子网内启动 EC2 实例时,我们无法在 EC2 控制台上看到公有 IP。这也意味着此子网中的实例对互联网不可见。现在,如果我将此私有子网连接到 NAT 设备(当然,该设备位于公有子网上)(请不要混淆我和 NAT 网关目前做得更好的地方)然后,我基本上让 NAT 设备从私有子网中找出要分配给特定主机 X 的公共 IP,该主机 X 已请求以公共 IP 与互联网进行通信是需要与互联网进行通信。
现在,
- 这难道不是路由器/(互联网)网关已经在 AWS 和一般网络中执行的操作吗?将公有 IP 分配给网络上的主机并在数据包(源自此网络上的主机)传到互联网的过程中不断用公有 IP 地址替换数据包中的私有 IP 地址,难道这不是由路由器执行的操作吗?
- 假设 NAT 设备确定要分配给私有子网的此主机的 IP 1.2.3.4。如果“以某种方式”此 IP 在 Internet 上为人所知,那么私有子网上的此主机也应该可以从 Internet 访问,除非 NAT 设备耍了什么花招(查看后续问题)。我的理解对吗?现在,AWS 表示 NAT 设备不允许入站通信。这是否类似于这样一个事实:即使知道了公有 IP 1.2.3.4(NAT 设备分配给此私有子网的主机),入站连接也会受到强制限制?或者,NAT 设备是否只是代表来自私有网络的主机使用自己的 IP 地址(这不是 NAT 设备理想情况下应该做的事情;NAT 设备会获取分配的私有 IP 并将其替换为数据包上的公有 IP)?
- 此外,AWS 还允许您启用自动分配公共 IP在私有子网上也是如此。我可以确认我可以在具有公共 IP 的私有子网上看到 EC2 实例。所以,现在您有一个私有子网 (因为它们在路由表中未连接到 Internet 网关)具有公共 IP 的实例(因为您启用了自动分配公共 IP在私有子网上)。 这应该如何解释呢?
答案1
我认为你误解了NAT网关的功能而这又会引起其他的混乱。
NAT 不会随机为内部/私有主机分配地址。
NAT 设备通常具有两个接口-内部的使用私有 IP,例如 10.0.0.1。并且外部的具有公共 IP,例如 1.2.3.4。
例如,内部网络中具有某些
10.0.0.x
地址(没有公共地址)的主机将所有出站流量发送到NAT 网关NAT 网关取代了源 IP在包中(例如10.0.0.123
)有自己的公有 IP(即1.2.3.4
)。然后它将数据包发送到互联网上的目的地,例如 Google。TCP 数据包不仅有源和目标地址也是来源和目的地端口. 源端口也可能会被 NAT 网关替换,以避免当多个主机尝试与相同的源端口进行通信时发生冲突。
NAT解释:
内部主机10.0.0.123
想要从google.com通过216.58.203.110
HTTPS,即端口443
。
它向 NAT 网关发送一个包含源
10.0.0.123:12345
(地址:随机本地端口)和目标(地址:https 端口)的数据包,因为这是最好的216.58.203.110:443
下一跳对于所有地址不是10.0.0.x
。NAT 网关将源替换
10.0.0.123:12345
为其自己的公共 IP 和某个随机端口1.2.3.4:54321
。它记录了从
10.0.0.123:12345
到 的连接在其216.58.203.110:443
1.2.3.4:54321
连接跟踪表。当来自 google 的返回数据包以目的地到达 NAT 网关时
1.2.3.4:54321
,网关会查找该记录(地址:端口)并发现应将其转换回该10.0.0.123:12345
端口并将其发送到该主机。
如果同一时间本地网络中的另一台主机(例如10.0.0.99
)尝试从 Google 下载某些内容,则会发生以下情况:
NAT网关再次将源IP转换为自己的公网IP
1.2.3.4
但源端口将与之前不同,例如56789
。现在 Google 看到来自我们的 NAT 网关的两个连接
1.2.3.4:54321
- 到 -216.58.203.110:443
(NAT 网关知道原始来源实际上是10.0.0.123:12345
)1.2.3.4:56789
- 到 -216.58.203.110:443
(NAT GW 知道原始源是10.0.0.99:12345
)。
两个连接出现来自 NAT 网关,但实际上它们是发起的来自不同的主机在内部网络中。只有 NAT 网关知道映射。
简而言之就是这样。
现在有几点说明:
你不能发起連接从外面到 NAT 后面的主机。您只能向从内部发起的数据包发送回复。
这是因为当内部主机发送第一个数据包时,内部
IP:port
和 NAT 网关之间的映射就完成了。IP:port
如果你想
10.0.0.123:22
从外部通过 SSH 连接,你会怎么做?你可以将 SSH 数据包发送到 NAT 网关 IP,1.2.3.4
但什么港口?你看,没有映射,所以不可能从外部发起连接。路由器另一方面,不改变任何 IP 或端口(与 NAT 网关相反)。它们几乎不加改变地传递数据包。
在 AWS 环境中路由器是IGW = 互联网网关. NAT 可以是NAT 网关或者NAT 实例,他们做同样的事情。
希望这能解释清楚:)
答案2
这更像是对上述@MLu 的回答的(大力)支持性评论,引用了官方 AWS 文档中的相关片段,阐明了 Internet 网关和 NAT 设备在 AWS 中的作用。
NAT 设备(NAT 实例或 NAT 网关)
从AWS 文档 » Amazon VPC » 用户指南 » VPC 网络组件 » NAT:
尽管 NAT 设备的实际作用是地址转换和端口地址转换(PAT),但我们在本文档中使用术语 NAT 来遵循常见的 IT 实践。
NAT 设备的具体目的是允许私有网络中的主机通过执行 PAT 的 NAT 设备访问外部网络(互联网)。
因此,如果私有子网中有一个主机,其 IP 为10.0.1.1/32
,并且它向 google.com(216.58.211.174/32)发送请求,则 NAT 设备将记录从 10.0.1.1:SOMESOURCEPORT 到 216.58.211.174:SOMEDESTPORT 的映射,并将请求(数据包)中的源 IP 更改为其公共 NAT-PUB-IP:SOMERANDOMPORT。
记录的映射将是:
10.0.1.1:SOMESOURCEPORT --❯ NAT-PUB-IP:SOMERANDOMPORT
当它收到响应时NAT-PUB-IP:SOMERANDOMPORT
,查找记录的映射就会发现响应需要返回10.0.1.1
。
所有内部 IP 均转换为分配给 NAT 设备的单个公共 IP。连接的多路复用依赖于 NAT 设备根据 唯一地标识内部主机SOMERANDOMPORT
。
这也意味着,如果内部主机确实分配了公共 IP,那么对于 NAT 设备来说,这并不重要,因为它只对内部 IP 地址执行 PAT。
互联网网关 (IGW)
这也执行 NAT,但与上面的不同,它执行的是静态 NAT。简单来说,有以下静态记录:
Internal HOST IP <-> Public IP Assigned to the Internal Host
请注意,AWS VPC 内的主机仅知道其在 VPC 内的私有 IP。分配给它的公共 IP 仅供 Internet 网关使用。
对于与上述相同的请求(内部主机到 google.com),如果
- 主机位于公共子网内(根据定义,这意味着公共子网与具有四重 cidr 路由条目的路由表相关联,以将所有非 VPC 流量重定向到 IGW),并且,
- 它分配有一个公共 IP 地址,然后来自内部主机、目的地为 VPC 外部的数据包被路由到 IGW,IGW 根据其拥有的映射转换数据包中的源 IP:
10.0.1.1 -> Public_IP_Of_Internal_Host
当它收到带有目的地的响应时,Public_IP_Of_Internal_Host
该响应将被转换回10.0.1.1
从https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html
互联网网关有两个用途:在您的 VPC 路由表中为可路由互联网的流量提供目标,以及执行网络地址转换 (NAT)对于已分配公共 IPv4 地址的实例。
如前所述,需要分配公共 IP 的原因是 IGW 只能执行静态 NAT,因此需要公共 IP 才能创建它与主机内部 IP 之间的映射。