VPC内的实例访问云服务时(例如访问对象存储OSS),如果通过公网访问,可能会存在数据安全风险、公网网络质量不稳定等问题,同时公网访问也会产生公网流量成本。
为了解决这些问题,阿里云提供了VPC内通过私网访问云服务的能力,确保访问请求保留在阿里云的内网中,从而获得更高的安全性、更稳定的网络性能和更优的成本控制。
本文将介绍两种主流的VPC私网访问方案:网关终端节点和私网连接(PrivateLink)。
工作原理
网关终端节点 | 私网连接(PrivateLink) |
网关终端节点可以理解为VPC在访问特定云服务时的一个“虚拟网关”。 以OSS为例,工作过程如下:
| 私网连接(PrivateLink)像是在VPC和目标服务之间建立了一条“私密隧道”。 以OSS为例,工作过程如下:
|
为了让您更直观地选择,下表总结了两种方案的主要区别:
特性 | 网关终端节点 | 私网连接 (PrivateLink) |
应用场景 | 结合网关终端节点的终端节点策略与OSS的Bucket授权策略,可以降低未授权访问风险,实现双向鉴权:
| VPC通过私网安全访问云服务的标准方案,相比网关终端节点支持更多云服务类型、更多高级能力。 |
适用服务类型 | 目前仅适用于对象存储OSS。 | 适用于众多阿里云一方服务以及用户自建服务(含ISV提供的服务)。 |
VPC侧安全能力 | 仅支持终端节点策略。 | 支持安全组、网络ACL、终端节点策略。 |
组网能力 | 不支持复杂组网。可能存在云服务地址(100.x.x.x网段)冲突的问题。 | 支持复杂组网。结合VPC对等连接/云企业网、高速通道/VPN网关产品,可以实现跨地域、混合云组网。 |
运维能力 | 无 | 支持流日志,便于审计与故障排查。 |
费用 | 免费 | 收取实例费、流量处理费。 用户自建服务支持选择服务使用方付费或服务提供方付费。 |
网关终端节点
结合网关终端节点的终端节点策略与OSS的Bucket授权策略,可以降低未授权访问风险,实现双向鉴权:
源端控制:VPC侧仅允许该VPC访问指定Bucket,不允许该VPC访问其他Bucket。
目的端控制:OSS侧仅允许指定VPC访问该Bucket,不允许其他VPC访问。
控制台
创建网关终端节点并配置授权策略
开启网关终端节点的VPC、授权Bucket、在VPC内访问OSS的用户,可以分别归属于不同的阿里云账号。
注意网关终端节点仅在部分地域支持。
创建网关终端节点并配置终端节点策略。
前往专有网络控制台-网关终端节点页面,单击创建终端节点。
选择地域并自定义终端节点名称,终端节点类型保持为网关终端节点。
终端节点服务选中选择可用服务,并选中服务资源类型为对象存储OSS的终端节点服务。
选中VPC并勾选路由表。
网关终端节点完成创建后,系统会自动在选中的路由表里,增加一个自定义路由条目:目标网段为一个系统前缀列表(里面包含OSS在该地域的VIP网段),下一跳为创建的网关终端节点。
配置终端节点策略:语法与访问控制RAM产品的权限策略语言相同。
创建完成后,可以在关联路由表的自定义路由条目中,查看到一条系统自动添加的、下一跳指向网关终端节点的路由条目。
配置OSS的bucket授权策略。
前往OSS控制台-Bucket页面,单击需要配置授权的Bucket名称。
左侧导航选择权限控制 > Bucket授权策略。单击按语法策略添加,单击编辑。
配置Bucket授权策略:语法与访问控制RAM产品的权限策略语言相同。
策略配置完成后单击保存。
验证访问策略。
注意如果访问OSS的账号是RAM账号,则RAM账号本身需要授予OSS相关Bucket的操作权限,否则可能导致访问失败。
使用授权账号,在授权VPC访问授权Bucket时,访问成功。
若账号、VPC或Bucket任意一个未授权,则访问失败。
修改权限策略
可以通过修改权限策略,调整授权VPC、授权Bucket或授权账号范围。
调整授权VPC:前往OSS控制台-Bucket页面,单击目标Bucket名称,左侧导航选择权限控制 > Bucket授权策略,调整现有授权策略的
Condition
字段,增减可访问Bucket的VPC。调整授权Bucket:
前往专有网络控制台-网关终端节点页面,单击目标网关终端节点实例ID,选择终端节点策略页签,调整现有授权策略的
Resource
字段,增减VPC可访问的Bucket。前往OSS控制台-Bucket页面,单击目标Bucket名称,左侧导航选择权限控制 > Bucket授权策略,调整现有授权策略的
Resource
字段,增减可被访问的Bucket资源。如果涉及多个Bucket,在每个Bucket里均需要进行操作。
调整授权账号:
注意如果访问OSS的账号是RAM账号,则RAM账号本身需要授予OSS相关Bucket的操作权限,否则可能导致访问失败。
前往专有网络控制台-网关终端节点页面,单击目标网关终端节点实例ID,选择终端节点策略页签,调整现有授权策略的
Principal
字段,增减可在VPC内访问Bucket的账号。前往OSS控制台-Bucket页面,单击目标Bucket名称,左侧导航选择权限控制 > Bucket授权策略,调整现有授权策略的
Principal
字段,增减可在VPC内访问Bucket的账号。如果涉及多个Bucket,在每个Bucket里均需要进行操作。
绑定/解绑路由表
可以通过网关终端节点绑定/解绑路由表,控制VPC内哪些交换机通过网关终端节点访问云服务。
前往专有网络控制台-网关终端节点页面,单击目标网关终端节点实例ID。
在关联的路由表页签:
绑定新的路由表:单击关联路由表。绑定完成后,可以在关联路由表的自定义路由条目中,查看到一条系统自动添加的、下一跳指向网关终端节点的路由条目。
解绑已有路由表:单击已关联路由表右侧的解除关联。解绑后,系统添加的路由条目将会被自动移除。
删除网关终端节点
删除网关终端节点前,您需要先解绑所有已关联的路由表。
解绑所有已关联的路由表。
前往专有网络控制台-网关终端节点页面,单击目标网关终端节点实例右侧的删除。
(可选)由于Bucket中仍然存在Bucket授权策略,会限制其他VPC无法访问该Bucket。如需调整,可以前往OSS控制台-Bucket页面,单击目标Bucket名称,左侧导航选择权限控制 > Bucket授权策略,调整或删除仅允许从指定VPC访问的策略。
API
网关终端节点:
创建网关终端节点并配置终端节点策略:调用CreateVpcGatewayEndpoint接口。
创建时需要传入终端节点服务名称字段
ServiceName
,可以通过调用ListVpcEndpointServicesByEndUser接口,查询可使用的终端节点服务。PolicyDocument
字段用于配置终端节点策略,语法与访问控制RAM产品的权限策略语言相同。
修改网关终端节点策略:调用UpdateVpcGatewayEndpointAttribute接口,传入
PolicyDocument
字段。绑定路由表:调用AssociateRouteTablesWithVpcGatewayEndpoint接口。
解绑路由表:调用DissociateRouteTablesFromVpcGatewayEndpoint接口。
删除网关终端节点:调用DeleteVpcGatewayEndpoint接口。
OSS Bucket:
配置OSS的bucket授权策略:调用PutBucketPolicy接口。
修改Bucket授权策略:调用PutBucketPolicy接口,传入JSON形式的权限策略。
删除Bucket授权策略:调用DeleteBucketPolicy接口。
Terraform
配置网关终端节点:
Resources:alicloud_vpc_gateway_endpoint
注意删除网关终端节点前,您需要先解绑所有已关联的路由表。
provider "alicloud" {
region = "cn-hangzhou"
}
resource "alicloud_vpc_gateway_endpoint" "default" {
gateway_endpoint_name = "gateway-endpoint-name" # 网关终端节点名称
service_name = "com.aliyun.cn-hangzhou.oss" # OSS服务名称
vpc_id = "vpc-bp******" # 网关终端节点所属VPC
route_tables = ["vtb-bp******","vtb-bp******"] # 关联的路由表ID
# 终端节点策略
policy_document = <<EOF
{
"Version": "1",
"Statement":
[
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": ["acs:oss:*:*:examplebucket","acs:oss:*:*:examplebucket/*"],
"Principal": ["1746******"]
}
]
}
EOF
}
配置OSS的bucket授权策略:
Resources:alicloud_oss_bucket_policy
provider "alicloud" {
region = "cn-hangzhou"
}
resource "alicloud_oss_bucket_policy" "default" {
bucket = "examplebucket" # Bucket名称
policy = jsonencode({
Version = "1"
Statement = [
{
Effect = "Deny"
Action = [
"oss:ListObjects",
"oss:GetObject",
"oss:PutObject",
"oss:DeleteObject"
]
Principal = [
"*"
]
Resource = [
"acs:oss:*:*:examplebucket",
"acs:oss:*:*:examplebucket/*"
]
Condition = {
StringNotEquals = {
"acs:SourceVpc" = [
"vpc-bp******" # 请替换为实际的VPC ID
]
}
}
},{
Effect = "Allow"
Action = [
"oss:*"
]
Principal = [
"1746xxxxxx" # 请替换为实际的阿里云账号ID
]
Resource = [
"acs:oss:*:*:examplebucket",
"acs:oss:*:*:examplebucket/*"
]
Condition = {
StringEquals = {
"acs:SourceVpc" = [
"vpc-bp******" # 请替换为实际的VPC ID
]
}
}
}
]
})
}
私网连接(PrivateLink)
参考PrivateLink相关文档:
访问阿里云服务:通过PrivateLink私网访问OSS资源。
访问用户自建服务(含ISV提供的服务):通过PrivateLink跨VPC私网访问ALB、通过PrivateLink跨VPC私网访问NLB。
访问网络虚拟设备:通过GWLB快速实现IPv4流量的安全检测。
更多信息
计费说明
网关终端节点功能免费。
私网连接(PrivateLink)请参见私网连接计费说明。
支持的地域
区域 | 网关终端节点支持的地域 |
亚太-中国 | 华东1(杭州)、华东2(上海)、华北1(青岛)、华北2(北京)、华北3(张家口)、华北5(呼和浩特)、华南1(深圳)、华北6(乌兰察布)、华南2(河源)、华南3(广州)、西南1(成都)、中国香港 |
亚太-其他 | 日本(东京)、新加坡、马来西亚(吉隆坡)、印度尼西亚(雅加达) |
欧洲与美洲 | 德国(法兰克福)、英国(伦敦)、美国(硅谷)、美国(弗吉尼亚) |
中东 | 阿联酋(迪拜) |
私网连接(PrivateLink)请参见支持私网连接的地域和可用区。
配额
网关终端节点配额:
针对同一种云服务,一个VPC只能绑定一个网关终端节点,一个VPC路由表也只能关联一个网关终端节点。
一个网关终端节点可以关联多个VPC路由表。
私网连接(PrivateLink)请参见服务配额。