将互联网流量路由到单个网络接口 - Amazon Virtual Private Cloud

将互联网流量路由到单个网络接口

您可以将指向大型公共 IP 地址池的入站互联网流量路由到 VPC 中的单个弹性网络接口 (ENI)。

以前,互联网网关仅接受发往与 VPC 中网络接口直接关联的公有 IP 地址的流量。实例类型对可与网络接口关联的 IP 地址数量有限制,这给电信和物联网 (IoT) 等行业带来了挑战,因为这些行业需要处理大于这些限制的 IP 池流量。

这种路由选择消除了入站互联网连接上复杂的地址转换。您可以自带公共 IP 池(BYOIP),并配置 VPC 互联网网关,以接受整个池的流量并将其路由到单个网络接口。此功能在以下方面特别有价值:

  • 电信:无需地址转换开销即可管理大型订阅用户 IP 池

  • 物联网应用:整合来自数千个设备 IP 地址的流量

  • 任何场景:需要超出 ENI 关联限制的流量路由

您可以将此路由与 VPC 路由服务器集成,以便在失效转移场景中进行动态路由更新。

主要优势

这种路由选择方法有以下优点:

  • 无需地址转换 - 直接路由消除了 NAT 的复杂性

  • 绕过 ENI 限制 - 处理大于实例关联限制的 IP 池

  • 行业优化 - 专为电信和物联网需求而打造

  • 动态失效转移 - 与路由服务器集成以实现自动更新

可用性

您可以在所有 AWS 商业区域、AWS 中国区域 和 AWS GovCloud 区域使用此功能。

开始前的准备工作

开始本教程之前,请确保您满足以下条件:

  1. BYOIP 池:您必须已经将自己的 IP 地址范围设置为 AWS。在 Amazon EC2 中完成自带 IP 地址(BYOIP)的步骤。

  2. 验证您的 BYOIP 池:运行以下命令以确认池已准备就绪:

    aws ec2 describe-public-ipv4-pools --region us-east-1

    在输出中查找池,确保 PoolAddressRanges 显示 Available 地址。

  3. 适当的权限:确保您的AWS账户拥有创建 VPC 资源、EC2 实例和管理 BYOIP 池的权限。

此功能的工作原理

本节介绍互联网网关入口路由背后的技术概念,以及流量如何从互联网流向目标实例。

为什么要使用互联网网关入口路由

以前,由于 ENI 关联限制,您需要执行地址转换来整合大量 IP 地址的流量。此增强功能允许将 BYOIP 池直接路由到目标实例,从而消除了这种复杂性。

路由工作原理

此功能仅适用于您在 BYOIP 流程之后引入 AWS 的公共 IP CIDR。BYOIP 流程可确保您的账户拥有公共 IP CIDR。获得 BYOIP 公共 CIDR 后:

  1. 您可以将此公共 IP 地址池与互联网网关路由表相关联。互联网网关必须已经与 VPC 关联。此关联允许 VPC 接受以 IP CIDR 为目标的流量。确保互联网网关有专用路由表,不与任何子网共享。

  2. 现在,您已将 BYOIP 池与互联网网关路由表相关联,您可以在互联网网关路由表中输入目的地等于 IP CIDR 或其子集的路由。此路由的目标是您想要路由流量的 ENI。

  3. 当指向 BYOIP CIDR 的流量进入 AWS 时,AWS 会查看互联网网关路由表,并相应地将流量路由到相关 VPC。

  4. 在 VPC 内部,互联网网关将流量路由到目标 ENI。

  5. 目标(与工作负载相关的弹性网络接口)处理流量。

最佳实践

  • 将路由表分开:互联网网关路由表必须仅专用于互联网网关。未与子网关联的 VPC 路由表 使用单独的路由表进行子网路由。

  • 不要直接分配 BYOIP IP:不要将 BYOIP 池中的公共 IP 地址直接关联到 EC2 实例或网络接口。互联网网关入口路由功能可将流量路由到实例,而无需直接关联 IP。

重要

如果您使用的是 VPC 屏蔽公共访问 (BPA),则启用 BPA 后,即使您设置了子网级别 BPA 排除,它也会使用入口路由屏蔽到子网的流量。子网级别的排除不适用于入口路由。要允许启用 BPA 的入口路由流量,请执行以下操作:

  • 完全禁用 BPA,或

  • 使用 VPC 级别的排除项

第 1 步:创建 VPC

