当我传输 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 脚本的注释中)。
Bash
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 区域):
Bash
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):
Bash
# 创建新的互联网网关路由表
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:
Bash
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 流量转发:
Bash
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 实例配置为接受除本身之外的其他目的地的流量(称为目的地/来源检查):
Bash
aws ec2 modify-instance-attribute --region $AWS_REGION \
--no-source-dest-check \
--instance-id $APPLIANCE_ID
复制代码
现在,设备已做好将流量转发到其他 EC2 实例的准备。您可以通过将浏览器(或使用 cURL
)指向应用程序实例来对此进行测试。
Bash
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 路由功能用于什么样的设备呢?
本文转载自 AWS 技术博客。
原文链接:https://amazonaws-china.com/cn/blogs/china/new-vpc-ingress-routing-simplifying-integration-of-third-party-appliances/
评论