亚马逊AWS官方博客

在 AWS 上使用 OpenVPN 搭建自定义端口的 Site-to-Site VPN

场景

1. 说明

在混合云环境下,需要打通IDC与AWS之间的网络连接,推荐使用专线Direct Connect或VPN AWS Site-to-Site VPN。
在标准VPN方案里,有些IDC端由于防火墙的限制,例如对标准VPN的UDP 500端口的禁用,导致无法使用Site-to-Site VPN。
OpenVPN可用来搭建自定义VPN,并启用Site-to-Site模式,详细介绍可参考
Site-to-site VPN routing explained in detail
本实验介绍了通过OpenVPN,并使用自定义的端口来配置Site-to-Site的VPN 连接。

2. 架构

本实验使用两个不同AWS区域的VPC,其中一个为AWS中的网络环境,另外一个模拟了客户IDC的网络环境,搭建架构如下:

对应到真实IDC的网络环境,架构如下:

3. 实验环境网络参数

AWS端网段:172.31.0.0/16
IDC端网段:192.168.0.0/24
OpenVPN Server实例公有IP:3.6.119.248;私有IP:172.31.32.36;
OpenVPN Client实例公有IP:52.77.222.47;私有IP:192.168.0.61;

AWS端配置

1. 准备AWS端OpenVPN Server的固定公网IP

在EC2控制台选中弹性IP服务,点击分配弹性IP地址,选择分配

2. 启动OpenVPN Server的EC2实例

OpenVPN在AWS Marketplace上提供了现成可用的AMI,可在启动实例的选择镜像步骤搜索openvpn,可在AWS Marketplace上找到对应的AMI。

OpenVPN提供的AMI包括了可提供不同数量客户端连接的版本,其中包括了免费的版本,可提供两个客户端连接,本实验选用的为该免费版本。

在后续步骤中选中合适的机型及其它配置项。注意在网络选择中需要将该实例放置在公有子网中,以提供IDC端的客户端连接。

在安全组的选择中,会自动生成一个默认的安全组,先保留默认配置,后面再做更新,以使用自定义的端口。

启动实例。

3. 配置OpenVPN Server的固定公网IP

将步骤1分配的EIP关联到该实例上

4. 更改OpenVPN Server的源/目标地址检查

禁用该实例的源/目标地址检查,使该实例可作为流量转发代理。
该设置是为了使OpenVPN Server实例可作为AWS端访问IDC端的流量转发代理。

5. 配置OpenVPN Server的服务

OpenVPN Server的详细配置可参考Amazon Web Services EC2 tiered appliance quick start guide

使用SSH连接该实例,用户名为openvpnas
首次登陆以后OpenVPN会自动开始初始化

初始化过程的参数都可使用默认配置,稍后可在Admin UI的网站上再修改配置。

记录下服务的Admin UI和Client UI的网址:
OpenVPN AS can be accessed via these URLs:
Admin UI: https://3.6.119.248:943/admin
Client UI: https://3.6.119.248:943/

修改用户openvpn的密码,该用户名为Admin UI的管理员用户。

6. 在OpenVPN的Admin UI配置VPN选项

使用浏览器打开Admin UI
用户名为:openvpn
密码为:上一个步骤修改的密码

选中Configuration菜单下的VPN Settings,填写VPN的虚拟网段:
该网段的IP地址会分配给连接的客户端,可选静态或动态的两种方式。

选择VPN网络路由的方式:
选用Routing的方式路由,在允许访问的子网网段内填上AWS-VPC的网段,开启允许VPN Client访问。
此项设置是为了允许OpenVPN Server做为AWS端通过VPN访问IDC端的路由转发代理。

保存配置。

7. 在OpenVPN的Admin UI配置VPN网络

选中Configuration菜单下的Networking Settings,协议模式可同时选用TCP和UDP协议,或是只开启其中一项。
修改建立VPN隧道的端口,包括TCP及UDP的端口都可自定义。
默认为TCP 945, UDP 1194.