完成此步骤,创建用于托管目标实例和互联网网关的 VPC。

注意

确保您尚未达到 VPC 配额限制。有关更多信息,请参阅 Amazon VPC 配额

AWS 控制台

  1. 打开 Amazon VPC 控制台

  2. 在 VPC 控制面板上,选择创建 VPC

  3. 对于要创建的资源,选择 仅 VPC

  4. 对于 名称标签,输入计划的名称(例如 IGW-Ingress-VPC)。

  5. 对于 IPv4 CIDR 块,输入有效的 CIDR 块(例如 10.0.0.0/16)。

  6. 选择创建 VPC

AWS CLI

aws ec2 create-vpc --cidr-block 10.0.0.0/16 --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=IGW-Ingress-VPC}]' --region us-east-1

第 2 步:创建并连接到互联网网关

完成此步骤,创建互联网网关并将其附加到 VPC 以启用互联网连接。

AWS 控制台

  1. 打开 Amazon VPC 控制台

  2. 在 VPC 控制台中,选择互联网网关

  3. 选择创建互联网网关

  4. 对于名称标签,输入互联网网关的名称(例如 IGW-Ingress-Gateway)。

  5. 选择创建互联网网关

  6. 选择互联网网关,然后选择操作连接到 VPC

  7. 选择 VPC,然后选择连接互联网网关

AWS CLI

aws ec2 create-internet-gateway --tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=IGW-Ingress-Gateway}]' --region us-east-1 aws ec2 attach-internet-gateway --internet-gateway-id igw-0123456789abcdef0 --vpc-id vpc-0123456789abcdef0 --region us-east-1

注意:将资源 ID 替换为上一步中的实际 ID。

第 3 步:为目标实例创建子网

完成此步骤以创建将在其中部署目标实例的子网。

AWS 控制台

  1. 在 VPC 控制台的导航窗格中,选择 子网

  2. 选择创建子网

  3. VPC ID 中,选择您的 VPC ID。

  4. 子网名称中输入名称(例如 Target-Subnet)。

  5. 对于 Availability Zone(可用区),您可以为子网选择一个可用区,也可保留原定设置 No Preference(无首选项),以让 AWS 代您选择。

  6. 于 IPv4 CIDR 块,请选择手动输入并输入 CIDR 块(例如)。10.0.1.0/24

  7. 选择创建子网

AWS CLI

aws ec2 create-subnet \ --vpc-id vpc-0123456789abcdef0 \ --cidr-block 10.0.1.0/24 \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=Target-Subnet}]' \ --region us-east-1

第 4 步:为子网创建路由表

完成此步骤,为子网创建路由表,再将之与子网相关联。

AWS 控制台

  1. 在 VPC 控制台导航窗格中,选择路由表

  2. 选择创建路由表

  3. 对于名称,输入您路由表的名称(例如 Target-Subnet-Route-Table)。

  4. 对于 VPC,选择您的 VPC。

  5. 选择创建路由表

  6. 选择您的路由表,然后选择操作编辑子网关联

  7. 选择您的子网并选择保存关联

AWS CLI

aws ec2 create-route-table \ --vpc-id vpc-0123456789abcdef0 \ --tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=Target-Subnet-Route-Table}]' \ --region us-east-1 aws ec2 associate-route-table \ --route-table-id rtb-0987654321fedcba0 \ --subnet-id subnet-0123456789abcdef0 \ --region us-east-1

第 5 步:为目标实例创建安全组

完成此步骤,创建一个安全组,该组将控制对目标实例的网络访问。

AWS 控制台

  1. 在 VPC 控制台的导航窗格中,选择安全组

  2. 选择 Create security group(创建安全组)。

  3. 对于安全组名称,输入一个名称(例如 IGW-Target-SG)。

  4. 对于描述,输入 Security group for IGW ingress routing target instance

  5. 对于 VPC,选择您的 VPC。

  6. 要添加入站规则,请选择入站规则。对于每一条规则,选择 Add rule(添加规则),然后执行以下操作:

    • 类型:所有 ICMP-IPv4,来源:0.0.0.0/0(用于 ping 测试)。

    • 类型:SSH,端口:22,来源:0.0.0.0/0(适用于 EC2 Instance Connect)。

注意

此安全组为本教程的所有互联网流量开放 SSH 端口。本教程仅用于教育目的,不应针对生产环境进行配置。在生产环境中,将 SSH 访问限制为特定 IP 范围。

  • 选择 Create security group(创建安全组)。

