AWS使用AWS Client VPN 访问云上VPC 内网资源
一、背景和架构
AWS Client VPN是一种基于客户端的托管VPN服务,让您能够安全地访问云上资源或借助云作为网络通道访问其他资源。AWS Client VPN具有专用的VPN客户端,也支持使用OpenVPN作为客户端。
注意:AWS Client VPN只能用于企业海外员工到附近的海外AWS区域的访问接入,不可用于跨境访问。跨境需求需要申请符合相关法律规定的具有资质的跨境专线。
与云上自行部署Client VPN相比,AWS Client VPN除了具有运维管理的便捷性之外,还可以用于与没有Internet Gateway的VPC内网互联实现对云上私密数据的访问,且访问VPN同时不影响客户端本机的互联网访问。如下图架构所示。
在上图中,位于海外区域的远程用户希望访问云上的VPC内的应用,且出于合规安全考虑云上的VPC是一个没有关联Internet Gateway、也没有外网路由的内部VPC。此时AWS Client VPN支持通过ENI方式将流量注入到VPC内实现访问。同时,为了确保客户端能对其他Internet网络正常访问,本方案将使用AWS Client VPN 的 Split-tunnul 功能分离网络流量,允许去往非VPC的流量直接从客户端对外发出而不经过VPN。本文描述此场景下的配置过程。
二、创建 AWS Client VPN 需要的证书
AWS Client VPN 使用的是OpenVPN协议,身份认证方式支持微软AD认证和SSL证书认证等方式。本文采用证书方式认证进行配置。
1 、创建CA和服务器证书以及客户端证书,导出证书并上传到 ACM 上
首先在海外AWS区域创建一个EC2,建议使用Amazon Linux 2系统,在其上配置AWSCLI工具和对应的AKSK,使其具有AWS Certificate Manager(ACM)服务操作权限。
执行如下命令生成CA证书。注意最后一个命令执行后,需要输入证书使用的域名。
git clone https://github.com/OpenVPN/easy-rsa.git
cd easy-rsa/easyrsa3
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa build-server-full server nopass 【中途输入yes】
./easyrsa build-client-full all.man.use nopass 【中途输入yes】
mkdir ~/custom_folder/
cp pki/ca.crt ~/custom_folder/
cp pki/issued/server.crt ~/custom_folder/
cp pki/private/server.key ~/custom_folder/
cp pki/issued/all.man.use.crt ~/custom_folder
cp pki/private/all.man.use.key ~/custom_folder/
cd ~/custom_folder/
2、导出证书并上传到 ACM 上
本地上传证书
需要aws的token具有证书管理员权限
aws acm import-certificate --certificate fileb://server.crt --private-key fileb://server.key --certificate-chain fileb://ca.crt --region ap-northeast-1
aws acm import-certificate --certificate fileb://all.man.use.crt --private-key fileb://all.man.use.key --certificate-chain fileb://ca.crt --region ap-northeast-1
返回CertificateArn信息则表示成功。
3 **、**生成单个用户登陆证书【需要为每个用户设置单独的证书提供使用】
cd /home/ec2-user/config/vpn/easy-rsa/easyrsa3
./easyrsa build-client-full jack.man.use nopass
cp pki/issued/jack.man.use.crt ~/custom_folder
cp pki/private/jack.man.use.key ~/custom_folder/
cd ~/custom_folder/
aws acm import-certificate --certificate fileb://jack.man.use.crt --private-key fileb://jack.man.use.key --certificate-chain fileb://ca.crt --region ap-northeast-1
然后需要修改客户端的连接密钥文件才能远程连接
4、续订服务器证书【参考】
因为生成的证书每隔一年会到期,所以到一年后需要续订
$ ./easyrsa renew server nopass
$ mkdir ~/custom_folder2
$ cp pki/ca.crt ~/custom_folder2/
$ cp pki/issued/server.crt ~/custom_folder2/
$ cp pki/private/server.key ~/custom_folder2/
$ cd ~/custom_folder2/
$ aws acm import-certificate --certificate fileb://server.crt --private-key fileb://server.key --certificate-chain fileb://ca.crt
三、创建 AWS Client VPN 终端节点
1 、创建 Endpoint 终端节点
进入对应区域的VPC服务界面,在左侧菜单中找到Client VPN Endpoints,点击进入,并点击新建,如下截图。
在创建界面上填写VPN服务名称、描述信息,并设置IP地址段。IP地址段是AWS Client VPN 服务器与客户端之间的一个私有网络,这个地址段的子网掩码范围/12和/22之间,且地址不能与客户端本地或云上VPC冲突。例如本文使用10.88.0.0/16
作为地址段。
然后在下方的服务器证书位置,选择ACM中包含的server证书。如下截图。
在客户端认证选项中,选择Use mutual authentication
使用证书双向认证,然后在Client证书选择框中,选择ACM中包含的client证书。如下截图。
接下来将页面向下移动。在DNS位置留空,VPN 服务器将不强制推送DNS服务器。在对接企业AD场景下如果有需要的话可推送自己的DNS。在传输协议位置保持默认的UDP协议。在Enable split-tunnel位置,选中这个选项,表示客户端将把去往AWS的流量和本地互联网流量分离。由此不需要所有流量都经过VPN处理。接下来选择安全组为本VPC默认的安全组,默认的安全组规则是对外出栈放行,对内入栈禁止所有。如下截图。
页面继续向下移动,在页面下方,选中Do you want to enable Client Login Banner text
的选项,并设置一段文本,可以在VPN连接过程中显示这个文本信息。最后点击右下角创建按钮。如下截图。
至此创建Client VPN Endpoint完成。
2 、绑定子网
进入创建好的AWS Client VPN Endpoint界面,找到第二个标签页Associations
,点击Associate
按钮。如下截图。
在弹出的绑定子网界面中,选中AWS Client VPN 要连接的子网。首先选择VPC和第一个子网。然后点确定。如下截图。
重复以上步骤,将两个子网都绑定到AWS Client VPN。如下截图。
接下来需要等待几分钟,等待黄色的Associating
字样变成绿色的Associated
。如下截图。
3 、绑定策略
进入创建好的AWS Client VPN Endpoint界面,找到第四个标签页Authorization
授权界面。点击Authorize Ingress
按钮。如下截图。
输入AWS Client VPN要访问的VPC的CIDR,例如本文的VPC地址段是10.1.0.0/16
,然后点击授权。如下截图。
至此VPC服务器端配置完成。
四、获取客户端配置文件并修改配置
1 、下载客户端配置文件
在上一步完成操作的界面,点击页面中间蓝色的按钮Download Client Configuration
,获取客户端配置文件。
这样将在下载目录中打开名为downloaded-client-config.ovpn
的文件,接下来使用任意文本编辑器修改其配置。
2 、设置客户端证书
接上一步,打开扩展名为ovpn的配置文件,在最后增加如下两段内容:
<cert>
这里粘贴上前文生成的客户端密钥username.domain.tld.crt的内容
</cert>
<key>
这里粘贴上前文生成的客户端密钥username.domain.tld.key的内容
</key>
3 、设置访问域名
接上一步,找到配置文件中开头部分如下一行。
remote cvpn-endpoint-05ba461a63c340555.prod.clientvpn.eu-central-1.amazonaws.com 443
在其前方增加一个子域名,使用前边申请证书的子域名即可,例如username.domain.tld。如下配置。
remote username.cvpn-endpoint-05ba461a63c340555.prod.clientvpn.eu-central-1.amazonaws.com 443
保存退出,至此本用户的客户端配置文件修改完成。现在需要将此文件复制到要连接VPN的客户机上。
请注意,今后每增加一个新的用户,都需要新制作这样一个客户端配置文件。由此,当单个用户需要注销的时候,只要在ACM服务内注销掉用户对应的客户端证书即可。
五、下载客户端并连接 VPN
在要使用VPN的客户机上下载AWS Client VPN 客户端对应的操作系统的版本,包括Windows、Linux和MacOS的支持。如下截图。
AWS Client VPN Download | Amazon Web Services
安装完成后启动客户端。点击菜单上的File命令,然后点击Manage Profiles按钮管理配置文件。如下截图。
点击添加按钮,再选择前文编辑完成的客户端配置文件,然后点击Add Profile按钮完成添加。如下截图。
添加配置文件完成。此时可以准备开始连接了。如下截图。
连接成功后,使用cmd去ping在VPC内网的环境,可看到ping成功。如下截图。
此外,通过AWS控制台上Client VPN界面的Connections标签页,也可以看到当前连接的客户端。如下截图。
在前文配置VPN过程中已经将Split-tunnel选项设置为Enable启用状态,所以只有去往VPC中的流量才会通过VPN传输,其他流量将从客户本地网络上直接访问互联网。由于本次配置的云上VPC是没有Internet Gateway的,因此当您连接到Client VPN后能同时访问VPC和访问Internet,就意味着启用了Split-tunnel分流功能工作正常。
至此配置完成。