利用VPN隧道实现本地开发人员PC和阿里云VPC的网络互通,从而实现本地开发人员PC和VPC内的HSF服务的相互调用。

背景信息

说明 本方案仅在无法使用端云联调时使用。

通过VPN在本地调试RPC服务的架构如下图所示:

VPN 本地调试 RPC 服务架构

VPN部署结构

VPN部署结构如下图所示:

VPN 部署结构
概念 说明 本文中的示例
OpenVPN Server IP VPC客户端访问VPN服务器的公网IP地址 116.62.136.60
开发人员PC IP 开发人员PC通过VPN暴露在VPC内可被路由的IP地址 192.168.255.6
开发人员PC IP网段 一个VPN服务可以连接多个VPC客户端,每个客户端都分配一个独立的IP地址,这个IP地址的可分配范围就是IP网段。 192.168.255.0/24
VPN容器网关IP 本文中OpenVPN Server使用了Docker的网桥模式,Docker网桥为OpenVpn容器分配的IP即VPN容器网关IP。 172.31.254.2
ECS 私有 IP ECS在VPC中的IP, 一个ECS对应一个私有IP。 172.16.0.86
容器 IP EDAS为每一个应用的Docker容器分配的IP地址。一个ECS上启动多个容器时会分配多个容器IP, 一个EDAS应用容器只有一个容器IP。 10.0.64.3

使用Docker在VPC内的ECS上安装OpenVPN服务器

  1. 执行docker pull kylemanna/openvpn命令,拉取OpenVPN镜像。
    拉取 OpenVpn 镜像
  2. 执行以下命令,生成配置。
    OVPN_DATA="/root/ovpn-data"
    IP="xxx.xx.xxx.xx"
    mkdir ${OVPN_DATA}
    docker run -v ${OVPN_DATA}:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u tcp://${IP}
    说明 此处的IP需要获取安装VPN的ECS的公网IP或者弹性IP(确保开发人员PC可以连接到这个IP)。
    生成 OpenVpn 配置
  3. 根据提示,执行docker run -v ${OVPN_DATA}:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki,并填写密码和CN,生成服务器证书。
    生成服务器证书
  4. 执行docker run -v ${OVPN_DATA}:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass命令,生成客户端访问证书。
    生成客户端证书
  5. 执行docker run -v ${OVPN_DATA}:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > ${OVPN_DATA}/CLIENTNAME.ovpn命令,导出客户端配置到文件CLIENTNAME.ovpn
    CLIENTNAME.ovpn
  6. 执行docker run --name openvpn -v ${OVPN_DATA}:/etc/openvpn -d -p 1194:1194 --privileged kylemanna/openvpn命令,启动VPN服务。

在本地开发人员PC上配置OpenVPN客户端

此处以Mac为例进行演示。

  1. 5获取到的CLIENTNAME.ovpn文件拖拽到Tunnelblick的配置栏中,完成配置导入。
    Tunnelblick 配置
  2. 单击连接完成VPN连接。
    VPN 连接
  3. 在客户端使用ifconfig(Mac)或ipconfig(Windows)命令获取新增加的utun网卡的IP地址,记录下来备用。

    此处获取到的IP地址为开发人员PC在VPC内的出口IP。

  4. 至此,就可以通过开发人员PC直接打开VPC内的私网IP或者EDAS容器IP提供的服务了。
    • 使用ECS私网IP访问服务:通过 ECS 私网 IP 访问服务
    • 使用EDAS容器IP访问服务:使用 EDAS 容器 IP 访问服务

配置VPC内的VPN网络路由

从VPC内的ECS到开发人员PC的网络还需要进行下面的配置才能打通。包含两种方式:打通OpenVPN宿主机到开发人员PC网络和打通集群内其他机器到开发人员PC的网络,下面将分别介绍。

  • 打通OpenVPN宿主机到开发人员PC网络
    1. 执行docker exec -ti openvpn bash,登录OpenVPN容器。
    2. 执行route -n,在OpenVPN容器内查询路由规则。
    3. 根据3中开发人员PC的IP,获取对应的路由规则中的IP地址段。

      示例中获取到的IP为192.168.255.6,对应上图中的网段为192.168.255.0/24,即Destination 192.168.255.0,子网掩码255.255.255.0.

    4. 在OpenVPN容器内执行docker exec -ti openvpn bash命令,获取eth0网卡的IP(VPN容器网关IP)。
    5. 执行route add -net 192.168.255.0 netmask 255.255.255.0 dev docker0 gw 172.31.254.2命令,添加宿主机到VPN容器的路由规则。

      以上一步获取到的IP作为网关,将上上步拿到的网段的流量转到docker0网卡。

    6. 在VPN所在宿主机执行ping 192.168.255.6命令,测试到开发人员PC的网络是否连通。
  • 打通集群内其他机器到开发人员PC的网络
    1. 登录专有网络管理控制台,增加一条路由规则,请参见添加自定义路由条目

      目标网段为开发人员PC所在IP网段:192.168.255.0/24,下一条地址为安装OpenVPN的ECS。

    2. 打开安装了VPN的ECS的防火墙,执行iptables -I FORWARD -i eth0 -o docker0 -j ACCEPT命令,配置eth0到docker0的流量。
    3. 在集群内其他ECS执行ping命令,测试到本地开发机网络。

获取EDAS环境配置信息进行Debug调试

  1. 下载云上鉴权版本的Pandora压缩包taobao-hsf.tgz

  2. 下载到本地后,执行tar -xvf taobao-hsf.tgz得到taobao-hsf.sar文件夹。

    假设文件夹目录为:/Users/jiangyu.zjy/demoSpasKey/pandora/taobao-hsf.sar

  3. 在线上EDAS环境中运行的ECS上执行cat /home/admin/.spas_key/default获取鉴权参数,并写入本地开发人员PC的文件中。

    注意 不同的命名空间配置不同,请妥善保管鉴权配置参数,避免安全风险。

    目录示例为(/Users/username/demoSpasKey/default)。

  4. 在运行着EDAS实例的ECS(需与被调试的应用在同一个命名空间内)上执行ps -ef|grep java |grep tomcat |grep project.name获取其他配置参数。

    project.name 应用ID 00de7116-d8eb-4d57-ba6a-caf6fccb7484
    ecc.id 应用实例ID df0724b3-1057-44ef-b14f-f291d562a457
    JM.CONTAINER.ID 应用Tomcat容器ID, 同应用实例ID df0724b3-1057-44ef-b14f-f291d562a457
    address.server.domain 地址服务器域名 addr-hz-internal.edas.aliyun.com
    address.server.port 地址服务器端口 8080
    configserver.client.port 注册中心开放的端口 8000
  5. 配置Consumer应用启动参数。

    pandora.location 本地taobao-hsf.sar文件夹的绝对路径 /Users/jiangyu.zjy/demoSpasKey/pandora/taobao-hsf.sar
    spas.identity 本地鉴权信息文件的绝对路径 /Users/jiangyu.zjy/demoSpasKey/default
    project.name 应用ID 00de7116-d8eb-4d57-ba6a-caf6fccb7484
    tenant.id 租户ID 5f18a6c8-da89-456e-a3e5-0eabc411d1ed
    address.server.domain 地址服务器域名 addr-hz-internal.edas.aliyun.com
    address.server.port 地址服务器端口 8080
    configserver.client.port 注册中心开放的端口 8000
    hsf.server.ip 开发人员PC IP 192.168.255.6
  6. 启动本地Consumer应用,访问线上的HSF服务。

  7. 配置Provider应用启动参数,配置内容同Consumer应用。

  8. 线上服务调用本地HSF。