AWS CLI

aws ec2 create-security-group \ --group-name IGW-Target-SG \ --description "Security group for IGW ingress routing target instance" \ --vpc-id vpc-0123456789abcdef0 \ --region us-east-1 aws ec2 authorize-security-group-ingress \ --group-id sg-0123456789abcdef0 \ --protocol icmp \ --port -1 \ --cidr 0.0.0.0/0 \ --region us-east-1 aws ec2 authorize-security-group-ingress \ --group-id sg-0123456789abcdef0 \ --protocol tcp \ --port 22 \ --cidr 0.0.0.0/0 \ --region us-east-1

第 6 步:启动一个 EC2 实例

完成此步骤,启动将从您的 BYOIP 池接收流量的 EC2 实例。

AWS 控制台

  1. 打开 Amazon EC2 控制台

  2. 选择启动实例

  3. 对于 Name (名称),输入实例的名称(例如 IGW-Target-Instance)。

  4. 应用程序和操作系统映像(亚马逊机器映像)中,选择 Amazon Linux 2023 AMI

  5. 对于实例类型,请选择 t2.micro (符合免费套餐)。

  6. 对于密钥对,选择现有密钥对或新建一个密钥对。

  7. 对于网络设置,选择编辑和配置。

    • VPC:选择您的 VPC

    • 子网,选择您的子网。

    • 自动分配公共 IP:已启用

    • 对于防火墙(安全组),请选择选择现有安全组和选择您的安全组。

  8. 选择启动实例

  9. 重要提示:启动后,转到实例详细信息并记下网络接口 ID(以 “eni-” 开头),第 10 步需要使用此 ID。

AWS CLI

aws ec2 run-instances \ --image-id ami-0abcdef1234567890 \ --count 1 \ --instance-type t2.micro \ --key-name your-key-pair \ --security-group-ids sg-0123456789abcdef0 \ --subnet-id subnet-0123456789abcdef0 \ --associate-public-ip-address \ --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=IGW-Target-Instance}]' \ --region us-east-1

在控制台中查找 ENI ID:

  1. 在 EC2 控制台中,选择您的实例。

  2. 转到网络标签。

  3. 记下网络接口 ID(例如 eni-0abcdef1234567890)。

使用 AWS CLI 查找 ENI ID:

aws ec2 describe-instances --instance-ids i-0123456789abcdef0 --query 'Reservations[0].Instances[0].NetworkInterfaces[0].NetworkInterfaceId' --output text --region us-east-1

第 7 步:互联网网关路由表

完成此步骤,为处理入口路由的互联网网关创建专用路由表。

AWS 控制台

  1. 在 VPC 控制台中,选择路由表

  2. 选择创建路由表

  3. 对于名称,输入路由表的名称(例如 IGW-Ingress-Route-Table)。

  4. 对于 VPC,选择您的 VPC。

  5. 选择创建路由表

  6. 选择路由表并选择 Edge associations(边缘关联)选项卡。

  7. 选择 Edit edge association (编辑边缘关联)

  8. 选择您的互联网网关,然后选择保存更改

AWS CLI

aws ec2 create-route-table \ --vpc-id vpc-0123456789abcdef0 \ --tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=IGW-Ingress-Route-Table}]' \ --region us-east-1

第 8 步:将路由表与互联网网关联

完成此步骤,将您的路由表与互联网网关联,以启用入口路由功能。

AWS 控制台

  1. 在 VPC 控制台导航窗格中,选择路由表,然后选择您创建的路由表。

  2. Edge associations(边缘关联)选项卡,选择 Edit edge associations(编辑边缘关联)。

  3. 选中互联网网关的复选框。

  4. 选择保存更改

AWS CLI

aws ec2 associate-route-table \ --route-table-id rtb-0123456789abcdef0 \ --gateway-id igw-0123456789abcdef0 \ --region us-east-1

第 9 步:将您的 BYOIP 池与互联网网关关联

完成此步骤,将您的 BYOIP 池与互联网网关路由表关联,使 VPC 能够接受您的 IP 范围的流量。

AWS 控制台

  1. 在 VPC 导航窗格中,选择路由表,然后选择您创建的互联网网关路由表。

  2. 单击 IPv4 池关联选项卡。

  3. 单击编辑关联按钮。

  4. 选择您的 BYOIP 池(例如)。pool-12345678901234567

  5. 单击保存关联按钮。

