我使用 CloudFormation 向我的 VPC 添加了 VPC 端点,并允许使用 s3。路由在 AWS 控制台中可见,但在 EC2 实例的本地路由表中不可见:
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.29.4.129 0.0.0.0 UG 0 0 0 eth0
169.254.169.254 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
172.29.4.128 0.0.0.0 255.255.255.128 U 0 0 0 eth0
如何验证 VPC 中的 EC2 实例是否实际使用 S3 的 VPC 端点,而不是可用的互联网连接?
答案1
我想最直接的方法就是实际探测这些路线。
您可以跟踪路由到 s3 并查看 NAT 网关的内部 IP 是否在输出中的任何位置(例如第一跳)。
首先,检查 NAT 网关内部 IP安慰。
设置了端点的示例输出 - 未显示网关 IP。这就是您想要看到的。
$ traceroute -n -T -p 443 s3.amazonaws.com
traceroute to s3.amazonaws.com (52.216.204.93), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 52.216.204.93 0.662 ms 0.668 ms 0.637 ms
通过 NAT 到达不同目的地的示例输出(参见第一跳)
$ traceroute -n -T -p 443 serverfault.com
traceroute to serverfault.com (151.101.129.69), 30 hops max, 60 byte packets
1 172.20.10.188 0.206 ms 0.147 ms 0.145 ms
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 100.65.13.49 0.956 ms 100.65.13.113 1.253 ms *
8 52.93.28.209 1.083 ms 52.93.28.231 1.213 ms 52.93.28.235 1.151 ms
9 100.100.4.38 1.770 ms 100.100.4.46 2.089 ms 100.100.4.36 1.723 ms
10 103.244.50.242 1.136 ms 100.100.4.44 1.702 ms 2.738 ms
11 151.101.129.69 1.013 ms 103.244.50.244 1.745 ms 151.101.129.69 1.142 ms
答案2
我找到了一种验证 VPC 端点使用情况的方法。
- 登录 VPC 中的 AWS EC2 实例
- 配置 aws cli 客户端
- 运行
aws ec2 describe-prefix-lists
;Windows PowerShell,Get-EC2PrefixList
结果应包含属性中的 VPC 端点前缀列表 ID PrefixListId
。
为了进行进一步验证,您可以将以下策略应用于 S3 存储桶:
{
"Version": "2008-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::mybucket"
],
"Condition": {
"StringNotEquals": {
"aws:sourceVpc": [
"vpc-121212"
]
}
}
}
]
}
使用您的 vpc ID 而不是 vpc-121212。然后您只能从给定的 VPC 访问 S3 存储桶
答案3
您可以打开 S3 日志记录并检查文件是否从您的私有 IP 而不是公共 IP 访问。如果您的日志记录显示私有 IP 正在访问存储桶,则说明您已正确配置。祝您好运!
答案4
详细说明@m-glatki 解决方案,在存储桶上添加限制 S3 对特定 VPC 端点访问的策略:
{
"Version": "2008-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::mybucket",
"Condition": {
"StringNotEquals": {
"aws:SourceVpce": "vpce-01ab2c3d4"
}
}
}
]
}
您只能从使用 VPC 终端节点的进程中列出存储桶内容。否则,您将收到一条消息:
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
要获取 VPC 端点 ID,请使用以下命令:aws ec2 describe-vpc-endpoints
看到这个关联