设置 NAT 实例的文档指出,您必须禁用 NAT 实例上的源/目标检查才能使其正常工作。来自https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html#EIP_Disable_SrcDestCheck
每个 EC2 实例默认执行源/目标检查。这意味着实例必须是其发送或接收的任何流量的源或目标。但是,当源或目标不是其自身时,NAT 实例必须能够发送和接收流量。因此,您必须禁用 NAT 实例上的源/目标检查。
从概念上讲,这很有道理。但我好奇的是这实际上是如何实施的。我对 NAT 的非专家理解是,NAT 节点发送的数据包应该看起来就像是来自 NAT 节点本身,其 IP 地址是源。
因此,我能想到的唯一办法是检查流量源,采用一种方案,即 AWS 查看 TTL 值,并了解每个实例的操作系统,如果它不是默认的起始 TTL,则拒绝数据包(这不是阻止 NAT 的新方法)。在出站/SNAT 上,它将是起始值 - 1,在入站/DNAT 上,它将比从 Internet 网关收到的数据包的 TTL 小 1(如果发送方具有更高的起始 TTL 并且跳数恰好正确,则可能会匹配)。
但是,对于流量目的地检查,它如何知道传入 NAT 实例的数据包(该数据包将具有该实例的公共 IP)没有该 NAT 实例的(最终)目的地?NAT 实例在收到数据包后将尝试转发该数据包这一事实似乎是次要的。它是否在出站时进行某种状态 TTL 检测组合,以了解 NAT 实例上的临时端口用于接收对 NAT 连接的回复?还是目的地检查仅有的NAT 实例是否有能力在私有子网上接收数据包(这是一个简单的目标 IP 地址检查)?