全部产品
云市场

通过 VPN 在本地调试 RPC 服务

更新时间:2019-04-30 13:40:29

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

说明:推荐您使用 EDAS 提供的端云联调方案,详情请参见 IntelliJ IDEA 插件端云互联Eclipse 插件端云互联。本方案仅在无法使用端云联调时使用。

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

网络架构

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. 拉取 OpenVpn 镜像。

    docker pull kylemanna/openvpn

    2

  2. 生成配置。

    此处的 IP 需要获取安装 VPN 的 ECS 的公网 IP 或者弹性 IP(确保开发人员 PC 可以连接到这个 IP)。以 116.62.136.60 为例。

    1. OVPN_DATA="/root/ovpn-data"
    2. IP="116.62.136.60"
    3. mkdir ${OVPN_DATA}
    4. docker run -v ${OVPN_DATA}:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u tcp://${IP}

    2

  3. 根据提示,填写密码和 CN,生成服务器证书。

    1. docker run -v ${OVPN_DATA}:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki

    4

    5

  4. 生成客户端访问证书。

    1. docker run -v ${OVPN_DATA}:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass

    6

  5. 导出客户端配置到文件 CLIENTNAME.ovpn。

    1. docker run -v ${OVPN_DATA}:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > ${OVPN_DATA}/CLIENTNAME.ovpn

    7

  6. 启动 VPN 服务。

    1. docker run --name openvpn -v ${OVPN_DATA}:/etc/openvpn -d -p 1194:1194 --privileged kylemanna/openvpn

    9

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

此处以 Mac 为例进行演示。

  1. 将上面<<导出客户端配置到文件 CLIENTNAME.ovpn>>章节获取到的 CLIENTNAME.ovpn 文件拖拽到 Tunnelblick 的配置栏中,完成配置导入。

    10

  2. 单击链接完成 VPN 连接。

    11

    12

  3. 在客户端使用 ifconfig(Mac)/ipconfig(Windows) 命令获取新增加的 utun 网卡的 IP 地址,记录下来备用

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

    13

    至此,就可以通过开发人员 PC 直接打开 VPC 内的私网 IP 或者 EDAS 容器 IP 提供的服务了。

    • 在开发人员 PC 使用 ECS 私网 IP 访问服务:

      14

    • 在开发人员 PC 使用 EDAS 容器 IP 访问服务:

      15

通过 VPN 隧道我们完成了从开发人员 PC 到 VPC 内的网络互通。

从 VPC 内的 ECS 到开发人员 PC 的网络还需要进行下面的配置才能打通。

配置 VPC 内的 VPN 网络路由

打通 OpenVPN 宿主机到开发人员 PC 网络

  1. 登录 OpenVPN 容器。

    1. docker exec -ti openvpn bash
  2. 在 OpenVPN 容器内查询路由规则。

    1. route -n

    16

  3. 根据<<获取开发人员 PC 在 VPC 内的出口 IP>>章节中获取的开发人员 PCIP,获取对应的路由规则中的 IP 地址段(开发人员 PC IP网段)。

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

  4. 在 OpenVPN 容器内获取 eth0 网卡的 IP (VPN 容器网关 IP)。

    17

  5. 添加宿主机到 vpn 容器的路由规则。

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

    1. route add -net 192.168.255.0 netmask 255.255.255.0 dev docker0 gw 172.31.254.2

    18

  6. 在 VPN 所在宿主机测试到开发人员 PC 的网络是否连通。

    1. ping 192.168.255.6

    20

打通集群内其他机器到开发人员 PC 的网络

  1. 打开 VPC 的路由表,增加一条路由规则。

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

    21

  2. 打开安装了 VPN 的 ECS 的防火墙 eth0 到 docker0 的流量。

    1. iptables -I FORWARD -i eth0 -o docker0 -j ACCEPT

    22

  3. 在集群内其他 ECS 测试到本地开发机网络。

    23

获取 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/jiangyu.zjy/demoSpasKey/default)。

    25

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

    26

    参数名称 含义 示例
    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

    27

  6. 启动本地 Consumer 应用,访问线上的 HSF 服务。

    29

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

    30

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

    31

    32

总结

通过 VPN 隧道将本地开发人员的 PC 和云上 VPC 内的网络打通后,就可以实现本地调用线上 HSF,线上调用本地 HSF 等场景。可以满足云上大型分布式系统的本地调试要求,再也不需要通过增加日志来进行调试了。