通过PrivateLink私网访问OSS

私网连接(PrivateLink)在专有网络VPC与阿里云OSS服务间建立安全私有连接通道,从网络层实现原生流量隔离,有效解决数据传输安全隐患、网络地址冲突和运维管控复杂性等问题,为企业构建安全可控的云存储访问架构。

工作原理

PrivateLink通过在VPC内部创建指向阿里云OSS服务的专属私有终端节点 (Endpoint),实现访问流量全程在阿里云骨干网络内传输,避免经过公网。同时提供基于源IP的精确访问控制和VPC流日志审计能力,构建企业级数据安全防护体系。相较OSS默认提供的内网访问域名,PrivateLink提供更高级别的网络原生安全隔离和精细化管控能力,适用于以下业务场景:

业务场景

内网访问域名

PrivateLink私网连接

严格的安全合规要求

访问公共服务入口,攻击面暴露给所有VPC,安全控制主要依赖应用层策略。

收敛攻击面。入口在VPC内部,其他VPC无法发现也无法访问,流量在网络层实现原生隔离。

需要对访问来源做精细的网络层控制

无法通过安全组对访问OSS的行为进行控制,只能依赖Bucket Policy。

支持绑定安全组。可为PrivateLink终端节点配置安全组规则,精确控制哪些源IP可以访问OSS。

需要审计所有网络连接尝试

OSS访问日志只记录成功的请求,无法审计被拒绝的网络层连接尝试。

支持VPC流日志和流量镜像。可捕获并审计所有尝试访问终端节点的流量,无论成功与否。

混合云网络架构复杂,可能存在IP冲突

云服务默认占用网段100.64.0.0/10,可能与本地IDC网络规划冲突。

避免IP冲突。终端节点使用VPC网段内的IP,完全遵循自定义的IP规划,简化混合云路由配置。

支持地域

  • 可直接使用:日本(东京)、印度尼西亚(雅加达)。

  • 需通过技术支持申请开通后使用:华东1(杭州)、华东2(上海)、华北1(青岛)、华北2(北京)、华北3(张家口)、华北6(乌兰察布)、华南1(深圳)、华南2(河源)、华南3(广州)、西南1(成都)、中国香港、韩国(首尔)、新加坡、泰国(曼谷)、德国(法兰克福)、美国(硅谷)、美国(弗吉尼亚)。

配置和使用PrivateLink

通过创建终端节点建立PrivateLink私网连接,实现从VPC或本地数据中心安全访问OSS资源。

创建并验证终端节点

首先创建终端节点,建立VPCOSS间的安全私有连接通道。创建完成后通过ECS实例验证终端节点网络连通性和实际的OSS访问操作,确保配置正确且功能完整。

配置前请确保已创建专有网络和交换机,验证步骤需要ECS实例,如无现有实例可参考购买ECS实例创建按量付费实例。

步骤一:创建终端节点

  1. 前往VPC终端节点页面,点击创建终端节点。首次使用请按页面提示完成开通私网连接服务操作。

  2. 根据以下参数进行配置,未列出的配置项保持默认值即可。

    • 所属地域:选择目标OSS Bucket所在地域,如华东1(杭州)。

    • 节点名称:输入便于识别的终端节点名称,建议使用描述性命名,如privatelink-oss

    • 终端节点类型:选择接口终端节点

    • 终端节点服务:选择阿里云服务,在服务列表中选择OSS终端节点服务(服务名称以oss结尾的条目)。

      image

    • 专有网络:选择需要创建终端节点的目标专有网络,如无可用网络可单击创建专有网络新建。

    • 安全组:选择终端节点绑定的安全组,用于控制访问权限,如无合适安全组可单击创建安全组新建。

    • 可用区与交换机:选择终端节点部署的可用区和对应交换机,如无可用交换机可单击创建交换机新建。

  3. 点击确定创建,系统将自动完成终端节点创建。创建完成后,在终端节点详情页面可查看并复制终端节点服务域名,该域名将用于后续OSS访问。

    image

步骤二:验证终端节点域名

