VPC NAT网关联动私网连接(PrivateLink)可以实现云服务的反向访问。本文为您介绍同账号的云服务反向访问及其实现方式。

背景信息

随着业务的发展,越来越多的云服务,例如数据传输服务DTS(Data Transmission Service)或函数计算,需要从云服务所在专有网络VPC(Virtual Private Cloud)访问用户VPC中的资源,这种访问方式称为云服务的反向访问。为了满足云服务反向访问的需求,VPC NAT网关推出了FULLNAT规则,您可以联动PrivateLink功能共同实现云服务的反向访问。

云服务反向访问有两种常见的使用场景。
  • 场景一:云服务从其所在VPC访问用户VPC中特定网络地址的资源。例如,DTS访问用户VPC中的数据库获取数据。

    实现方式:您可以通过VPC NAT网关FULLNAT规则的普通模式联动PrivateLink功能实现反向访问。

  • 场景二:云服务从其所在VPC访问用户VPC中任意网络地址的资源。例如,函数计算访问用户VPC中的ECS实例或服务。

    实现方式:您可以通过VPC NAT网关FULLNAT规则的Gevene模式联动PrivateLink功能实现反向访问。

说明 PrivateLink支持同账号和跨账号之间的私网访问服务,本文为您介绍同账号云服务的反向访问。如果需要实现跨账号云服务反向访问,您需要在创建终端节点服务后,将需要作为反向终端节点的其他阿里云账号ID添加到终端节点服务白名单中,具体操作,请参见添加和管理服务白名单

场景示例

本文以场景一以及实现方式为例进行介绍。

某公司在德国(法兰克福)地域创建了生产VPC_1,并在VPC_1中创建了一台交换机VSW1及其下的ECS1实例。在德国(法兰克福)地域创建了用户VPC_2,并在VPC_2中创建了一台交换机VSW2及其下的ECS2实例。

由于业务发展,现在生产VPC_1中的ECS1实例需要访问用户VPC_2中的特定资源ECS2实例。场景示例

PrivateLink支持VPC NAT网关作为终端节点服务的服务资源,将终端节点服务和反向终端节点连接。结合VPC NAT网关的FULLNAT规则普通模式将VPC_1中ECS1实例的源IP地址转换为反向终端节点的接口IP地址,将VPC_2中ECS2实例的IP地址和端口映射为VPC NAT网关的NAT IP和端口,从而实现VPC_1访问VPC_2中的特定资源。

前提条件

  • 您已经在德国(法兰克福)地域创建了两个VPC,名称分别为VPC_1和VPC_2。
  • 您已经在VPC_1和VPC_2中分别创建了一台交换机,对应的名称为VSW1和VSW2。请确保VSW1和VSW2在同一个可用区。
  • 您已经在VPC_1中创建了一台用于创建VPC NAT网关的交换机,名称为VSW3。
  • 您已经在VSW1和VSW2中分别创建了一台ECS实例,对应的名称为ECS1和ECS2,均安装CentOS 8.3 64位系统。

配置流程

配置流程

步骤一:创建VPC NAT网关并开启Privatelink能力

VPC NAT网关开启了Privatelink能力之后,才可以作为终端节点服务的服务资源与反向终端节点连通,并配置FULLNAT规则实现反向访问VPC中的资源。