AWS CLI

aws ec2 associate-route-table \ --route-table-id rtb-0123456789abcdef0 \ --public-ipv4-pool pool-12345678901234567 \ --region us-east-1

注意:请替换 rtb-0123456789abcdef0 为您的互联网网关路由表 ID 和 pool-12345678901234567 BYOIP 池 ID。

第 10 步:添加静态路由以定位您的实例

完成此步骤可添加一个路由,将流量从您的 BYOIP 范围引导到目标实例的网络接口。

AWS 控制台

  1. 在 VPC 控制台导航窗格中,选择路由表,然后选择您创建的互联网网关路由表。

  2. 依次选择 Actions (操作)Edit routes (编辑路由)

  3. 选择 Add route(添加路由)。

  4. 目标中,输入您的 BYOIP CIDR 或子集(例如,)。203.0.113.0/24该值必须在 /23 到 /28 之间。

  5. 对于目标,选择网络接口并输入您的实例的 ENI ID(例如eni-0abcdef1234567890)。

  6. 选择保存更改

AWS CLI

aws ec2 create-route \ --route-table-id rtb-0123456789abcdef0 \ --destination-cidr-block 203.0.113.0/24 \ --network-interface-id eni-0abcdef1234567890 \ --region us-east-1

第 11 步:验证容器实例

完成此步骤可将目标实例配置为正确处理发往 BYOIP 地址的流量。

重要提示:在测试连通性之前,请完成此实例配置步骤(步骤 12)。必须将实例配置为响应 BYOIP 地址,入口路由才能正常工作。

AWS 控制台

  1. 使用 EC2 Instance Connect 连接到 Linux 实例

    • 在 EC2 控制台中,选择您的实例。

    • 选择操作 > 连接

    • 选择 EC2 实例连接选项卡。

    • 选择连接

  2. 向您的实例接口添加特定的 BYOIP IP 地址:

    首先,找到您的网络接口名称:

    ip link show

    然后添加 IP 地址(请替换 203.0.113.10 为您的 BYOIP 范围中的 IP 地址):

    sudo ip addr add 203.0.113.10/32 dev eth0

    注意:请替换 203.0.113.10 为您想要测试的 BYOIP 范围中的任何 IP 地址。接口名称可能是 eth0ens5 或类似名称,具体取决于实例类型。

  3. 在 EC2 控制台中,禁用源/目标检查

    • 选择您的实例。

    • 进入网络选项卡,点击网络接口。

    • 依次选择操作更改源/目标检查禁用

AWS CLI

aws ec2 modify-network-interface-attribute \ --network-interface-id eni-0abcdef1234567890 \ --no-source-dest-check \ --region us-east-1

第 12 步:为流量处理配置实例

完成此步骤,向您的实例添加 BYOIP 地址,并禁用源/目标检查以启用正确的流量处理。

AWS 控制台

  1. 使用 EC2 Instance Connect 连接到 Linux 实例

    • 在 EC2 控制台中,选择您的实例。

    • 选择操作 > 连接

    • 选择 EC2 实例连接选项卡。

    • 选择连接

  2. 向您的实例接口添加特定的 BYOIP IP 地址:

    首先,找到您的网络接口名称:

    ip link show

    然后添加 IP 地址(ens5 替换为实际的接口名称):

    sudo ip addr add 203.0.113.10/32 dev ens5

    注意:请替换 203.0.113.10 为您想要测试的 BYOIP 范围中的任何 IP 地址。接口名称可能是 eth0ens5 或类似名称,具体取决于实例类型。

  3. 在 EC2 控制台中,禁用源/目标检查

    • 选择您的实例。

    • 进入网络选项卡,点击网络接口。

    • 依次选择操作更改源/目标检查禁用

AWS CLI

aws ec2 modify-network-interface-attribute \ --network-interface-id eni-0abcdef1234567890 \ --no-source-dest-check \ --region us-east-1

第 13 步:测试连接性

完成此步骤以验证互联网流量是否已通过 BYOIP 地址正确路由到您的目标实例。

  1. 在目标实例上,使用 tcpdump 监控传入流量:

    sudo tcpdump -i any icmp
  2. 在另一台终端或计算机上,测试与您的 BYOIP IP 地址的连接:

    ping 203.0.113.10
  3. 预期结果

    • Ping 应该成功并显示来自您的 BYOIP IP 地址的响应。

    • tcpdump 应显示 BYOIP 地址的传入数据包,类似于:

      12:34:56.789012 IP 203.0.113.100 > 203.0.113.10: ICMP echo request, id 1234, seq 1, length 64 12:34:56.789123 IP 203.0.113.10 > 203.0.113.100: ICMP echo reply, id 1234, seq 1, length 64
    • 流量应该看起来来自外部 IP 地址,这证明互联网网关入口路由正在向您的实例传送互联网流量。

