【问题标题】:Unable to get AWS NAT gateway working for API with IP whitelist无法让 AWS NAT 网关为具有 IP 白名单的 API 工作
【发布时间】:2018-09-23 23:23:10
【问题描述】:

我们的目标是让我们的 Elastic Beanstalk 设置通过 NAT 网关路由流量,因为我们需要连接到需要 IP 白名单的 API 的某些流量。我没有对当前设置进行修改,而是创建了一个单独/隔离的 VPC 和 EC2 实例来熟悉和测试设置。但是,我还没有让设置按预期工作。

这里是设置

  • VPC (vpc-77049811),CIDR 为 10.0.0.0/16
  • 分配给上述 VPC 的 Internet 网关 (igw-4d4b212a)
  • CIDR 为 10.0.1.0/24 的子网 (subnet-096d8a53)
  • NAT 网关 (nat-00bb49204627de7e6) 连接到上述子网并分配了弹性 IP
  • 附加到提到的 VPC 并与提到的子网关联的路由表
  • 1x EC2 实例分配给 VPC 及其自己的弹性 IP 和禁用的源/目标检查

路由表设置

10.0.0.0/16     local
0.0.0.0/0       igw-4d4b212a

通过上述设置,可以登录服务器并发出 curl 请求以获取服务器的公共 IP 地址(curl icanhazip.com)。不过,只要我在路由表中添加一条规则,让 URL 的解析 IP 路由通过 NAT 网关,我就无法 ping 或请求 curl 请求,因为它会超时。

添加到路由表的规则不起作用

45.63.64.111/32     nat-00bb49204627de7e6
144.202.71.30/32    nat-00bb49204627de7e6

不确定我是否在这里忽略了某些内容,或者我误解了 NAT 网关的概念和用例?

【问题讨论】:

    标签: amazon-web-services amazon-elastic-beanstalk amazon-vpc


    【解决方案1】:

    您似乎误解了 NAT 的用途。

    其目的是为私有子网中的实例提供出站 Internet 访问,而不允许任何入站连接 - 即路由表没有以下条目的子网:

    0.0.0.0/0       igw-4d4b212a
    

    如果您想限制从您的 EC2 实例对特定 IP 地址的访问,请将您的 NAT 放入公共子网,创建一个私有子网,然后将您的实例放入私有子网中。然后将两条路由添加到与私有子网关联的路由表中:

    45.63.64.111/32     nat-00bb49204627de7e6
    144.202.71.30/32    nat-00bb49204627de7e6
    

    如果您只想将您的 EC2 实例的访问权限限制为几个 IP 地址,则只能为这些地址创建路由:

    45.63.64.111/32     igw-4d4b212a
    144.202.71.30/32    igw-4d4b212a
    

    请注意,使用最后一个选项,如果您在安全组中打开了规则,则可以从 Internet 访问您的实例。

    【讨论】:

    • 我尝试了你的第一个解决方案,它确实有效,但是这些是需要成为负载平衡环境一部分的 Web 节点,当我将这些节点添加到负载平衡器时,它们是不可访问的,这当然是由于路由表而有意义。您是否能够提供任何进一步的建议/解决方案,说明我如何让来自私有子网内的服务器的所有传出流量通过 NAT 路由(或者只是 2 个 IP 的流量),但仍然可以通过负载公开访问节点平衡器?
    • 我忘了提到在私有子网中的路由表规则,我将规则设置为 0.0.0.0/0 nat-00bb49204627de7e6 而不是指定 2 个 IP
    • 是否可以创建目标 IP 为动态的架构?我说的是 Google API 密钥的 IP 限制,例如:我需要一个静态 IP,但问题是 Google 服务器 IP 不是静态的。这可以与 NAT 网关一起使用,还是有其他解决方案?
    【解决方案2】:

    这是公共 IP 45.63.64.111。您需要 IGW 才能访问此流量。

    1. 您可以通过直接将流量重定向到 IGW 来做到这一点 或
    2. 您可以通过定向到 NAT,然后进一步将该流量定向到 IGW 来做到这一点

    缺少指向 IGW 的部分。

    Nat 网关用于私有子网中的 EC2(没有附加 IGW)。在上述场景中,EC2 位于公共子网中,因此理想情况下它不需要 NAT。

    这是我使用 NAT 时要做的事情- 1. 将 EC2 置于私有子目录中。并有一个路由表,其中所有传出流量都到 nat-gateway。 2. 位于公有子网的 Nat-gateway 会将您的流量转发给 IGW。

    【讨论】:

    • 我尝试将 EC2 实例放置在具有路由表规则和 NAT 网关的私有子网中,我可以确认流量是通过 NAT 路由的,但是当我添加这些 EC2 实例时无法访问它们连接到负载均衡器。我需要能够让 EC2 实例的所有流量(或只是某些 IP)通过 NAT 路由,但仍然可以通过负载均衡器公开访问这些 EC2 实例。有什么想法吗?
    • 由于每个路由表中都有本地路由,负载均衡器应该可以连接到实例。唯一可能阻止这种情况发生的是安全组规则。
    • 实例显示为 InService,ELB 和 EC2 都使用相同的安全组,允许所有流量从任何来源进出。
    • 好的,下一步就是检查负载均衡器的访问日志。这将显示您的请求是否被 ELB 或 EC2 拒绝。另外,请仔细检查您的安全组和 NACL。
    • 我启用并检查了 ELB 日志,发现没有请求通过。因此,我专注于查看 ELB,结果发现 ELB 实际上位于私有子网内,因为当您创建 ELB 时,它也会询问您希望哪些子网路由流量,而我没有意识到它不会询问您哪个子网/可用性用于放置 ELB 的区域,并将其实际放置在为路由选择的子网之一中。
    猜你喜欢
    • 2021-07-10
    • 2019-02-01
    • 2018-02-21
    • 2016-10-02
    • 2017-08-23
    • 1970-01-01
    • 2021-12-01
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多