通过网络连通性测试和OSS文件下载操作验证终端节点配置正确性,确保PrivateLink私网访问网络畅通且功能完整。

  • 网络连通性验证

    使用ping命令测试终端节点域名的网络连通性,验证DNS解析和网络路径是否正常。

    ping -c 4 ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com
  • 文件下载验证

    在相同地域的ECS实例中使用ossutil工具执行实际的OSS文件下载操作,验证PrivateLink连接的功能完整性和数据传输稳定性。

    1. 安装并配置ossutil 2.0

    2. 使用终端节点域名(如ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com)访问OSS资源,以下载指定Bucket(如example-bucket)中的文件(如dest.jpg)为例:

      ossutil cp oss://example-bucket/dest.jpg /tmp/ -e ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com --addressing-style path

      命令执行成功后,终端将显示以下输出结果,表明文件下载完成,可在/tmp目录中查看下载的文件:

      Success: Total 1 object, size 134102 B, Download done:(1 files, 134102 B), avg 680.112 KiB/s
      
      0.193189(s) elapsed

增强云上VPC访问安全性

PrivateLink功能验证完成后,通过配置Bucket Policy访问策略进一步增强安全性。以下以限制只允许PrivateLink绑定的VPC访问文件为例说明配置方法,实现网络层和应用层的双重访问控制。

  1. 前往Bucket列表,单击目标Bucket。

  2. 在左侧菜单栏单击权限控制 > Bucket授权策略

  3. 单击新增授权,按照以下内容进行配置,其他参数可保持默认选项。

    • 授权用户:选择所有账号(*)

    • 授权操作:选择高级设置

    • 效力:选择拒绝

    • 操作:选择oss:GetObject

    • 条件:勾选VPC ≠,并在下拉框中选择PrivateLink绑定的VPC。

  4. 单击确定,完成Bucket Policy配置。

本地设备通过SSL-VPN接入

SSL-VPN方案通过在VPC中部署SSL-VPN网关,为单个本地设备(如开发人员工作站、移动办公设备)提供快速、灵活的VPC接入能力。设备通过SSL-VPN建立加密隧道后,即可利用已配置的PrivateLink终端节点安全访问OSS,适用于远程办公、开发测试和应急访问场景。

步骤一:创建SSL-VPN网关和本地配置

部署SSL-VPN网关并完成客户端配置,建立本地设备与VPC的加密连接。具体配置步骤请参见客户端通过SSL-VPN远程加密访问VPC

步骤二:验证PrivateLink私网访问OSS

