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

背景信息

说明 推荐您使用 EDAS 提供的端云联调方案,详情请参见为 EDAS 应用设置端云互联。本方案仅在无法使用端云联调时使用。

通过 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。