如之前使用软件VPN,硬件VPN或AWS DirectConnect连接客户网络与AWS所说,要连接AWS VPC网络和客户端网络的方式有3种。之前一篇文章亚马逊云AWS搭建软件VPN(Client VPN)教程已经介绍了如何使用软件VPN的方法,下面介绍下如何使用硬件VPN。这种方式的VPN实际上是通过客户网络的硬件与亚马逊AWS VPC的VGW(Virtual Private Gateway)建立一条IPSec VPN隧道,因此也可以叫做Site to Site VPN。
因为挨踢小茶手头上没有找到可用的可以充当硬件CGW(Customer Gateway)的设备,因此先是尝试使用家里闲置的树莓派(Ubuntu内核)来做这个实验,但是以失败告终,可能是因为Ubuntu版本和配置文件不匹配造成的。然后又尝试了OpenVPN Access Server EC2实例,也以失败告终……最后没有办法,找到了著名的防火墙软件pfSense来做才成功。pfSense有很丰富的GUI界面,因此对于Linux CLI不太熟悉的朋友,使用这个软件也比较省心一些。
大致上拓扑是这样的,我在日本东京区域建立了一个VPC(192.168.0.0/16)以及一个公共网段192.168.1.0/24,模拟客户网络(图右侧)。这个VPC里面创建了一个装有pfSense的EC2实例,这个实例通过公网的Internet Gateway访问外网,同时这个EC2实例充当了CGW的角色。然后在悉尼区域建立了一个VPC(10.0.0.0/8)以及一个私有网段10.0.0.0/24(图左侧),在这个VPC内创建CGW,VGW和VPN连接,建立与客户端网络的IPsec VPN隧道。另外还在这个私有网络中创建了一台普通的Linux EC2主机,用来最后测试连通性。
这次的VPN两边的网络使用静态路由的方式进行通信,并没有使用动态路由协议BGP,挨踢小茶在亚马逊云AWS搭建基于BGP动态路由的硬件VPN(Site to Site VPN)教程中使用了BGP协议来做这个实验。
东京区域(模拟客户网络)创建VPC和EC2实例
- 创建一个新的VPC,命名为VPC1,网络地址为192.168.0.0/16
- 创建一个子网(公共网络),网络地址为192.168.1.0/24
- 创建Internet Gateway,因为创建新的VPC是不会自动创建Internet Gateway的,因此默认情况下你不能访问任何互联网上的资源。所以这里需要手动创建一个Internet Gateway
- 编辑路由表,添加一条目的地址为0.0.0.0/0的路由,下一跳指向刚刚创建的Internet Gateway。这样子子网内的主机才知道,如果访问非本地的内容,要先去Internet Gateway,然后出去因特网。
- 编辑子网,启用“Modify auto-assign IP settings",这样新创建的主机才会自动分配公网地址。也可以不启用,在创建主机的时候手动更改IP配置选项。
- 创建一个EC2实例,在AWS市场中搜索“pfsense”,Netgate公司出的就是官方版本
- 根据指引创建EC2实例,需要注意的是网络选择的时候要选择刚才创建的VPC VPC1。过大概5分钟,实例就会正常运行,并且分配公网IP地址。
悉尼区域(模拟数据中心)创建VPC,VGW和VPN连接
- 创建一个新的VPC,地址为10.0.0.0/16
- 创建这个VPC内的一个子网(私有网络),地址为10.0.0.0/24
- 创建一个VGW(Virtual Private Gateway),作为AWS VPC的VPN连接节点,这个VGW默认会包含两个公网地址作为Tunnel的连接节点
- 将这个VGW绑定到刚才创建的VPC中
- 更改子网的路由,这里选择开启Route Propagation功能,这样的话,在VGW中学到的路由(比如去往192.168.1.0/24的路由),会自动下发到子网的路由器上。因此任何这个子网的主机,都知道如果要访问192.168.1.0/24的网络,要先去VGW,然后VGW会通过VPN连接去到客户网络。如果不开启这个功能,也可以在这个网段中的路由表写一条静态路由,所有目的地址为192.168.1.0/24的下一跳地址为VGW。
- 创建客户端网关CGW(Customer Gateway),这里输入的IP地址为在东京区域创建的EC2的公网地址,本次实验选择的是静态路由的方式
- 创建一个VPN连接,自定义一个名字,然后选择刚才创建的VGW和CGW。路由方式选择静态路由,并且手动添加对端的网络,此处为192.168.1.0/24
- 下载VPN配置文件,在这里可以选择不同的厂家和平台,这里我们选择厂家是pfSense,平台也是pfSense,软件版本默认即可
- 这个配置文件是一个txt文档,里面详细介绍了如何一步一步地配置你的pfsense防火墙,里面还包含了配置所需要的所有信息。
配置pfSense防火墙的IPSec VPN
- 使用公网地址登陆pfSense防火墙(注意,要先在Security Group中允许入方向的TCP 443的端口访问。同时VPC中的NACL也需要打开相应的许可)
- 默认的账号是admin,初始密码可以从AWS管理界面中的EC2->Actions->Instance Settings->Get System Log找到
- 第一次登陆会让你更改密码
- 进入VPN ->IPSec,点击添加一个Phase 1连接
a. Disabled : uncheck
b. Key Exchange version :V1
c. Internet Protocol : IPv4
d. Interface : WAN
e. Remote Gateway: <VGW Tunnel 1的公网地址>
f. Description: <连接的描述>Phase 1 proposal (Authentication)
a. Authentication Method: Mutual PSK
b. Negotiation mode : Main
c. My identifier : My IP address
d. Peer identifier : Peer IP address
e. Pre-Shared Key: <AWS 提供的PSK>Phase 1 proposal (Algorithms)
a. Encryption algorithm : aes128
b. Hash algorithm : sha1
c. DH key group : 2
d. Lifetime : 28800 secondsAdvanced Options
a. Disable Rekey : uncheck
b. Responder Only : uncheck
c. NAT Traversal : Auto
d. Deed Peer Detection : Enable DPD
Delay between requesting peer acknowledgement : 10 seconds
Number of consecutive failures allowed before disconnect : 3 retries - 保存后退出
- 点击创建好的P1连接,点击+按钮,创建一个Phase2连接
a. Disabled :uncheck
b. Mode : Tunnel
c. Local Network : Type: LAN subnet
Address : 192.168.1.0/24
d. Remote Network : Type : Network
Address : 10.0.0.0/24
e. Description : <AWS的描述>Phase 2 proposal (SA/Key Exchange)
a. Protocol : ESP
b. Encryption algorigthms :aes128
c. Hash algorithms : sha1
d. PFS key group : 2
e. Lifetime : 3600 seconds - 保存并退出,重复以上步骤创建第二个VPN连接
验证IPSec VPN连接
点击Status->IPsec可以查看IPSec VPN的状态,可以看到这个时候,VPN连接已经成功建立了。
打开AWS Console,可以看到在VPN Connection->Tunnel Details上看到,2个Tunnel的状态已经变成了UP。
这个时候,在悉尼区域创建了一个新的EC2主机,私有地址是10.0.0.120。从pfSense(192.168.1.88)ping 10.0.0.120已经可以通了,证明客户网络和AWS的网络成功打通。
总结
pfSense防火墙可以通过插件支持BGP路由,因此也可以通过类似的方法建立基于BGP的IPSec VPN连接,或者是CloudHub架构下的多条IPSec VPN连接。如果有条件的话,还是建议使用硬件的防火墙/路由器来建立IPSec VPN连接。另外,pfSense还有一种更方便的方法配置IPSec VPN,它可以直接通过AWS Access Key ID和Secret Key调用AWS的资源,并且直接启用BGP。具体操作步骤可以参照一下AWS VPC Wizard User Guide。
文章评论
可以将pfsense做成东京region的网关吗?如果有其他的ec2 实例想访问 sydney region的机器。
@casoul 当然也是可以的,但是需要改动VPC默认路由,将默认路由指到pfsense上。并且需要考虑带宽瓶颈喔~
文章大有看点,支持!
欢迎各位大侠留言讨论