亚马逊AWS官方博客

在亚马逊云科技中国区域实现基于 SSL 的远程访问 VPN

远程访问 VPN(Remote Access VPN)在云端和云下互连中有多种应用需求场景,包括:

  • 远程办公 — 员工需要在家或其他远程地点访问公司位于亚马逊云科技云端的数据中心,如:办公文档、业务系统等。
  • 分支机构与总部互连 — 企业在不同地区设有分支机构,资源存储在云端,需要在云下的分支机构和云上数据中心之间进行数据交互。
  • 传输加密 — 企业希望云上云下的传输加密,保障数据在传输中的安全。

通过远程访问 VPN,云下用户可以使用个人设备连接到公司的 VPN 服务器,经过身份验证后,建立安全的加密通道,将本地设备与公司云端网络相连。从而像在公司内部一样访问各种资源,实现远程用户灵活接入,不受地理位置限制,同时保证了数据传输的安全性和保密性,防止信息在传输过程中被窃取或篡改。

1. 远程访问 VPN 的技术选择和设计

远程访问 VPN 使用的主要技术是隧道技术,包括 IPsec 和 SSL。SSL VPN 的原理是基于 SSL(Secure Sockets Layer)或 TLS(Transport Layer Security)协议,通过在客户端和 SSL VPN 服务器之间建立安全的加密通道,实现远程用户安全访问企业内部网络资源。具体工作流程包括:

  • 远程用户通过浏览器或专用客户端发起连接,与 SSL VPN 网关服务器建立基于 HTTPS(即 SSL/TLS)的安全连接。
  • 双方通过 SSL/TLS 协议完成身份认证(包括证书认证、用户名密码、多因素认证等),确保双方身份可信。
  • 完成认证后,客户端和服务器协商生成对称会话密钥,用于加密后续的数据传输,保障数据的机密性和完整性。
  • 通过该加密隧道,用户的访问请求被安全地转发到企业内部服务器,服务器响应数据同样经过加密返回给用户。

相较于采用 IPsec,SSL VPN 的优点主要体现在以下几个方面:

  • 部署和使用更简单 — SSL VPN 通常通过标准的 HTTPS 端口(443 端口)工作。
  • 更强的跨平台兼容性 — 由于基于 SSL/TLS 协议,SSL VPN 支持多种操作系统和设备,包括移动设备,适应性更强。
  • 细粒度的访问控制 — SSL VPN 工作在应用层,能够对具体应用和数据进行更细致的访问权限管理,支持按需授权,增强安全性和灵活性。
  • 更易穿透防火墙和NAT — SSL VPN 使用 HTTPS 协议,通常更容易穿越防火墙和 NAT 设备,适合各种复杂网络环境下的远程访问。

亚马逊云科技在中国区以外的地区提供托管的云端 SSL 远程访问 VPN 服务,即 Client VPN。但在中国区,该服务还未落地,因此,对于云端的 SSL VPN 服务器在亚马逊云科技中国区的部署可以有两个选择:基于 Linux 的开源免费版本和第三方厂商提供的企业版虚拟设备。企业版虚拟设备可以在亚马逊云科技的 Marketplace 中找到虚拟设备映像,通过启动和配置相应虚拟实例来使用,比如:Cisco 提供的 ASAv、Fortinet 提供的 Fortigate NG Firewall 等。

如果企业的相关应用比较轻量,比如:部分员工可以远程访问云端数据中心或中小型企业在云端和云下按需传输数据等,可以采用基于 Linux 的开源免费的虚拟 VPN 服务器;如果企业规模较大,又有大量员工的工作模式是出差人员或居家办公人员,远程访问云端数据中心的需求量较大,则建议选择第三方厂商提供的企业版虚拟 VPN 服务器实现。因为专业厂商的设备都有接入容量建议以及售后咨询和服务保障,这更符合企业级联网的要求。本文将采用基于 Linux 开源免费的 SSL VPN 服务器设计实现。

在选择开源免费的 VPN 服务器时也有多种选择,本设计综合考虑了以下几个因素:

  • 是否能提供多种企业级的用户接入认证,包括证书认证、用户名密码、AD(Active Directory)和 Radius 认证等。
  • 是否支持企业级的客户端,包括用户描述文件的导入、多平台的支持等。
  • 是否支持访问控制功能,比如:用户接入后只能访问特定服务器网络等。

