多客户端通过SSL-VPN实现网络互通

更新时间:
复制 MD 格式

使用SSL-VPN实现客户端访问VPC时,如果一个VPN网关下连接了多个客户端,除了可以实现多个客户端同时与VPC相互通信,多个客户端之间默认也支持相互通信。

场景示例

某公司因业务发展需要拓展服务器资源,公司计划在阿里云侧部署服务器以节省物理设备成本。阿里云侧服务器部署完成后,企业需要一个解决方案,满足以下网络连通诉求:

  • 本地服务器(客户端2、客户端3)与VPC内服务器可以实现私网互通以完成业务交互

  • 出差的员工(客户端1)可以远程访问公司内网(私网)所有服务器资源

SSL-VPN可以满足该企业的网络连通诉求。在VPC下创建一个VPN网关,分别在客户端1、客户端2、客户端3中安装VPN软件,经过配置后,使客户端1、客户端2、客户端3均与VPC建立SSL-VPN连接,即可快速实现客户端1、客户端2、客户端3、ECS实例之间的加密私网互通,任意两个节点之间均能相互通信,满足企业的网络连通诉求。

image

前提条件

  • 创建一个VPC实例,VPC中使用ECS部署了相关服务。

  • 客户端1、客户端2、客户端3均能够访问互联网。

操作步骤

步骤一:创建VPN网关

  1. 登录VPN网关管理控制台
  2. VPN网关页面,单击创建VPN网关

  3. VPN网关(包月)页面,根据以下信息配置VPN网关,然后单击立即购买并完成支付。

    • 地域和可用区:选择VPN网关实例的地域。 本文选择华东1(杭州)

      说明

      确保VPN网关实例的地域和VPC实例的地域相同。

    • 网关类型:需选择普通型

    • 网络类型:需选择公网

    • VPC:选择VPC实例。

    • 虚拟交换机1:从VPC实例中选择一个交换机实例。

    • 虚拟交换机2:从VPC实例中选择第二个交换机实例。

      在支持多可用区的地域,您需要从VPC实例下指定两个分布在不同可用区的交换机实例。每个交换机实例下需要拥有一个空闲的IP地址。如果交换机不满足需求,需新建交换机实例

    • IPsec-VPN关闭IPsec-VPN功能。

    • SSL-VPN开启SSL-VPN功能。

    • SSL连接数:选择需要连接的客户端的数量。

    以上仅列举本文强相关的配置,其余配置项保持默认值或为空。更多信息,请参见创建和管理VPN网关实例

  4. 返回VPN网关页面,查看创建的VPN网关实例。

    刚创建好的VPN网关实例的状态是准备中,约1~5分钟会变成正常状态。正常状态就表明VPN网关实例已完成初始化,可以正常使用。

步骤二:创建SSL服务端

  1. 在左侧导航栏,选择网间互联 - VPN - SSL服务端

  2. 在顶部菜单栏,选择SSL服务端的地域。

    说明

    需确保SSL服务端的地域和已创建的VPN网关实例的地域相同。

  3. SSL服务端页面,单击创建SSL服务端

  4. 创建SSL服务端面板,根据以下信息配置SSL服务端,然后单击确定

    • VPN网关:选择已创建的VPN网关实例。

    • 本端网段:以CIDR地址块的形式输入要访问的VPC实例的网段。本文输入192.168.0.0/16。

    • 客户端网段:以CIDR地址块的形式输入客户端访问VPC实例时使用的网段。本文输入10.0.99.0/24。

      重要
      • 客户端网段的子网掩码位数在1629位之间。

      • 请确保客户端网段与本端网段、VPC网段以及与客户端终端关联的任何路由网段均没有重叠。

      • 在指定客户端网段时,建议您使用10.0.0.0/8、172.16.0.0/12192.168.0.0/16网段及其子网网段。如果您的客户端网段需要指定为公网网段,您需要将公网网段设置为VPC的用户网段,以确保VPC可以访问到该公网网段。关于用户网段的更多信息,请参见专有网络FAQ专有网络FAQ

      • 创建SSL服务端后,系统后台会自动将客户端网段的路由添加在VPC实例的路由表中,请勿再手动将客户端网段的路由添加到VPC实例的路由表,否则会导致SSL-VPN连接流量传输异常。

      以上仅列举本文强相关的配置,其余配置项保持默认值或为空。更多信息,请参见创建和管理SSL服务端

