使用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实例之间的加密私网互通,任意两个节点之间均能相互通信,满足企业的网络连通诉求。
前提条件
操作步骤
步骤一:创建VPN网关
- 登录VPN网关管理控制台。
-
在VPN网关页面,单击创建VPN网关。
在VPN网关(包月)页面,根据以下信息配置VPN网关,然后单击立即购买并完成支付。
地域和可用区:选择VPN网关实例的地域。 本文选择华东1(杭州)。
说明确保VPN网关实例的地域和VPC实例的地域相同。
网关类型:需选择普通型。
网络类型:需选择公网。
VPC:选择VPC实例。
虚拟交换机1:从VPC实例中选择一个交换机实例。
虚拟交换机2:从VPC实例中选择第二个交换机实例。
在支持多可用区的地域,您需要从VPC实例下指定两个分布在不同可用区的交换机实例。每个交换机实例下需要拥有一个空闲的IP地址。如果交换机不满足需求,需新建交换机实例。
IPsec-VPN:关闭IPsec-VPN功能。
SSL-VPN:开启SSL-VPN功能。
SSL连接数:选择需要连接的客户端的数量。
以上仅列举本文强相关的配置,其余配置项保持默认值或为空。更多信息,请参见创建和管理VPN网关实例。
返回VPN网关页面,查看创建的VPN网关实例。
刚创建好的VPN网关实例的状态是准备中,约1~5分钟会变成正常状态。正常状态就表明VPN网关实例已完成初始化,可以正常使用。
步骤二:创建SSL服务端
-
在左侧导航栏,选择网间互联 - VPN - SSL服务端。
在顶部菜单栏,选择SSL服务端的地域。
说明需确保SSL服务端的地域和已创建的VPN网关实例的地域相同。
-
在SSL服务端页面,单击创建SSL服务端。
在创建SSL服务端面板,根据以下信息配置SSL服务端,然后单击确定。
VPN网关:选择已创建的VPN网关实例。
本端网段:以CIDR地址块的形式输入要访问的VPC实例的网段。本文输入192.168.0.0/16。
客户端网段:以CIDR地址块的形式输入客户端访问VPC实例时使用的网段。本文输入10.0.99.0/24。
重要客户端网段的子网掩码位数在16至29位之间。
请确保客户端网段与本端网段、VPC网段以及与客户端终端关联的任何路由网段均没有重叠。
在指定客户端网段时,建议您使用10.0.0.0/8、172.16.0.0/12和192.168.0.0/16网段及其子网网段。如果您的客户端网段需要指定为公网网段,您需要将公网网段设置为VPC的用户网段,以确保VPC可以访问到该公网网段。关于用户网段的更多信息,请参见专有网络FAQ和专有网络FAQ。
创建SSL服务端后,系统后台会自动将客户端网段的路由添加在VPC实例的路由表中,请勿再手动将客户端网段的路由添加到VPC实例的路由表,否则会导致SSL-VPN连接流量传输异常。
以上仅列举本文强相关的配置,其余配置项保持默认值或为空。更多信息,请参见创建和管理SSL服务端。
步骤三:创建SSL客户端并下载证书
根据以下操作,分别为客户端1、客户端2、客户端3创建SSL客户端并下载证书。
-
在左侧导航栏,选择网间互联 - VPN - SSL客户端。
-
在SSL客户端页面,单击创建SSL客户端。
在创建SSL客户端面板,输入SSL客户端的名称,选择已创建的SSL服务端,然后单击确定。
在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
请下载适配您 Windows 系统版本的 OpenVPN 客户端,并根据界面提示完成安装:
Windows 64位系统(Intel/AMD):OpenVPN客户端(Windows 64位)。
Windows ARM64系统:OpenVPN客户端(Windows ARM64)。
将下载的 SSL 客户端证书解压,并将解压后的所有文件复制到 OpenVPN 的配置目录中。
默认路径:
C:\Program Files\OpenVPN\config注意:如果您修改过安装路径,请复制到您实际安装目录下的 config 文件夹内。

用记事本打开
config.ovpn文件,末尾添加1行:disable-dco。OpenVPN 2.6版本引入的OpenVPN 的数据通道卸载 (DCO) 功能在某些Windows系统(如Windows 10/11特定版本)上存在兼容性问题,此配置是为了关闭DCO,以解决部分设备无法连接的问题。

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

如果显示State为Connected,且分配了IP,则证明已成功建立连接。

配置客户端3
登录客户端,并打开命令行窗口。
执行以下命令安装OpenVPN客户端,并创建
conf目录。apt-get update apt-get install -y openvpn mkdir -p /etc/openvpn/conf将已下载的SSL客户端证书解压拷贝至/etc/openvpn/conf/目录。
进入/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访问客户端2、客户端3、ECS实例。
登录客户端1,打开Command Prompt窗口。
在Command Prompt窗口执行
ping <客户端虚拟IP地址或ECS IP地址> -S <客户端1虚拟IP地址>命令,指定使用客户端1虚拟IP地址分别访问客户端2、客户端3、ECS实例。如果客户端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、客户端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.14ECS实例访问客户端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服务端的本端网段中添加本地数据中心的网段。