可以在 CentOS 和 Ubuntu 等 Linux 操作系统上部署的 OpenConnect VPN 服务器符合以上要求。它支持多家厂商的企业级远程访问 VPN 客户端,包括:Cisco AnyConnect(缺省选项)、Array Networks AG SSL VPN、Juniper SSL VPN、Pulse Connect Secure、Palo Alto Networks GlobalProtect SSL VPN、F5 Big-IP SSL VPN、Fortinet Fortigate SSL VPN。本文中的 VPN 客户端将采用 Cisco AnyConnect Mobility Client 实现,该客户端支持所有的操作系统平台:Windows、MacOS、Linux、iOS 和 Android。iOS 和 Android 版本的移动客户端直接可以在 App Store 中下载安装。OpenConnect 项目的详细介绍和指南请参见:https://www.infradead.org/openconnect/index.html

OpenConnect VPN 服务器将在亚马逊云科技宁夏区启用虚拟实例进行安装,设计拓扑见图 1。

图 1. 远程访问云端数据中心拓扑

远程访问用户侧采用 192.168.200.0/24 的网段,当用户发起与 OpenConnect VPN 服务器的连接请求并认证通过后,远程访问用户将获得此网段内的 IP 地址。在数据中心访问时,OpenConnect VPN 服务器将使用 NAT 将 192.168.200.0/24 网段下的用户地址映射为宁夏区相应 VPC 的 CIDR 地址段地址(本文为 172.16.1.0/24 地址段)。在远程访问用户的地址池网段的选择时,必须避免与 OpenConnect VPN 服务器以及云端数据中心其他网段的 IP 地址段重叠。

2. 远程访问云数据中心的实现

在宁夏的 VPC 内部署 OpenConnect VPN 服务器虚拟实例(OCServerA),然后通过 Cisco AnyConnect Secure Mobility Client 或 Cisco Secure Client 客户端进行连接并验证。主要配置包括以下几部分:

2.1 创建并配置 VPN 服务器

通过浏览器登录亚马逊云科技宁夏区控制平台,在 EC2 控制面板中选择“启动实例”。在亚马逊云科技 Marketplace 中搜索并选择 CentOS 操作系统映像,见图 2。

图 2. 为 VPN 服务器实例选择操作系统

启动实例完毕后,为该实例绑定 EIP(Elastic IP),以防止实例再次启动时公有IP地址发生变化。使用 SSH 客户端登陆该实例,并进行以下配置:

1. 安装 OpenConnect VPN 服务器和相关工具

sudo yum -y install epel-release		#安装EPEL软件源
sudo yum -y install ocserv			#安装OpenConnect VPN服务器
sudo yum -y install nano				#安装nano文本编辑器

注:如出现“Couldn’t resolve host name for http://mirrorlist.centos.org/”的错误提示,请修改 yum repo 配置,使用 CentOS Vault 镜像仓库或其他第三方镜像仓库。

2. 制作私钥文件和生成 CA 证书

sudo mkdir ~/ssl						#创建名为SSL的目录
sudo nano ~/ssl/ca.tmpl				#创建并编辑ca.tmpl证书模板

在 ca.tmpl 文件中写入如下内容:

cn = "sslvpn ca"
organization = "AWSome"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key

注:以上 cn 和 organization 的值为本文示例。

使用 certtool 命令生成证书私钥文件并用其与证书模板生成自签名的 CA 证书。

sudo certtool --generate-privkey --outfile ca-key.pem	 #生成私钥文件
sudo certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem 		#生成自签名的CA证书

3. 制作服务器私钥文件和生成服务器证书

sudo nano ~/ssl/server.tmpl		#创建并编辑server.tmpl证书模板

在 server.tmpl 文件中写入如下内容:

cn = "[hostname or IP address]"
organization = "AWSome"
serial = 2
expiration_days = 3650
signing_key
encryption_key
tls_www_server

注:以上 cn 的值可填入 OpenConnect VPN 服务器的公有 IP 地址。

使用 certtool 命令生成服务器私钥文件并用其与自签名 CA 证书和服务证书模板生成服务器证书。

sudo certtool --generate-privkey --outfile server-key.pem #生成服务器私钥文件
sudo certtool --generate-certificate --load-privkey server-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template server.tmpl --outfile server-cert.pem 			#使用服务器私钥文件和CA证书生成服务器证书