保存修改。
此处注意需要相应地去修改Open VPN Server EC2实例的安全组,允许修改后的端口被客户端访问。
添加ICMP或其它的需要测试的入站规则。

8. 在OpenVPN的Admin UI添加客户端用户

选中User Management菜单下的User Permissions,添加用户并配置相应权限,可添加多个用户(免费版本中最多可建两个用户)。

点开新建用户的更多配置项
IP Addressing对应到步骤6里的VPN网络地址,选用静态或动态都可以。
Access Control填上可以通过VPN访问的AWS VPC端的子网网段。
VPN Gateway填上可以通过VPN访问的IDC端的子网网段。

保存设置。

9. 为AWS端路由表添加路由

选中VPC所对应的路由表,编辑路由,添加一条指向IDC网站的路由,目标为OpenVPN Server的实例。
添加步骤6里VPN网络的动态或静态网段(取决于上一步骤中客户端的用户更多设置里的IP地址模式),指向OpenVPN Server实例的ENI。

10. 在AWS端VPC内创建另一台EC2,用于VPN连接测试

可在以上步骤里更新路由的任何子网里创建实例,并将安全组的ICMP打开用于测试。

IDC端配置

1. 准备IDC端安装OpenVPN Client客户端的公网IP

注意这里是模拟IDC端的VPC内申请的EIP,服务端IP可以动态。如果是真实IDC环境,只要能访问公网即可。

2. 启动OpenVPN Client的实例

将该实例关联上公网IP,确认可以访问公网。
将该实例安全组的SSH及ICMP访问打开,用于安装OpenVPN Client及VPN测试。
确认服务端配置里VPN使用的自定义端口如8001,8002已打开。

3. 更改OpenVPN Client的源/目标检查

禁用该实例的源/目标地址检查,使该实例可作为流量转发代理。
该设置是为了使OpenVPN Client实例可作为IDC端访问AWS端的流量转发代理。

4. 更改 IDC内的路由配置

找到IDC内的需要访问AWS端网段的路由表,添加一条将访问AWS端网段的IP指向OpenVPN Client实例。
同时需要添加VPN网络的动态或静态网段(取决于客户端的用户更多设置里的IP地址模式),指向OpenVPN Client实例的ENI。

5. 在OpenVPN Client UI下载用户连接配置

Client UI: https://3.6.119.248:943/
使用浏览器打开Client UI
用户名和密码为:之前步骤在Amin UI创建客户端用户时使用的用户名和密码。

登陆OpenVPN Client UI

下载autologin profile文件 client.ovpn

6. 在OpenVPN Client实例上配置VPN

SSH连接到实例上
执行以下命令允许Client实例上做流量转发
sysctl -w net.ipv4.ip_forward=1

执行以下命令安装OpenVPN Client:
sudo yum update -y
sudo yum install openvpn

执行以下命令连接OpenVPN服务端:
sudo openvpn –config client.ovpn

不同操作系统的配置方式可能有所区别,OpenVPN Client的详细配置可参考 Connecting to Access Server with Linux

7. 测试VPN连接

打开OpenVPN的Admin UI,在Status菜单下的Current Users里可看到已连接的客户端信息。

可验证以下场景连通性:
在AWS端的OpenVPN Server的实例上可PING通位于IDC内的OpenVPN Client实例。

在AWS端的其它实例可PING通位于IDC内的OpenVPN Client实例。

在AWS端的其它实例可PING通位于IDC内的其它实例。

在IDC端的其它实例可PING通位于AWS端的其它实例。

参考资料

Site-to-site VPN routing explained in detail
Amazon Web Services EC2 tiered appliance quick start guide
Connecting to Access Server with Linux

 

本篇作者

林煜晨

AWS解决方案架构师,负责互联网行业云端架构咨询和设计。从事从年微软解决方案开发及咨询,微软认证技术专家。之前就职于汤森路透担任技术专家,参于金融数据平台设计研发,在元数据管理系统架构设计和流程自动化领域有丰富经验。