步骤三:创建SSL客户端并下载证书

根据以下操作,分别为客户端1、客户端2、客户端3创建SSL客户端并下载证书。

  1. 在左侧导航栏,选择网间互联 - VPN - SSL客户端

  2. SSL客户端页面,单击创建SSL客户端

  3. 创建SSL客户端面板,输入SSL客户端的名称,选择已创建的SSL服务端,然后单击确定

  4. SSL客户端页面,找到已创建的SSL客户端,然后在操作列单击下载证书

    将下载的SSL客户端证书保存在您的本地,后续用于配置客户端。

步骤四:配置客户端

根据以下操作,分别为客户端1、客户端2、客户端3安装VPN软件和SSL客户端证书,然后与VPC建立SSL-VPN连接。

本文中客户端1和客户端2使用Windows Server 2025 数据中心版 64位系统,客户端3使用Ubuntu 24.04 64位系统。如果您的客户端使用的是macOS系统或Android系统,请参见配置客户端进行操作。

配置客户端1和客户端2

  1. 请下载适配您 Windows 系统版本的 OpenVPN 客户端,并根据界面提示完成安装:

  2. 将下载的 SSL 客户端证书解压,并将解压后的所有文件复制到 OpenVPN 的配置目录中。

    • 默认路径C:\Program Files\OpenVPN\config

    • 注意:如果您修改过安装路径,请复制到您实际安装目录下的 config 文件夹内。

    image

  3. 用记事本打开config.ovpn文件,末尾添加1行:disable-dco

    OpenVPN 2.6版本引入的OpenVPN 的数据通道卸载 (DCO) 功能在某些Windows系统(如Windows 10/11特定版本)上存在兼容性问题,此配置是为了关闭DCO,以解决部分设备无法连接的问题。

    image

  4. 右键单击桌面右下角托盘处的OpenVPN图标,然后单击Connect建立VPN连接。

    image

  5. 如果显示StateConnected,且分配了IP,则证明已成功建立连接。

    image

配置客户端3

  1. 登录客户端,并打开命令行窗口。

  2. 执行以下命令安装OpenVPN客户端,并创建conf目录。

    apt-get update
    apt-get install -y openvpn
    mkdir -p /etc/openvpn/conf
  3. 将已下载的SSL客户端证书解压拷贝至/etc/openvpn/conf/目录。

  4. 进入/etc/openvpn/conf/目录,执行以下命令,与VPC建立SSL-VPN连接。

    openvpn --config /etc/openvpn/conf/config.ovpn --daemon

完成上述配置后,登录VPN网关管理控制台,在SSL服务端详情页面查看系统为客户端分配的虚拟IP地址,客户端将使用虚拟IP地址与VPC通信,以及与其他客户端通信。

SSL 连接页签中,连接列表的虚拟地址列展示了各客户端获得的虚拟 IP 地址(如 10.0.99.6、10.0.99.14、10.0.99.10),所有连接状态均为运行中

步骤五:测试连通性

SSL-VPN连接成功建立后,在安全组规则或者服务器访问控制规则允许的情况下,客户端1、客户端2、客户端3、ECS实例任意两个节点之间均可以实现相互通信。本文以验证客户端1与客户端2、客户端3、ECS实例之间的连通性为例,验证客户端之间的连通性,以及客户端与VPC之间的连通性,其余连通性测试场景文档不再赘述。

说明

