将互联网流量路由到单个网络接口
您可以将指向大型公共 IP 地址池的入站互联网流量路由到 VPC 中的单个弹性网络接口 (ENI)。
以前,互联网网关仅接受发往与 VPC 中网络接口直接关联的公有 IP 地址的流量。实例类型对可与网络接口关联的 IP 地址数量有限制,这给电信和物联网 (IoT) 等行业带来了挑战,因为这些行业需要处理大于这些限制的 IP 池流量。
这种路由选择消除了入站互联网连接上复杂的地址转换。您可以自带公共 IP 池(BYOIP),并配置 VPC 互联网网关,以接受整个池的流量并将其路由到单个网络接口。此功能在以下方面特别有价值:
-
电信:无需地址转换开销即可管理大型订阅用户 IP 池
-
物联网应用:整合来自数千个设备 IP 地址的流量
-
任何场景:需要超出 ENI 关联限制的流量路由
您可以将此路由与 VPC 路由服务器集成,以便在失效转移场景中进行动态路由更新。
主要优势
这种路由选择方法有以下优点:
-
无需地址转换 - 直接路由消除了 NAT 的复杂性
-
绕过 ENI 限制 - 处理大于实例关联限制的 IP 池
-
行业优化 - 专为电信和物联网需求而打造
-
动态失效转移 - 与路由服务器集成以实现自动更新
可用性
您可以在所有 AWS 商业区域、AWS 中国区域 和 AWS GovCloud 区域使用此功能。
目录
开始前的准备工作
开始本教程之前,请确保您满足以下条件:
-
BYOIP 池:您必须已经将自己的 IP 地址范围设置为 AWS。在 Amazon EC2 中完成自带 IP 地址(BYOIP)的步骤。
-
验证您的 BYOIP 池:运行以下命令以确认池已准备就绪:
aws ec2 describe-public-ipv4-pools --region us-east-1
在输出中查找池,确保
PoolAddressRanges
显示Available
地址。 -
适当的权限:确保您的AWS账户拥有创建 VPC 资源、EC2 实例和管理 BYOIP 池的权限。
此功能的工作原理
本节介绍互联网网关入口路由背后的技术概念,以及流量如何从互联网流向目标实例。
为什么要使用互联网网关入口路由
以前,由于 ENI 关联限制,您需要执行地址转换来整合大量 IP 地址的流量。此增强功能允许将 BYOIP 池直接路由到目标实例,从而消除了这种复杂性。
路由工作原理
此功能仅适用于您在 BYOIP 流程之后引入 AWS 的公共 IP CIDR。BYOIP 流程可确保您的账户拥有公共 IP CIDR。获得 BYOIP 公共 CIDR 后:
-
您可以将此公共 IP 地址池与互联网网关路由表相关联。互联网网关必须已经与 VPC 关联。此关联允许 VPC 接受以 IP CIDR 为目标的流量。确保互联网网关有专用路由表,不与任何子网共享。
-
现在,您已将 BYOIP 池与互联网网关路由表相关联,您可以在互联网网关路由表中输入目的地等于 IP CIDR 或其子集的路由。此路由的目标是您想要路由流量的 ENI。
-
当指向 BYOIP CIDR 的流量进入 AWS 时,AWS 会查看互联网网关路由表,并相应地将流量路由到相关 VPC。
-
在 VPC 内部,互联网网关将流量路由到目标 ENI。
-
目标(与工作负载相关的弹性网络接口)处理流量。
最佳实践
-
将路由表分开:互联网网关路由表必须仅专用于互联网网关。未与子网关联的 VPC 路由表 使用单独的路由表进行子网路由。
-
不要直接分配 BYOIP IP:不要将 BYOIP 池中的公共 IP 地址直接关联到 EC2 实例或网络接口。互联网网关入口路由功能可将流量路由到实例,而无需直接关联 IP。
重要
如果您使用的是 VPC 屏蔽公共访问 (BPA),则启用 BPA 后,即使您设置了子网级别 BPA 排除,它也会使用入口路由屏蔽到子网的流量。子网级别的排除不适用于入口路由。要允许启用 BPA 的入口路由流量,请执行以下操作:
完全禁用 BPA,或
使用 VPC 级别的排除项
第 1 步:创建 VPC
完成此步骤,创建用于托管目标实例和互联网网关的 VPC。
注意
确保您尚未达到 VPC 配额限制。有关更多信息,请参阅 Amazon VPC 配额。
AWS 控制台
-
打开 Amazon VPC 控制台
。 -
在 VPC 控制面板上,选择创建 VPC。
-
对于要创建的资源,选择 仅 VPC。
-
对于 名称标签,输入计划的名称(例如
IGW-Ingress-VPC
)。 -
对于 IPv4 CIDR 块,输入有效的 CIDR 块(例如
10.0.0.0/16
)。 -
选择创建 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 控制台
-
打开 Amazon VPC 控制台
。 -
在 VPC 控制台中,选择互联网网关。
-
选择创建互联网网关。
-
对于名称标签,输入互联网网关的名称(例如
IGW-Ingress-Gateway
)。 -
选择创建互联网网关。
-
选择互联网网关,然后选择操作,连接到 VPC。
-
选择 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 控制台
-
在 VPC 控制台的导航窗格中,选择 子网。
-
选择创建子网。
-
在 VPC ID 中,选择您的 VPC ID。
-
在 子网名称中输入名称(例如
Target-Subnet
)。 -
对于 Availability Zone(可用区),您可以为子网选择一个可用区,也可保留原定设置 No Preference(无首选项),以让 AWS 代您选择。
-
对于 IPv4 CIDR 块,请选择手动输入并输入 CIDR 块(例如)。
10.0.1.0/24
-
选择创建子网。
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 控制台
-
在 VPC 控制台导航窗格中,选择路由表。
-
选择创建路由表。
-
对于名称,输入您路由表的名称(例如
Target-Subnet-Route-Table
)。 -
对于 VPC,选择您的 VPC。
-
选择创建路由表。
-
选择您的路由表,然后选择操作、编辑子网关联。
-
选择您的子网并选择保存关联。
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 控制台
-
在 VPC 控制台的导航窗格中,选择安全组。
-
选择 Create security group(创建安全组)。
-
对于安全组名称,输入一个名称(例如
IGW-Target-SG
)。 -
对于描述,输入
Security group for IGW ingress routing target instance
。 -
对于 VPC,选择您的 VPC。
-
要添加入站规则,请选择入站规则。对于每一条规则,选择 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 控制台
-
打开 Amazon EC2 控制台
。 -
选择启动实例。
-
对于 Name (名称),输入实例的名称(例如
IGW-Target-Instance
)。 -
在应用程序和操作系统映像(亚马逊机器映像)中,选择 Amazon Linux 2023 AMI。
-
对于实例类型,请选择 t2.micro (符合免费套餐)。
-
对于密钥对,选择现有密钥对或新建一个密钥对。
-
对于网络设置,选择编辑和配置。
-
VPC:选择您的 VPC
-
子网,选择您的子网。
-
自动分配公共 IP:已启用
-
对于防火墙(安全组),请选择选择现有安全组和选择您的安全组。
-
-
选择启动实例。
-
重要提示:启动后,转到实例详细信息并记下网络接口 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:
-
在 EC2 控制台中,选择您的实例。
-
转到网络标签。
-
记下网络接口 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 控制台
-
在 VPC 控制台中,选择路由表。
-
选择创建路由表。
-
对于名称,输入路由表的名称(例如
IGW-Ingress-Route-Table
)。 -
对于 VPC,选择您的 VPC。
-
选择创建路由表。
-
选择路由表并选择 Edge associations(边缘关联)选项卡。
-
选择 Edit edge association (编辑边缘关联)。
-
选择您的互联网网关,然后选择保存更改。
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 控制台
-
在 VPC 控制台导航窗格中,选择路由表,然后选择您创建的路由表。
-
从 Edge associations(边缘关联)选项卡,选择 Edit edge associations(编辑边缘关联)。
-
选中互联网网关的复选框。
-
选择保存更改。
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 控制台
-
在 VPC 导航窗格中,选择路由表,然后选择您创建的互联网网关路由表。
-
单击 IPv4 池关联选项卡。
-
单击编辑关联按钮。
-
选择您的 BYOIP 池(例如)。
pool-12345678901234567
-
单击保存关联按钮。
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 控制台
-
在 VPC 控制台导航窗格中,选择路由表,然后选择您创建的互联网网关路由表。
-
依次选择 Actions (操作)、Edit routes (编辑路由)。
-
选择 Add route(添加路由)。
-
在目标中,输入您的 BYOIP CIDR 或子集(例如,)。
203.0.113.0/24
该值必须在 /23 到 /28 之间。 -
对于目标,选择网络接口并输入您的实例的 ENI ID(例如
eni-0abcdef1234567890
)。 -
选择保存更改。
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 控制台
-
使用 EC2 Instance Connect 连接到 Linux 实例
-
在 EC2 控制台中,选择您的实例。
-
选择操作 > 连接。
-
选择 EC2 实例连接选项卡。
-
选择连接。
-
-
向您的实例接口添加特定的 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 地址。接口名称可能是eth0
、ens5
或类似名称,具体取决于实例类型。 -
在 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 控制台
-
使用 EC2 Instance Connect 连接到 Linux 实例
-
在 EC2 控制台中,选择您的实例。
-
选择操作 > 连接。
-
选择 EC2 实例连接选项卡。
-
选择连接。
-
-
向您的实例接口添加特定的 BYOIP IP 地址:
首先,找到您的网络接口名称:
ip link show
然后添加 IP 地址(
ens5
替换为实际的接口名称):sudo ip addr add 203.0.113.10/32 dev ens5
注意:请替换
203.0.113.10
为您想要测试的 BYOIP 范围中的任何 IP 地址。接口名称可能是eth0
、ens5
或类似名称,具体取决于实例类型。 -
在 EC2 控制台中,禁用源/目标检查
-
选择您的实例。
-
进入网络选项卡,点击网络接口。
-
依次选择操作、更改源/目标检查、禁用。
-
AWS CLI
aws ec2 modify-network-interface-attribute \ --network-interface-id eni-0abcdef1234567890 \ --no-source-dest-check \ --region us-east-1
第 13 步:测试连接性
完成此步骤以验证互联网流量是否已通过 BYOIP 地址正确路由到您的目标实例。
-
在目标实例上,使用 tcpdump 监控传入流量:
sudo tcpdump -i any icmp
-
在另一台终端或计算机上,测试与您的 BYOIP IP 地址的连接:
ping 203.0.113.10
-
预期结果
-
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 控制台
-
打开 Amazon EC2 控制台
。 -
在 EC2 控制台导航窗格中,选择实例。
-
选择相应实例,然后依次选择 Instance state (实例状态)、Terminate instance (终止实例)。
-
选择终止进行确认。
AWS CLI
aws ec2 terminate-instances --instance-ids i-0123456789abcdef0 --region us-east-1
第 2 步 将互联网网关与 VPC 分离
完成此步骤,从您的 VPC 中分离和删除互联网网关。
AWS 控制台
-
打开 Amazon VPC 控制台
。 -
在导航窗格中,选择 Internet gateways(互联网网关)。
-
选择相应的互联网网关,然后选择 Actions, Detach from VPC (操作,与 VPC 分离)。
-
选择分离互联网网关。
-
依次选择操作、删除互联网网关。
-
选择删除互联网网关。
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 控制台
-
在 VPC 控制台中,选择您的 VPC。
-
选择要删除的 VPC,然后依次选择 Actions(操作)、Delete VPC(删除 VPC)。
-
键入
delete
进行确认,然后选择删除。
AWS CLI
aws ec2 delete-vpc --vpc-id vpc-0123456789abcdef0 --region us-east-1
注意
删除 VPC 还会删除关联的子网、路由表和安全组。
注意
您的 BYOIP 池仍可供将来使用,并且不会在此清理过程中被删除。