Aws Site To Site Vpn With On Premise Openswan Or Libreswan
简介:本文介绍了openswan连接AWS Site to Site VPN的过程供参考。
前置知识:网络路由、网络协议、IPSec VPN、Linux系统等。请自行学习。
AWS Site to Site VPN 介绍
AWS site to site VPN 是用来连接私有IDC网络与AWS VPC的一种低成本方案。其中AWS端由AWS提供托管服务,客户段可以采用Cisco等路由器设备,也可以采用Openswan这类软件VPN搭建。本文主要介绍Openswan软件类VPN方式。关于其他VPN设备可以参考相关设备文档。
搭建环境介绍
VPN环境如图所示:

Virtual Private Gateway 是AWS VPC 的边界路由器,Customer Gateway 是 On-premises的边界路由器。
其中 AWS 侧 VPC CIDR为 172.31.0.0/16, on-premises 侧 CIDR 为 10.50.0.0/16。
为了方便测试,本次on-premises采用不同region的EC2 代替。
AWS侧配置
创建Customer Gateway
AWS Console配置的Customer Gateway (cgw) 其实是on-premises设备信息的”注册”,在AWS上登记on-premises路由器信息。 所以创建过程很简单。只需要提供IP或者证书、路由类型。
因为我们用EC2搭建openswan,而openswan暂不支持BGP。 所以路由类型我们选择Static,IP Address填入 EC2的IP地址。

Tips: 这里的IP地址填入后就不能更改。建议采用可长期使用的IP地址(如AWS上的EIP),不要采用动态分配的地址(如ADSL分配的公网地址)。
创建 Virtual Private Gateway
Virtual Private Gateway (vgw) 是 VPC的边界路由器。我们在创建完毕后需要attach到某一个AWS VPC。过程如下
- 创建vgw

- attach到vpc

在弹出的对话框中选择你的目标VPC。 注意:一个VPC仅可attach 一个vgw。
创建site to site VPN connection
在AWS VPC console中,找到Site to Site VPN,然后新建。内容如下。其中vgw/cgw 选择之前新建的。

VPN创建好后,可以在VPC detail 页面,看到两个Tunnel的公网IP。
下载VPN配置文件
AWS为了方便on-premise配置,提供了大量现成的配置文件,一般情况下,只需要选择对应的配置文件,下载后无脑配置即可。

修改路由
为了在VPN可用的时候,路由表能够自动更新,需要在VPC内相应的 subnet 路由表中启用路由传播。如图

On-premise 配置
安装openswan/libreswan
Openswan 没有提供官方的Centos/Ubuntu发行版。需要自行下载、编译。具体过程可以参考官方文档。
为了简单起见,我们安装了openswan的分支 libreswan。libreswan 有官方的yum/apt 源,可以快速、可靠安装。如过是ubuntu:
sudo apt-get update
sudo apt-get install -y libreswan
# 检查安装结果
ipsec --version
配置IPSec
打开AWS上下载的openswan配置文件,可以看到两个Tunnel的配置。两个Tunnel是为了实现高可靠性,我们的测试没有同时启用两个,仅采用一个Tunnel。所以可以任选一个Tunnel,按文档进行配置。
- 编辑
/etc/sysctl.conf,在文件末尾添加:net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.default.accept_source_route = 0 - 执行
sysctl -p,让配置生效 - 编辑
/etc/ipsec.conf,确保包含如下内容include /etc/ipsec.d/*.conf - 编辑
/etc/ipsec.d/aws.conf,按AWS上下载的文档,复制&粘贴配置。然后修改部分配置文件:leftsubnet=后面填入on-premise的CIDR(本例中的10.50.0.0/16) ;rightsubnet=填入AWS VPC CIDR (本例中的17.31.0.0/16) 。所以,配置中的left都代表本地,right都代表远端。- 特别提醒:最新版本的openswan不再需要
auth=esp内容,请确保配置不包含该内容。conn Tunnel1 authby=secret auto=start left=%defaultroute leftid=1.1.1.1 right=2.2.2.2 type=tunnel ikelifetime=8h keylife=1h phase2alg=aes128-sha1;modp1024 ike=aes128-sha1;modp1024 keyingtries=%forever keyexchange=ike leftsubnet=<LOCAL NETWORK> rightsubnet=<REMOTE NETWORK> dpddelay=10 dpdtimeout=30 dpdaction=restart_by_peer
- 编辑
/etc/ipsec.d/aws.secrets,按AWS下载的配置文件填入内容:1.1.1.1 2.2.2.2: PSK "PSWD_**********"
启用IPSec VPC
为了确保连接正常,请确保机器UDP 端口500 (如果采用NAT穿透,还需端口 4500) 双向开放。
sudo systemctl enable ipsec.service
sudo systemctl start ipsec.service
# 检查运行状态
sudo systemctl status ipsec.service
on-premise 路由更新
为了让前往AWS VPC (172.31.0.0/16)的网络流量都走VPN,需要更新路由表。由于我们的测试环境使用的AWS VPC,所以我们更新了VPC路由表,添加 172.31.0.0/16 指向我们的openswan EC2。
测试验证
首先,确保两边安全组/防火墙都开启了 ICMP。 然后,再AWS VPC以及on-premise启动机器,互相ping。 可以看到都能ping通。