故障排除

使用本节来解决在设置互联网网关入口路由时可能遇到的常见问题。

流量未到达实例
  • 验证路由表是否有正确的 ENI ID 作为目标。

  • 确认 BYOIP 池与互联网网关路由表关联。

  • 检查实例上是否已禁用源/目标检查。

  • 确保安全组允许您正在测试的流量类型。

hose 创建失败
  • 验证 BYOIP 池与路由表的关联是否正确。

  • 确认目标 CIDR 在您的 BYOIP 范围内。

  • 检查目标 ENI 是否存在且已连接到正在运行的实例。

  • 确保您的 BYOIP 前缀介于 /23 和 /28 之间(不支持超出此范围的前缀)。

Ping/连接失败
  • 验证 IP 地址已添加到实例接口。

  • 检查安全组是否允许 ICMP(用于 ping)或相关端口。

  • 确认实例处于运行状态。

  • 从多个外部位置进行测试。

高级选项:集成路由服务器以实现动态路由

对于需要自动失效转移的环境,此功能与 VPC 路由服务器集成,可以:

  • 在实例故障期间动态更新路由

  • 消除对路由管理的手动干预

  • 为关键工作负载提供企业级可用性

这对于高可用性至关重要的电信和物联网用例尤其重要。

注意

与多个 BGP 对等体一起使用路由服务器时,请注意最多有 32 个 BGP 对等体可使用路由服务器向同一个路由表发布相同的前缀。

对于需要动态路由、自动失效转移和跨多个实例分配负载的环境,可以考虑与 AWS Route Server 集成。路由服务器启用基于 BGP 的动态路由,而不是静态路由,前提是:

  • 通过 BGP 从实例发布动态路由通告

  • 在多个目标实例之间自动进行失效转移

  • 跨多个端点的负载分布

  • 通过 BGP 协议进行集中路由管理

对于需要高可用性和动态路由功能的企业部署来说,这是一个重要的使用案例。有关详细的路由服务器设置说明,请参阅AWS路由服务器文档

清理

要避免为此教程创建的资源持续产生费用,您应删除:

第 1 步:终止 EC2 实例

完成此步骤可终止 EC2 实例并停止产生计算资源费用。

AWS 控制台

  1. 打开 Amazon EC2 控制台

  2. 在 EC2 控制台导航窗格中,选择实例

  3. 选择相应实例,然后依次选择 Instance state (实例状态)Terminate instance (终止实例)

  4. 选择终止进行确认。

AWS CLI

aws ec2 terminate-instances --instance-ids i-0123456789abcdef0 --region us-east-1

第 2 步 将互联网网关与 VPC 分离

完成此步骤,从您的 VPC 中分离和删除互联网网关。

AWS 控制台

  1. 打开 Amazon VPC 控制台

  2. 在导航窗格中,选择 Internet gateways(互联网网关)。

  3. 选择相应的互联网网关,然后选择 Actions, Detach from VPC (操作,与 VPC 分离)。

  4. 选择分离互联网网关

  5. 依次选择操作删除互联网网关

  6. 选择删除互联网网关

AWS CLI

aws ec2 detach-internet-gateway --internet-gateway-id igw-0123456789abcdef0 --vpc-id vpc-0123456789abcdef0 --region us-east-1 aws ec2 delete-internet-gateway --internet-gateway-id igw-0123456789abcdef0 --region us-east-1

第 3 步:删除 VPC

完成此步骤以删除 VPC 和所有相关资源以完成清理过程。

AWS 控制台

  1. 在 VPC 控制台中,选择您的 VPC

  2. 选择要删除的 VPC,然后依次选择 Actions(操作)、Delete VPC(删除 VPC)。

  3. 键入 delete 进行确认,然后选择删除

AWS CLI

aws ec2 delete-vpc --vpc-id vpc-0123456789abcdef0 --region us-east-1
注意

删除 VPC 还会删除关联的子网、路由表和安全组。

注意

您的 BYOIP 池仍可供将来使用,并且不会在此清理过程中被删除。