本文以使用Python SDK创建VPC NAT网关为例进行介绍。在创建VPC NAT网关前,请确保满足以下条件。
  • 您需要获取当前账号的AccessKey ID和AccessKey Secret。 请在阿里云控制台中的AccessKey管理页面查看您的AccessKey。
  • 您已经安装了Python环境,阿里云Python SDK支持 Python 2.6.x, 2.7.x 和 3.x及以上环境。
  1. 安装阿里云Python SDK。更多信息,请参见开始使用原版Python SDK
    支持pip和GitHub两种安装方式。
    • 使用pip安装(推荐方式)
      执行以下命令,安装Python SDK。
      pip install aliyun-python-sdk-core # 安装阿里云SDK核心库
    • 下载GitHub源码
      执行以下命令,通过GitHub安装Python SDK。
      git clone https://github.com/aliyun/aliyun-openapi-python-sdk.git
      # 安装阿里云 SDK 核心库
      cd aliyun-python-sdk-core
      python setup.py install
  2. 执行以下SDK,创建VPC NAT网关并开启Privatelink能力。
    import json
    import time
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkcore.request import CommonRequest
    
    region_id = '<region_id>'     #请替换为需要创建VPC NAT网关的地域ID,本文为eu-central-1。
    ak = '<ak>'                   #请替换为您的AccessKey ID。
    secret = '<sk>'               #请替换为您的AccessKey Secret。
    vpc_id = "<vpc_id>"           #请替换为需要创建VPC NAT网关的VPC ID,本文为VPC_1的ID。
    vswitch_id = "<vswitch_id>"   #请替换为VPC下的交换机ID,本文为VSW3的ID。
    
    sdkClient = AcsClient(ak, secret, region_id)
    
    params = {'RegionId': region_id, 'VpcId': vpc_id, 'VSwitchId': vswitch_id, 'NatType': "Enhanced", 'NetworkType': 
    "intranet", 'PrivateLinkEnabled': "true", 'PrivateLinkMode': "Fullnat"}
    request = CommonRequest(domain='vpc.aliyuncs.com', version='2016-04-28', 
    action_name="CreateNatGateway", product="Vpc")
    for tmpPKey in params.keys():    
      request.add_query_param(tmpPKey, params[tmpPKey])
    
    data = sdkClient.do_action_with_exception(acs_request=request)
    
    print(json.loads(data))
    natgw_id = json.loads(data)['NatGatewayId']
    
    while(True):    
      check = CommonRequest(domain='vpc.aliyuncs.com', version='2016-04-28', 
    action_name="DescribeNatGateways", product="Vpc")    
      check.add_query_param('NatGatewayId', natgw_id)    
      rsp = sdkClient.do_action_with_exception(check)    
      nat = json.loads(rsp)['NatGateways']['NatGateway'][0]    
      if nat['NatGatewayId'] != natgw_id:        
        print('expect %s, found %s' % (natgw_id, nat['NatGatewayId']))        
        exit(1)    
      if nat['Status'] != 'Available':        
        print("natgw %s status:%s......" % (natgw_id, nat['Status']))        
        time.sleep(5)    
      else:        
        print("natgw %s status:%s!" % (natgw_id, nat['Status']))        
        break
    系统回显结果如下,表明VPC NAT网关已经创建成功且已开启Privatelink能力。
    {'RequestId': '07E40395-F64A-3021-ACCE-96EE2DFA4168', 
       'SnatTableIds': {
         'SnatTableId': [
          'stb-gw8fp6omuclw****'
         ]
        }, 
       'ForwardTableIds': {
         'ForwardTableId': [
           'ftb-gw83v983b5a9jdpyp****'
         ]
        }, 
       'FullNatTableIds': {
       'FullNatTableId': [
         'fulltb-gw8b8xhwqyp26pm0k****'
        ]
       }, 
    'NatGatewayId': 'ngw-gw8tcfj68ts04qpi9****'}
    natgw ngw-gw8tcfj68ts04qpi9**** status:Creating......
    natgw ngw-gw8tcfj68ts04qpi9**** status:Creating......
    natgw ngw-gw8tcfj68ts04qpi9**** status:Creating......
    natgw ngw-gw8tcfj68ts04qpi9**** status:Creating......
    natgw ngw-gw8tcfj68ts04qpi9**** status:Available!
  3. 登录NAT网关管理控制台
  4. 在左侧导航栏,选择NAT网关 > VPC NAT网关
  5. VPC NAT网关页面,查看已经创建的VPC NAT网关。

步骤二:创建终端节点服务

创建VPC NAT网关作为服务资源的终端节点服务。

  1. 登录终端节点服务控制台
  2. 在顶部菜单栏处,选择需要创建终端节点服务的地域。
    本文选择德国(法兰克福)地域。
  3. 终端节点服务页面,单击创建终端节点服务
  4. 创建终端节点服务页面,根据以下信息配置终端节点服务,然后单击确定创建
    配置 说明
    服务资源类型 选择终端节点服务的资源类型,支持负载均衡CLB和VPC NAT网关作为终端节点服务。

    本文选择VPC NAT网关

    选择服务资源 选择要承载流量的可用区,然后选择与终端节点服务关联的VPC NAT网关实例。

    本文选择法兰克福 可用区A,然后选择已经创建的VPC NAT网关。

    自动接受终端节点连接 选择是否自动接受终端节点的连接请求:
    • :终端节点服务将自动接受终端节点的连接请求,通过终端节点能够访问服务。
    • :终端节点服务连接将处于已断开状态,可以手动发起连接请求。
      • 如果接受该终端节点对应的终端节点服务连接,通过终端节点将能够访问服务。
      • 如果拒绝该终端节点对应的终端节点服务连接,通过终端节点无法访问服务。
    描述 输入终端节点服务的描述信息。

    描述长度为2~256个字符,开头不能为http://https://

  5. 返回终端节点服务页面,查看已创建的终端节点服务。
    终端节点服务

步骤三:创建反向终端节点

