亚马逊AWS官方博客
新功能 – VPC 入口路由 – 简化第三方设备的集成
当我传输 Architecting on AWS 类时,客户经常会问我如何配置 Amazon Virtual Private Cloud,以在云中强制实施与本地策略相同的网络安全策略。例如,扫描入侵检测系统 (IDS) 设备中的所有进站流量或在云中使用与本地防火墙相同的防火墙。截止今天,我可以提供的唯一答案是将所有流量从其 VPC 路由回本地设备或防火墙,以便在将其路由回云之前使用其常用联网齿轮检测流量。显然,这并非理想配置,它增加了延迟和复杂性。
今天,我们公布了新的 VPC 联网路由基元,以允许路由往返于互联网网关 (IGW) 或虚拟私有网关 (VGW) 与特定 Amazon Elastic Compute Cloud (EC2) 实例的弹性网络接口之间的所有传入和传出流量。这意味着,您现在可以将您的 Virtual Private Cloud 配置为在流量达到业务工作负载之前将所有流量发送至 EC2 实例。通常来说,该实例运行网络安全工具来检测或阻止可疑网络流量(例如 IDS/IPS 或防火墙),或者在将流量中继到其他 EC2 实例之前执行任何其他网络流量检测。
它的工作原理是什么?
为了了解它的工作原理,我编写了此 CDK 脚本,以创建一个具有两个公共子网的 VPC:一个子网用于设备,另一个子网用于业务应用程序。该脚本将启动两个具有公共 IP 地址的 EC2 实例,每个子网中一个。该脚本将创建以下架构:
这是常规 VPC,子网具有纸互联网网关的路由表且流量按预期流入和流出。应用程序实例托管静态网站,可通过任何浏览器对其进行访问。您可以从 EC2 控制台检索应用程序公共 DNS 名称(为方便起见,我也将 CLI 版本包含在了 CDK 脚本的注释中)。
AWS_REGION=us-west-2
APPLICATION_IP=$(aws ec2 describe-instances \
--region $AWS_REGION \
--query "Reservations[].Instances[] | [?Tags[?Key=='Name' && Value=='application']].NetworkInterfaces[].Association.PublicDnsName" \
--output text)
curl -I $APPLICATION_IP
配置路由
要配置路由,您需要了解 VPC ID、连接至设备实例的 ENI ID 以及互联网网关 ID。假定您已使用我提供的 CDK 创建了基础设施,以下是我用于查找这三个 ID 的注释(务必调整您使用的 AWS 区域):
AWS_REGION=us-west-2
VPC_ID=$(aws cloudformation describe-stacks \
--region $AWS_REGION \
--stack-name VpcIngressRoutingStack \
--query "Stacks[].Outputs[?OutputKey=='VPCID'].OutputValue" \
--output text)
ENI_ID=$(aws ec2 describe-instances \
--region $AWS_REGION \
--query "Reservations[].Instances[] | [?Tags[?Key=='Name' && Value=='appliance']].NetworkInterfaces[].NetworkInterfaceId" \
--output text)
IGW_ID=$(aws ec2 describe-internet-gateways \
--region $AWS_REGION \
--query "InternetGateways[] | [?Attachments[?VpcId=='${VPC_ID}']].InternetGatewayId" \
--output text)
为了通过我的设备路由所有传入流量,我创建了一个互联网网关路由表,并随附了一个规则,以将所有流量导向至 EC2 实例弹性网络接口 (ENI):
# 创建新的互联网网关路由表
ROUTE_TABLE_ID=$(aws ec2 create-route-table \
--region $AWS_REGION \
--vpc-id $VPC_ID \
--query "RouteTable.RouteTableId" \
--output text)
# 为指向设备 ENI 的 10.0.1.0/24 创建路由
aws ec2 create-route \
--region $AWS_REGION \
--route-table-id $ROUTE_TABLE_ID \
--destination-cidr-block 10.0.1.0/24 \
--network-interface-id $ENI_ID
# 将路由表关联至互联网网关
aws ec2 associate-route-table \
--region $AWS_REGION \
--route-table-id $ROUTE_TABLE_ID \
--gateway-id $IGW_ID
或者,我可以使用新的边缘关联选项卡下面的 VPC 控制台。
为了通过设备路由所有应用程序传出流量,我替换了应用程序子网的默认路由,以指向设备的 ENI:
SUBNET_ID=$(aws ec2 describe-instances \
--region $AWS_REGION \
--query "Reservations[].Instances[] | [?Tags[?Key=='Name' && Value=='application']].NetworkInterfaces[].SubnetId" \
--output text)
ROUTING_TABLE=$(aws ec2 describe-route-tables \
--region $AWS_REGION \
--query "RouteTables[?VpcId=='${VPC_ID}'] | [?Associations[?SubnetId=='${SUBNET_ID}']].RouteTableId" \
--output text)
# 删除现有的默认路由(指向互联网网关的路由)
aws ec2 delete-route \
--region $AWS_REGION \
--route-table-id $ROUTING_TABLE \
--destination-cidr-block 0.0.0.0/0
# 创建指向设备 ENI 的默认路由
aws ec2 create-route \
--region $AWS_REGION \
--route-table-id $ROUTING_TABLE \
--destination-cidr-block 0.0.0.0/0 \
--network-interface-id $ENI_ID
aws ec2 associate-route-table \
--region $AWS_REGION \
--route-table-id $ROUTING_TABLE \
--subnet-id $SUBNET_ID
或者,我可以使用 VPC 控制台。在正确的路由表内,选择路由选项卡并单击编辑路由,替换默认路由(指向 0.0.0.0/0
的路由),以指向设备的 ENI。
现在,我已完成路由配置。新的路由类似于:
配置设备实例
最后,我将设备实例配置为转发其接收的所有流量。您的软件设备通常会为您完成此操作,因此,当您使用 AWS Marketplace 设备时无需其他额外步骤。使用纯 Linux 实例时,需要执行两个额外的步骤:
1.连接到 EC2 设备实例并配置内核中的 IP 流量转发:
APPLIANCE_ID=$(aws ec2 describe-instances \
--region $AWS_REGION \
--query "Reservations[].Instances[] | [?Tags[?Key=='Name' && Value=='appliance']].InstanceId" \
--output text)
aws ssm start-session --region $AWS_REGION --target $APPLIANCE_ID
##
## once connected (you see the 'sh-4.2$' prompt), type:
##
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
exit
2.将 EC2 实例配置为接受除本身之外的其他目的地的流量(称为目的地/来源检查):
aws ec2 modify-instance-attribute --region $AWS_REGION \
--no-source-dest-check \
--instance-id $APPLIANCE_ID
现在,设备已做好将流量转发到其他 EC2 实例的准备。您可以通过将浏览器(或使用 `cURL`)指向应用程序实例来对此进行测试。
APPLICATION_IP=$(aws ec2 describe-instances --region $AWS_REGION \
--query "Reservations[].Instances[] | [?Tags[?Key=='Name' && Value=='application']].NetworkInterfaces[].Association.PublicDnsName" \
--output text)
curl -I $APPLICATION_IP
为了验证流量是否真正流经设备,您可以再次在实例上启用来源/目的地检查(结合使用 --source-dest-check
参数及上面的 modify-instance-attribute
CLI 命令)。当来源/目的地检查启用时,流量将受阻。
清理
如果您使用我在本文中提供的 CDK 脚本,请务必在完成后运行 cdk destroy
。这可确保不会为我在此演示中使用的两个 EC2 实例向您收费。由于我在 AWS CloudFormation 背后修改了路由表,因此,我需要手动删除路由表、子网和 VPC。最简单的方法是导航至 VPC 控制台,选择 VPC 并单击操作 => 删除 VPC。控制台将按照正确的顺序删除所有组件。在控制台能够删除 VPC 之前,您可能需要在 cdk destroy
结束后等待 5-10 分钟。
来自我们的合作伙伴
在这些新路由功能的测试版测试过程中,我们授予了对 AWS 合作伙伴集合的早期访问权限。他们为我们提供了大量有帮助的反馈。以下是他们为分享其经验而撰写的部分博客文章(我将在其发布时更新本文及链接):
- 128 Technology
- Aviatrix
- Checkpoint
- Cisco
- Citrix
- FireEye
- Fortinet
- HashiCorp
- IBM Security
- Lastline
- Netscout
- Palo Alto Networks
- ShieldX Networks
- Sophos
- Trend Micro
- Valtix
- Vectra AI
- Versa Networks
可用性
使用 Virtual Private Cloud 入口路由无需额外费用。它已在所有区域推出(包括 AWS GovCloud(美国西部)),您可以立即开始使用。
您可以在更新的 VPC 文档中了解与网关路由表相关的更多信息。
您会将这一新的 VPC 路由功能用于什么样的设备呢?