通过连通性测试和文件下载操作验证PrivateLink私网连接配置正确性,确保私网访问链路畅通且功能完整。

  • 连通性验证

    使用ping命令测试终端节点域名的网络连通性,验证DNS解析和网络路径是否正常。

    ping -c 4 ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com
  • 文件下载验证

    ossutil

    在相同地域的ECS实例中使用ossutil工具执行实际的OSS文件操作,验证PrivateLink连接的功能完整性和数据传输稳定性。

    1. 安装并配置ossutil 2.0

    2. 使用终端节点域名(如ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com)访问OSS资源,以下载指定Bucket(如example-bucket)中的文件(如dest.jpg)为例:

      ossutil cp oss://example-bucket/dest.jpg /tmp/ -e ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com --addressing-style path

      命令执行成功后,终端将显示以下输出结果,表明文件下载完成,可在/tmp目录中查看下载的文件:

      Success: Total 1 object, size 134102 B, Download done:(1 files, 134102 B), avg 680.112 KiB/s
      
      0.193189(s) elapsed

    SDK

    SDK方式更贴近实际生产环境的使用场景,支持复杂的业务逻辑集成和异常处理机制,以下语言SDK支持通过PrivateLink私网访问OSS。

    Java

    PrivateLink访问场景下使用setSLDEnabled(true)开启路径风格(Path-style)访问模式,公网访问时请设置为setSLDEnabled(false)

    import com.aliyun.oss.*;
    import com.aliyun.oss.common.auth.*;
    import com.aliyun.oss.common.comm.SignVersion;
    import com.aliyun.oss.model.GetObjectRequest;
    import java.io.File;
    
    /**
     * OSS PrivateLink访问示例
     * 演示如何通过PrivateLink私网方式访问OSS并下载文件
     */
    public class Test {
    
        public static void main(String[] args) throws Exception {
            // PrivateLink终端节点域名
            String endpoint = "https://ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com";
    
            // 填写Endpoint对应的Region信息,例如cn-hangzhou
            String region = "cn-hangzhou";
    
            // 从环境变量中获取访问凭证
            // 运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET
            EnvironmentVariableCredentialsProvider credentialsProvider =
                    CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
    
            // 填写Bucket名称,例如example-bucket
            String bucketName = "example-bucket";
    
            // 填写不包含Bucket名称在内的Object完整路径
            String objectName = "dest.jpg";
    
            // 本地保存文件名
            String pathName = "dest.jpg";
    
            // 配置客户端参数
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
    
            // PrivateLink访问时开启Path-style访问方式(通过Bucket外网域名访问时需设置为false)
            clientBuilderConfiguration.setSLDEnabled(true);
    
            // 显式声明使用V4签名算法
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
    
            // 创建OSS客户端实例
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint(endpoint)
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region(region)
                    .build();
    
            try {
                // 下载Object到本地文件,并保存到指定的本地路径中
                // 如果指定的本地文件存在会覆盖,不存在则新建
                // 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中
                ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(pathName));
    
            } catch (OSSException oe) {
                // OSS服务端异常处理
                System.out.println("捕获OSS异常,请求已到达OSS服务端,但被拒绝并返回错误响应。");
                System.out.println("错误信息: " + oe.getErrorMessage());
                System.out.println("错误代码: " + oe.getErrorCode());
                System.out.println("请求ID: " + oe.getRequestId());
                System.out.println("主机ID: " + oe.getHostId());
    
            } catch (ClientException ce) {
                // 客户端异常处理
                System.out.println("捕获客户端异常,客户端在尝试与OSS通信时遇到严重的内部问题," +
                        "例如无法访问网络。");
                System.out.println("错误信息: " + ce.getMessage());
    
            } finally {
                // 释放资源
                if (ossClient != null) {
                    ossClient.shutdown();
                }
            }
        }
    }

    Python

    PrivateLink访问场景下使用is_path_style=True开启路径风格(Path-style)访问模式。

    # -*- coding: utf-8 -*-
    """
    OSS PrivateLink访问示例
    通过PrivateLink私网方式访问OSS并下载文件到本地
    """
    
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    
    def main():
        """主函数:演示通过PrivateLink访问OSS并下载文件"""
        
        # 配置访问凭证
        # 注意:阿里云账号AccessKey拥有所有API的访问权限,风险很高
        # 强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号
        auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
        
        # PrivateLink终端节点域名
        endpoint = 'https://ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com'
        
        # Bucket名称
        bucket_name = 'example-bucket'
        
        # 创建Bucket对象
        # is_path_style=True 用于开启路径风格访问模式,适用于PrivateLink等特定场景
        bucket = oss2.Bucket(auth, endpoint, bucket_name, is_path_style=True)
        
        # OSS对象路径(完整路径中不包含Bucket名称)
        object_name = 'dest.jpg'
        
        # 本地保存文件路径
        local_file_path = 'dest.jpg'
        
        # 下载Object到本地文件
        # 如果指定的本地文件存在会覆盖,不存在则新建
        bucket.get_object_to_file(object_name, local_file_path)
        
        print(f"文件下载成功:{object_name} -> {local_file_path}")
    
    
    if __name__ == '__main__':
        main()      

    Go

    PrivateLink访问场景下使用ForcePathStyle(true)开启路径风格(Path-style)访问模式。

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    const (
    	// PrivateLink终端节点域名
    	endpoint = "https://ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com"
    
    	// Bucket名称
    	bucketName = "example-bucket"
    
    	// OSS对象路径(完整路径中不包含Bucket名称)
    	objectName = "dest.jpg"
    
    	// 本地保存文件路径
    	localFilePath = "dest.jpg"
    )
    
    func main() {
    	// 初始化访问凭证提供者
    	// 从环境变量中获取访问凭证
    	// 运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET
    	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    	if err != nil {
    		fmt.Printf("初始化凭证提供者失败: %v\n", err)
    		os.Exit(-1)
    	}
    
    	// 创建OSS客户端实例
    	// oss.ForcePathStyle(true) 用于开启路径风格访问模式,适用于PrivateLink等特定场景
    	client, err := oss.New(
    		endpoint,
    		"", // AccessKeyId 通过凭证提供者获取
    		"", // AccessKeySecret 通过凭证提供者获取
    		oss.SetCredentialsProvider(&provider),
    		oss.ForcePathStyle(true),
    	)
    	if err != nil {
    		fmt.Printf("创建OSS客户端失败: %v\n", err)
    		os.Exit(-1)
    	}
    
    	// 获取Bucket对象
    	bucket, err := client.Bucket(bucketName)
    	if err != nil {
    		fmt.Printf("获取Bucket对象失败: %v\n", err)
    		os.Exit(-1)
    	}
    
    	// 下载Object到本地文件
    	// 如果指定的本地文件存在会覆盖,不存在则新建
    	// 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中
    	err = bucket.GetObjectToFile(objectName, localFilePath)
    	if err != nil {
    		fmt.Printf("下载文件失败: %v\n", err)
    		os.Exit(-1)
    	}
    
    	fmt.Printf("文件下载成功: %s -> %s\n", objectName, localFilePath)
    }
    

    C++

    PrivateLink访问场景下使用conf.isPathStyle = true开启路径风格(Path-style)访问模式。

    #include <alibabacloud/oss/OssClient.h>
    #include <memory>
    #include <fstream>
    #include <iostream>
    
    using namespace AlibabaCloud::OSS;
    
    int main(void)
    {
        // PrivateLink终端节点域名
        std::string Endpoint = "https://ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com";
        
        // Bucket名称
        std::string BucketName = "example-bucket";
        
        // OSS对象路径(完整路径中不能包含Bucket名称)
        std::string ObjectName = "dest.jpg";
        
        // 本地保存文件路径
        // 如果指定的本地文件存在会覆盖,不存在则新建
        // 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中
        std::string FileNametoSave = "dest.jpg";
    
        // 初始化OSS SDK网络等资源
        InitializeSdk();
    
        // 配置客户端参数
        ClientConfiguration conf;
        
        // 从环境变量中获取访问凭证
        // 运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET
        auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
        
        // 开启路径风格访问模式,适用于PrivateLink等特定场景
        conf.isPathStyle = true;
        
        // 创建OSS客户端实例
        OssClient client(Endpoint, credentialsProvider, conf);
    
        // 构建下载Object请求
        GetObjectRequest request(BucketName, ObjectName);
        
        // 设置响应流工厂,用于创建本地文件流
        request.setResponseStreamFactory([=]() {
            return std::make_shared<std::fstream>(
                FileNametoSave, 
                std::ios_base::out | std::ios_base::in | std::ios_base::trunc | std::ios_base::binary
            );
        });
    
        // 执行下载操作
        auto outcome = client.GetObject(request);
    
        // 处理下载结果
        if (outcome.isSuccess()) {
            std::cout << "文件下载成功,大小: " 
                      << outcome.result().Metadata().ContentLength() 
                      << " 字节" << std::endl;
            std::cout << "文件保存路径: " << FileNametoSave << std::endl;
        }
        else {
            // 错误处理
            std::cout << "文件下载失败" << std::endl
                      << "错误代码: " << outcome.error().Code() << std::endl
                      << "错误信息: " << outcome.error().Message() << std::endl
                      << "请求ID: " << outcome.error().RequestId() << std::endl;
            
            // 释放资源并返回错误码
            ShutdownSdk();
            return -1;
        }
    
        // 释放OSS SDK网络等资源
        ShutdownSdk();
        return 0;
    }