测试连通性前,请确保客户端1、客户端2、客户端3的访问控制规则以及ECS实例的安全组规则已经放开ICMP协议,允许客户端网段下的节点访问。

  1. 客户端1访问客户端2、客户端3、ECS实例。

    1. 登录客户端1,打开Command Prompt窗口。

    2. Command Prompt窗口执行ping <客户端虚拟IP地址或ECS IP地址> -S <客户端1虚拟IP地址>命令,指定使用客户端1虚拟IP地址分别访问客户端2、客户端3、ECS实例。

    3. 如果客户端1能收到如下所示的回复报文,则证明客户端1可以正常访问客户端2、客户端3、ECS实例。

      C:\Users\Administrator>ipconfig
      
      Windows IP 配置
      
      
      以太网适配器 以太网:
      
         连接特定的 DNS 后缀 . . . . . . . :
         本地链接 IPv6 地址. . . . . . . . : fexxx                    %3
         IPv4 地址 . . . . . . . . . . . . : 17xxx
         子网掩码  . . . . . . . . . . . . : 25xxx
         默认网关. . . . . . . . . . . . . :
      
      以太网适配器 以太网 2:
      
         连接特定的 DNS 后缀 . . . . . . . :
         本地链接 IPv6 地址. . . . . . . . : fexxx                    b8%10
         IPv4 地址 . . . . . . . . . . . . : 10.0.99.6
         子网掩码  . . . . . . . . . . . . : 255.255.255.252
         默认网关. . . . . . . . . . . . . :
      
      C:\Users\Administrator>ping 10.0.99.10 -S 10.0.99.6
      
      正在 Ping 10.0.99.10 从 10.0.99.6 具有 32 字节的数据:
      来自 10.0.99.10 的回复: 字节=32 时间=14ms TTL=128
      来自 10.0.99.10 的回复: 字节=32 时间<1ms TTL=128
      来自 10.0.99.10 的回复: 字节=32 时间<1ms TTL=128
      来自 10.0.99.10 的回复: 字节=32 时间=23ms TTL=128
      
      10.0.99.10 的 Ping 统计信息:
          数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
      往返行程的估计时间(以毫秒为单位):
          最短 = 14ms,最长 = 23ms,平均 = 16ms
      
      C:\Users\Administrator>ping 10.0.99.14 -S 10.0.99.6
      
      正在 Ping 10.0.99.14 从 10.0.99.6 具有 32 字节的数据:
      来自 10.0.99.14 的回复: 字节=32 时间=13ms TTL=64
      来自 10.0.99.14 的回复: 字节=32 时间<1ms TTL=64
      来自 10.0.99.14 的回复: 字节=32 时间<1ms TTL=64
      来自 10.0.99.14 的回复: 字节=32 时间<1ms TTL=64
      
      10.0.99.14 的 Ping 统计信息:
          数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
      往返行程的估计时间(以毫秒为单位):
          最短 = 13ms,最长 = 16ms,平均 = 13ms
      
      C:\Users\Administrator>ping 192.168.50.67 -S 10.0.99.6
      
      正在 Ping 192.168.50.67 从 10.0.99.6 具有 32 字节的数据:
      来自 192.168.50.67 的回复: 字节=32 时间=5ms TTL=63
      来自 192.168.50.67 的回复: 字节=32 时间<1ms TTL=63
      来自 192.168.50.67 的回复: 字节=32 时间=7ms TTL=63
      来自 192.168.50.67 的回复: 字节=32 时间<1ms TTL=63
      
      192.168.50.67 的 Ping 统计信息:
          数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
      往返行程的估计时间(以毫秒为单位):
          最短 = 5ms,最长 = 7ms,平均 = 5ms
  2. 分别登录客户端2、客户端3、ECS实例,执行命令测试是否可以正常访问客户端1。如果可以正常收到回复报文,则证明ECS实例、客户端2、客户端3与客户端1之间可以相互通信。

    客户端2访问客户端1

    • ipconfig:查看客户端的虚拟IP地址

    • ping <客户端1虚拟IP地址> -S <客户端2虚拟IP地址>:使用客户端2虚拟IP地址访问客户端1

    C:\Users\Administrator>ipconfig
    
    Windows IP Configuration
    
    
    Ethernet adapter Ethernet:
    
       Connection-specific DNS Suffix  . :
       Link-local IPv6 Address . . . . . : fe8xxx d1%6
       IPv4 Address. . . . . . . . . . . : 192xxx
       Subnet Mask . . . . . . . . . . . : 255xxx
       Default Gateway . . . . . . . . . : 192xxx
    
    Ethernet adapter Ethernet 2:
    
       Connection-specific DNS Suffix  . :
       Link-local IPv6 Address . . . . . : fe80xxx ac%10
       IPv4 Address. . . . . . . . . . . : 10.0.99.10
       Subnet Mask . . . . . . . . . . . : 255.255.255.252
       Default Gateway . . . . . . . . . :
    
    C:\Users\Administrator>ping 10.0.99.6 -S 10.0.99.10
    
    Pinging 10.0.99.6 from 10.0.99.10 with 32 bytes of data:
    Reply from 10.0.99.6: bytes=32 time=13ms TTL=128
    Reply from 10.0.99.6: bytes=32 time=13ms TTL=128
    Reply from 10.0.99.6: bytes=32 time=13ms TTL=128
    Reply from 10.0.99.6: bytes=32 time=13ms TTL=128
    
    Ping statistics for 10.0.99.6:
        Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    Approximate round trip times in milli-seconds:
        Minimum = 13ms, Maximum = 13ms, Average = 13ms

    客户端3访问客户端1

    • ifconfig:查看客户端的虚拟IP地址

    • ping <客户端1虚拟IP地址> -I <客户端3虚拟IP地址>:使用客户端3虚拟IP地址访问客户端1

    [root@xxx ~]# ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet xxx.xxx.xxx.55
            inet6 xxx
            ether xxx    txqueuelen 1000  (Ethernet)
            RX packets 2474679  bytes 640629531 (610.9 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 2487018  bytes 745400919 (710.8 MiB)
            TX errors 0  dropped 0  overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 136  bytes 10888 (10.6 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 136  bytes 10888 (10.6 KiB)
            TX errors 0  dropped 0  overruns 0  carrier 0  collisions 0
    
    tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
            inet 10.0.99.14  netmask 255.255.255.255  destination 10.0.99.13
            inet6 fe xxx  prefixlen 64  scopeid 0x20<link>
            unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)
            RX packets 8752  bytes 734506 (717.2 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 8884  bytes 740853 (723.4 KiB)
            TX errors 0  dropped 0  overruns 0  carrier 0  collisions 0
    
    [root@xxx ~]# ping 10.0.99.6 -I 10.0.99.14
    PING 10.0.99.6 (10.0.99.6) from 10.0.99.14 : 56(84) bytes of data.
    64 bytes from 10.0.99.6: icmp_seq=1 ttl=128 time=14.4 ms
    64 bytes from 10.0.99.6: icmp_seq=2 ttl=128 time=13.7 ms
    64 bytes from 10.0.99.6: icmp_seq=3 ttl=128 time=13.7 ms
    64 bytes from 10.0.99.6: icmp_seq=4 ttl=128 time=13.7 ms
    ^Z
    
    [2]+  Stopped                 ping 10.0.99.6 -I 10.0.99.14

    ECS实例访问客户端1

    • ifconfig:查看客户端的虚拟IP地址

    • ping <客户端1虚拟IP地址>

    [root@xxx ~]# ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.50.67  netmask 255.255.255.0  broadcast 192.168.50.255
            ether xxx  f7  txqueuelen 1000  (Ethernet)
            RX packets 958323  bytes 364771701 (347.8 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 671749  bytes 448020661 (427.2 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            loop  txqueuelen 1  (Local Loopback)
            RX packets 3  bytes 336 (336.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 3  bytes 336 (336.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    [root@xxx ~]# ping 10.0.99.6
    PING 10.0.99.6 (10.0.99.6) 56(84) bytes of data.
    64 bytes from 10.0.99.6: icmp_seq=1 ttl=127 time=9.76 ms
    64 bytes from 10.0.99.6: icmp_seq=2 ttl=127 time=5.22 ms
    64 bytes from 10.0.99.6: icmp_seq=3 ttl=127 time=5.27 ms
    64 bytes from 10.0.99.6: icmp_seq=4 ttl=127 time=5.28 ms
    ^Z
    [1]+  Stopped                 ping 10.0.99.6
    [root@iZbp13op13erqvwakinw7rZ ~]#

常见问题

如果一个VPN网关下同时存在IPsec-VPN连接和SSL-VPN连接,本地数据中心和客户端之间支持通信么?

支持。

需要在本地数据中心添加去往客户端网段的路由,在SSL服务端的本端网段中添加本地数据中心的网段。