在用户VPC_2中创建反向终端节点。

  1. 登录终端节点控制台
  2. 在顶部菜单栏处,选择需要创建反向终端节点的地域。
    本文选择德国(法兰克福)地域。
  3. 终端节点页面,单击反向终端节点页签。
  4. 反向终端节点页签,单击创建终端节点,根据以下信息配置终端节点,然后单击确定创建
    配置 说明
    节点名称 输入反向终端节点的名称。

    名称长度在2~128个字符之间,以英文字母或中文开头,可包含数字、短划线(-)和下划线(_)。

    终端节点服务 您可以通过以下两种方式设置终端节点服务:
    • 单击通过服务名称添加,然后输入终端节点服务的名称。
    • 单击选择可用服务,然后选择目标终端节点服务ID。
    说明 一个反向终端节点仅支持关联一个终端节点服务。
    专有网络 选择需要创建反向终端节点的VPC。本文选择已经创建的VPC_2。
    安全组 选择要与反向终端节点网卡关联的安全组,安全组可以管控VPC到反向终端节点网卡的数据通信。
    可用区与交换机 选择终端节点服务节点对应的可用区,然后选择该可用区内的交换机,系统会自动在该交换机下创建一个终端节点网卡。

    本文选择法兰克福 可用区A,然后选择已经创建的VSW2。

    描述 输入反向终端节点的描述信息。

    描述长度为2~256个字符,开头不能为http://https://

  5. 返回终端节点页面,单击反向终端节点页签,查看已创建的反向终端节点。
    终端节点
  6. 单击反向终端节点的ID,在详情页面的可用区与网卡页签,在弹性网卡列查看反向终端节点网卡的ID并记录该ID。
    弹性网卡

步骤四:建立反向终端节点与终端节点服务的连接

创建反向终端节点时,每个反向终端节点关联一个终端节点服务。终端节点服务接受了反向终端节点的连接请求后,反向终端节点才能与终端节点服务建立连接。

  1. 登录终端节点服务控制台
  2. 在顶部菜单栏处,选择终端节点服务的地域。
    本文选择德国(法兰克福)地域。
  3. 终端节点服务页面,找到步骤二创建的终端节点服务,然后单击终端节点服务的ID。
  4. 在终端节点服务详情页面,单击终端节点连接页签。
  5. 在终端节点列表中找到步骤三创建的反向终端节点,然后在操作列单击允许
  6. 在弹出的对话框,单击确定
    终端节点的状态由已断开转变为已连接,表示反向终端节点与终端节点服务已成功建立连接。已连接

步骤五:配置FULLNAT规则

为VPC NAT网关配置普通模式FULLNAT条目。

  1. 登录NAT网关管理控制台
  2. 在左侧导航栏,选择NAT网关 > VPC NAT网关
  3. 在顶部菜单栏处,选择VPC NAT网关的地域。
    本文选择德国(法兰克福)地域。
  4. VPC NAT网关页面,找到步骤一创建的VPC NAT网关,然后单击VPC NAT网关ID。
  5. 基本信息页签私网连接服务区域,然后在私网连接服务转化模式右侧单击编辑
  6. 私网连接服务转化模式对话框,选择普通模式
  7. 单击FULLNAT规则管理页签,然后单击创建FULLNAT条目
  8. 创建FULLNAT条目页面,根据以下信息配置FULLNAT条目,然后单击确定创建
    配置 说明
    选择NAT IP地址 选择提供FULLNAT地址转换功能的NAT IP地址。

    本文选择默认NAT IP地址。

    转换后目的IP地址 输入需要通过FULLNAT地址转换的后端IP地址。本文输入ECS2实例的IP地址。
    端口设置 配置FULLNAT端口映射的参数信息。
    • 前端端口:输入需要通过FULLNAT端口映射的前端端口。本文输入80
    • 后端端口:输入需要通过FULLNAT端口映射的后端端口。本文输入80
    • 协议类型:转发端口的协议类型,支持TCPUDP两种类型。本文选择TCP
    弹性网卡 选择反向终端节点网卡。本文选择查看并记录终端节点网卡时记录的弹性网卡。
    条目名称 设置FULLNAT条目的名称。

    名称长度在2~128个字符之间,以英文字母或中文开头,可包含数字、短划线(-)和下划线(_)。

  9. FULLNAT规则管理页签,查看创建的FULLNAT条目。
    FULLNAT规则

步骤六:测试验证

本文以安装CentOS 8.3 64位系统的ECS实例为例进行介绍。

  1. 登录VSW2下的ECS2实例。具体操作,请参见ECS连接方式概述
  2. 执行以下命令安装Apache服务。
    yum install httpd
  3. 执行以下命令启动Apache服务。
    systemctl start httpd
  4. 登录VSW1下的ECS1实例。
  5. 执行以下命令,查看ECS1实例是否能够访问ECS2例的Apache服务。
    curl <http://NAT IP地址:前端端口>
    本文执行curl http://192.168.3.17:80
    经测试,ECS1实例可以访问ECS2实例的Apache服务,即生产VPC_1的ECS1实例反向访问用户VPC_2的ECS2实例成功。html