本地数据中心通过专线/VPN网关互联

企业数据中心可通过高速通道专线连接或VPN网关建立与阿里云VPC的网络连通,进而利用PrivateLink实现OSS私网访问。专线连接提供稳定的网络性能和带宽保障,VPN网关则提供灵活的加密连接方式,两种方案均适用于生产环境的大规模数据传输场景。详细配置方法请参见VPC连接本地数据中心/其他云

应用于生产环境

最佳实践

  • 安全组配置优化

    基于最小权限原则配置安全组规则,仅对必要的IP地址段开放终端节点访问端口,建立定期的安全规则审查机制。通过精确的源IP控制和端口限制,确保访问控制策略与业务需求保持一致,有效防范权限泛化和未授权访问风险。

  • 网络连通性监控

    开启VPC流日志功能,建立基于流量模式的异常检测机制,实时监控PrivateLink访问行为和数据传输状况。配置流量镜像功能进行深度包分析,提供网络故障快速诊断和安全威胁实时检测能力,确保私网访问的稳定性和安全性。

  • 多可用区部署

    在生产环境中跨多个可用区部署终端节点,构建容灾能力强的服务高可用架构。通过负载均衡或DNS轮询实现智能流量分发,当单个可用区发生故障时,业务流量自动切换至其他可用区的健康终端节点,确保服务连续性和业务稳定运行。

费用说明

PrivateLink按实际使用量计费,每小时出账,费用包含实例费和流量处理费。服务使用方和服务提供方可以是不同的阿里云账号,支持将费用归入指定账号进行出账。更多计费信息请参见计费说明