4. 将密钥文件和证书复制到 ocserv 所在的目录

sudo cp ~/ssl/server-cert.pem /etc/pki/ocserv/public/
sudo cp ~/ssl/server-key.pem /etc/pki/ocserv/private/
sudo cp ~/ssl/ca-cert.pem /etc/pki/ocserv/cacerts/

5. 编辑 OpenConnect 服务器的配置文件

sudo nano /etc/ocserv/ocserv.conf	#访问编辑ocserv.conf配置文件

选择或者修改以下配置文件中的选项,并将句首的 # 号删除以解除注释。

auth = "plain[passwd=/etc/ocserv/ocpasswd]"
tcp-port = 10443
udp-port = 10443
server-cert = /etc/pki/ocserv/public/server-cert.pem
server-key = /etc/pki/ocserv/private/server-key.pem
banner = "Welcome to AWS China Cloud"
ca-cert = /etc/pki/ocserv/cacerts/ca-cert.pem
ipv4-network = 192.168.200.0
ipv4-netmask = 255.255.255.0
dns = 8.8.8.8
route = default
#route = 172.16.0.0/255.255.0.0

上面的配置内容包括:

  • 远程客户端认证方式,本文采用服务器端的用户名口令认证方式。
  • SSL/TLS 连接的 TCP/UDP 端口号,缺省为 443,由于中国区 443 端口需要备案,所以改为 10443。
  • 设置客户端连接成功后弹出的欢迎界面。
  • 指定证书和密钥所在的位置。
  • 客户端的 IP 地址池。
  • 为客户端指定 DNS 地址。
  • 为客户端指定接入后允许访问的网络,“default”指所有网络。172.16.0.0 指某特定网络。

6. 创建远程访问的用户和口令

sudo ocpasswd -c /etc/ocserv/ocpasswd vpnuser1	#使用ocpasswd命令创建名称为vpnuser1的用户,并在后续提示中设置口令。

7. 配置网络和防火墙

sudo echo 1 > /proc/sys/net/ipv4/ip_forward	#启用流量转发,Linux操作系统缺省不开启端口流量转发,只能收或发。
sudo yum install firewalld firewall-config	#安装防火墙服务
sudo systemctl start firewalld.service		#启动防火墙服务
设置防火墙允许TCP/UDP的10443端口以及启用NAT转发:
sudo firewall-cmd --permanent --zone=public --add-port=10443/tcp
sudo firewall-cmd --permanent --zone=public --add-port=10443/udp
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo firewall-cmd --reload

8. 启动 OpenConnect 服务

sudo ocserv -f -d 1
sudo systemctl enable ocserv
sudo systemctl start ocserv
手工启动OpenConnect服务(可选):
sudo ocserv -c /etc/ocserv/ocserv.conf

在配置完 OpenConnect VPN 服务器后,将服务器实例所在的安全组中加入允许 10443 端口的入站策略。

2.2 远程客户端的配置

通过 Cisco 官方网站(需要 Cisco 用户账号)或者第三方网站下载“Cisco AnyConnect Secure Mobility Client 或 Cisco Secure Client”。在连接窗口中输入 OpenConnect VPN 服务器实例的公有 IP 地址,并指定“10443”端口号,输入用户名 vpnuser1 以及口令后成功建立 VPN 连接,见图 3。

图 3. 远程客户端及连接状态

成功连接了 SSL VPN 的远程客户端就可以通过私有 IP 地址访问云端主机实例和其他云端资源了。

3. 负载均衡和冗余的实现

企业级的远程访问需要服务器具有可扩展和冗余保护机制,当需要 VPN 服务器可扩展和冗余保护时,可以使用以下两种方式设计。

  • 采用多台 VPN 服务器部署,在多台 VPN 服务器前部署负载均衡器,远程用户通过访问负载均衡器的 URL 接入,由负载均衡器动态选择其后的某一台 VPN 服务器提供接入。这提高了远程服务的接入容量,同时当某台 VPN 服务器失效时,负载均衡器会将连接请求分发给其他可用的 VPN 服务器。本文将基于此方式实现。
  • 在亚马逊云科技中可以启用 DNS 服务 Route 53,然后为远程访问服务注册域名。利用 DNS 服务中的 CNAME 解析映射功能,将访问流量按照百分比分别映射到几台 VPN 服务器上,这样既分摊了访问流量又达到一定程度的可靠性。由于在中国区注册互联网可以访问的域名需要向有关部门备案审批,故本文对该方式仅在此进行说明。

