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)请参见服务配额。