在亚马逊云科技宁夏区分处同一 VPC 的不同 AZ(Availability Zone,可用区)再部署一台 OpenConnect VPN 服务器(OCServerB),并在服务器前端部署亚马逊云科技的全托管负载均衡服务 NLB(Network Load Balancer,网络负载均衡器)。

OCServerB 的配置与 OCServerA 基本相同,不同的是 OCServerB 需放置在另一个 AZ 的子网中以及 OCServerB 的 ocserv.conf 配置文件中的客户端地址池为 192.168.230.0/24(示例),见图 4。

图 4. 具有负载均衡冗余部署的远程访问架构

配置成功两台实例后,创建并配置负载均衡器。在 EC2 控制台左栏的负载均衡器下选择并创建目标组,将 OCServerA 和 OCServerB 注册到该目标组,端口号选择 TCP/UDP 10443,见图 5。

图 5. 注册目标组

选择并创建的网络负载均衡器 NLB,选择可用区 cn-northwest-1a 和 cn-northwest-1b 的两个公有子网,然后设置侦听 TCP 和 UDP 10443 端口(与 OpenConnect VPN 服务器的相关配置一致),见图 6,并转发至之前创建的目标组。

图 6. 网络负载均衡器的侦听端口和目标组

记录下 NLB 的域名为“OCservLB-e3f23bd93b20fb6e---elb---cn-northwest-1.amazonaws.com.rproxy.govskope.ca.cn”。在客户端连接对话框中输入“OCservLB-e3f23bd93b20fb6e---elb---cn-northwest-1.amazonaws.com.rproxy.govskope.ca.cn:10443”,然后建立连接。

连接后弹出用户名口令对话框,认证通过后客户端会显示之前在 ocserv.conf 文件中设置的欢迎界面。为了验证通过负载均衡器可在两台 OpenConnect VPN 服务器间实现保护切换,本设计对两台服务器设置了不同的欢迎界面。图 7 显示了冗余切换的效果。

图 7. 验证通过负载均衡器实现的冗余保护

4. 远程访问云数据中心实现结果验证

通过远程本地电脑的 Cisco AnyConnect Secure Mobility Client 远程访问客户端连接 OpenConnect VPN 服务器并成功后,客户端显示的信息可以验证本地电脑获得了 192.168.230.0/24 这个地址池中的 IP 地址,见图 8。

图 8. 远程访问客户端连接成功后的信息

在本地电脑的终端中验证本地电脑的 IP 地址同样为上图中地址,见图 9。

图 9. 本地电脑 ipconfig 验证获得的 IP 地址

在本地电脑的终端中 ping 云端 VPC 内的一台虚拟实例(172.16.1.113)成功,见图 10。

图 10. 本地电脑和云端 VPC 实例的连通性测试

在本地电脑的终端上通过 trace route 工具检测到达该云端虚拟实例的路径可以看到:第一跳是作为网关的 OpenConnect VPN 服务器,第二跳也就是终点云端虚拟实例,见图 11。

图 11. 通过 trace route 命令验证连接路径

5. 总结

在尚未提供远程访问 VPN 托管服务(Client VPN)的亚马逊云科技中国区域,本文设计实现了基于开源的 OpenConnect 项目的 SSL VPN 解决方案。该方案利用 SSL/TLS 协议的加密和认证机制,在云端数据中心和远程用户之间建立安全通道,实现远程用户通过互联网安全、便捷地访问企业内部网络和应用。同时该方案具有配置选项丰富,支持商用企业级 VPN 客户端的特点,结合亚马逊云科技的负载均衡器还可以实现可扩展且具有弹性的企业级远程访问 VPN 解决方案。

本篇作者

宁琛

亚马逊云科技资深解决方案架构师,致力于帮助初创企业在亚马逊云平台上实现业务部署。在网络通信和云计算领域有多年的实践经验,拥有亚马逊云科技多项专业技术认证以及 Cisco Certified Internetwork Expert(CCIE #4751)等网络技术相关认证。