亚马逊AWS官方博客

构建健壮的混合云网络——BJS VPN篇

背景介绍:

近年来,随着公有云的普及,一方面,越来越多的用户选择利用公有云在弹性、灵活性等方面的优势,在云上部署新的应用系统,另一方面,大量的企业有很多现有的本地基础设施投资,所以企业上云的过程并不是一触而就的,期间势必存在云应用与本地数据中心应用并存的局面,为了更好的融合云与本地数据中心的应用环境,实现整体应用系统的稳定性和高可用性,构建一个健壮的混合云网络至关重要。

在AWS上,用来连接AWS与本地数据中心的方式主要有以下3种:

1.    纯VPN组网

2.    纯专线组网

3.    VPN与专线的混合组网

其中,对于AWS中国区来讲,由于AWS自身的VPN服务VGW目前尚未落地,客户急需要一个替代方案,能够达到类似于VGW的冗余及故障切换功能。

本篇主要讲述第一种组网方式,着眼点在于如何实现混合云网络的健壮性及故障自愈,并不会讲述太多的IPSec VPN知识。

对于第二,第三种组网方式的高可用实现,请参考:

《构建健壮的混合云网络——BJS DX篇》

《构建健壮的混合云网络——BJS DX+VPN篇》

对于如何实现对VPN流量的监控、故障告警及事件日志搜集,请参考:

《构建健壮的混合云网络——BJS DX+VPN篇》

拓扑图:

Strongswan-1和Strongswan-2分别作为Region A两个AZ内的VPN设备,与客户本地站点的internet出口设为分别建立两条VPN隧道,Private-1和Private-2分别模拟Region A两个AZ中的两台内网设备。

本场景需要实现如下目的:

1.    Private-1,Private-2能够与本地站点内的设备通过私网互通

2.    AWS侧能够检测VPN连接的健康状态并实现自动的故障切换

3.    AWS侧能够检测VPN设备的健康状态并实现自动的故障切换

4.    本地站点侧能够检测VPN连接的健康状态并实现自动的故障切换

5.    本地站点侧能够检测VPN设备的健康状态并实现自动的故障切换

系统工作流程:

1.    Strongswan-1和Strongswan-2设置开机自动运行vpn_monitor.sh脚本,该脚本首先会将Private-1和Private-2去往本地站点的路由分别指向本AZ中的VPN设备,即:Strongswan-1和Strongswan-2

2.    接着Strongswan-1和Strongswan-2会通过互相ping来检测对端的可达性,同时通过ping本地站点VPN设备的tunnel地址来检测VPN连接的可达性。

3.    如果Strongswan-1的VPN连接发生故障,Strongswan-1会将Private-1路由的target从Strongswan-1修改为指向Strongswan-2,连接恢复后,Strongswan-1会将路由切换回自身

4.    如果Strongswan-1发生故障,Strongswan-2的ping检测失败,Strongswan-2会将Private-1路由的target从Strongswan-1修改为指向Strongswan-2

5.    Strongswan-2接着会对Strongswan-1做stop,start操作

6.    当Strongswan-1在另外一台物理机上启动后,自动运行的脚本会将Private-1路由从Strongswan-2修改为指向Strongswan-1

配置步骤:

1.    为Strongswan-1和Strongswan-2创建合适的角色并关联

由于Strongswan-1和Strongswan-2需要对VPC路由表及EC2实例做操作,所以需要创建合适的角色并与实例关联。

在IAM服务中选择策略->创建策略

选择创建您自己的策略

使用如下内容设置策略文档,并点击创建策略

在IAM服务中选择角色->创建新角色

设置角色名称

选择AWS服务角色->Amazon EC2

选择筛选条件为客户管理的策略,并勾选之前创建的Strongswan_Policy

审核配置并点击创建角色

在创建Strongswan-1和Strongswan-2的EC2时,关联Strongswan_role角色

需要注意为Strongswan-1,Strongswan-2关联EIP,避免IP发生变化导致VPN无法建立,并且需要在控制台关闭源/目地址检查

2.    VPC网络规划

本场景的VPC的CIDR为172.16.0.0/16,一共需要至少四个子网分别对应4台EC2,Strongswan-1和Strongswan-2可以共用一张路由表,默认路由到IGW,Private-1和Private-2分别需要一张独立的路由表,关于如何配置VPC,子网,IGW,路由表等内容,可以参考如下文档:

Amazon Virtual Private Cloud用户指南

http://docs.amazonaws.cn/AmazonVPC/latest/UserGuide/VPC_Introduction.html

Strongswan-1和Strongswan-2所在子网的路由表设置如下

Private-1所在子网的路由表设置如下,eni-23fbd87a为Strongswan-1的网卡ID,10.10.0.0/16为本地站点网段

Private-2所在子网的路由表设置如下,eni-2d75e606为Strongswan-2的网卡ID,10.10.0.0/16为本地站点网段

3.    配置Strongswan

3.1  在Strongswan-1及Strongswan-2的/etc/sysctl.conf文件中添加如下内容,开启转发,关闭重定向及反向路径过滤:

net.ipv4.ip_forward = 1

net.ipv4.conf.all.accept_redirects = 0

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.rp_filter = 2

运行sysctl –p使修改生效

3.2  安装Strongswan

修改/etc/yum.repos.d/epel.repo,将enabled=0修改成enabled=1

wget ftp://fr2.rpmfind.net/linux/centos/6.8/os/x86_64/Packages/trousers-0.3.13-2.el6.x86_64.rpm

rpm -ivh trousers-0.3.13-2.el6.x86_64.rpm

yum install strongswan -y

chkconfig strongswan on

3.3  配置Strongswan-1的strongswan

修改Strongswan-1的/etc/strongswan/ipsec.conf,添加如下内容,其中172.16.1.157为Strongswan-1的私网地址,54.223.192.238为Strongswan-1的公网地址,52.50.130.77为本地站点路由器的公网地址:

conn vpn1

            type=tunnel

            mobike=no

            authby=secret

            keyexchange=ikev1

            ike=aes128-sha1-modp1024

            esp=aes128-sha1-modp1024

            left=172.16.1.157

            leftid=54.223.192.238

            leftsubnet=0.0.0.0/0

            right=52.50.130.77

            rightsubnet=0.0.0.0/0

            auto=start

            dpddelay=3

            dpdtimeout=15

            dpdaction=restart

            mark=100

3.4  创建Strongswan-1的/etc/strongswan/ipsec.secrets文件,添加如下内容:

54.223.192.238 52.50.130.77 : PSK "cisco"

3.5  配置Strongswan-2的strongswan

修改Strongswan-2的/etc/strongswan/ipsec.conf,添加如下内容,其中172.16.2.126为Strongswan-2的私网地址,54.222.191.34为Strongswan-2的公网地址,52.51.34.140为本地站点路由器的公网地址:

conn vpn1

            type=tunnel

            mobike=no

            authby=secret

            keyexchange=ikev1

            ike=aes128-sha1-modp1024

            esp=aes128-sha1-modp1024

            left=172.16.2.126

            leftid=54.222.191.34

            leftsubnet=0.0.0.0/0

            right=52.51.34.140

            rightsubnet=0.0.0.0/0

            auto=start

            dpddelay=3

            dpdtimeout=15

            dpdaction=restart

            mark=100

3.6  创建Strongswan-2的/etc/strongswan/ipsec.secrets文件,添加如下内容:

54.222.191.34              52.51.34.140 : PSK "cisco"

3.7  下载脚本到Strongswan-1和Strongswan-2,修改如下内容

脚本下载地址:https://s3.cn-north-1.amazonaws.com.cn/junyublog/vpn_monitor.sh

VPN_ID="i-0430fe110cdec5835"

VPN_RT_ID="rtb-4b8f522f"

Remote_IP="169.254.40.105"

My_RT_ID="rtb-468f5222"

VPN_ID为peer的instance id,对于运行在Strongswan-1上的脚本,该值为Strongswan-2的instance id,对于运行在Strongswan-2上的脚本,该值为Strongswan-1的instance id

对于运行在Strongswan-1上的脚本,VPN_RT_ID为Private-2所在子网关联的路由表,对于运行在Strongswan-2上的脚本,VPN_RT_ID为Private-1所在子网关联的路由表

Remote_IP为对端本地站点路由器的tunnel地址

My_RT_ID为本机负责转发的EC2的路由表ID,对于运行在Strongswan-1上的脚本,该值为Private-1的路由表ID,对于运行在Strongswan-2上的脚本,该值为Private-2的路由表ID

4.    创建tunnel接口及路由表

在/etc/rc.d/rc.local文件中添加如下内容:

Strongswan-1:

litterbin=$(ip link add tunnel1 type vti local 172.16.1.157 remote 52.50.130.77 key 100)

litterbin=$(ip add add 169.254.100.2/30 remote 169.254.100.1/30 dev tunnel1)

litterbin=$(ip link set tunnel1 up mtu 1436)

litterbin=$(ip rule add priority 10 from all lookup 10)

ip route add 169.254.100.0/30 via 169.254.100.1 table 10

ip route add 10.10.0.0/16 via 169.254.100.1 table 10

/bin/bash ./home/ec2-user/vpn_monitor.sh > /tmp/log

其中169.254.100.2为Strongswan-1的tunnel口地址,169.254.100.1为对端本地站点路由器的tunnel口地址,172.16.1.157为Strongswan-1的私网地址,52.50.130.77为对端本地站点路由器的出口地址

 

Strongswan-2

litterbin=$(ip link add tunnel1 type vti local 172.16.2.126 remote 52.51.34.140 key 100)

litterbin=$(ip add add 169.254.200.2/30 remote 169.254.200.1/30 dev tunnel1)

litterbin=$(ip link set tunnel1 up mtu 1436)

litterbin=$(ip rule add priority 10 from all lookup 10)

ip route add 169.254.200.0/30 via 169.254.200.1 table 10

ip route add 10.10.0.0/16 via 169.254.200.1 table 10

/bin/bash ./home/ec2-user/vpn_monitor.sh > /tmp/log

其中169.254.200.2为Strongswan-2的tunnel口地址,169.254.200.1为对端本地站点路由器的tunnel口地址,172.16.2.126为Strongswan-1的私网地址,52.51.34.140为对端本地站点路由器的出口地址

5.    本地站点路由器参考配置

此处以Cisco路由器为例,思路如下:

a.    创建tunnel-based ipsec vpn

b.    通往VPC网段的路由指向tunnel接口,并且使用ip sla track

c.    设置ip sla检测Strongswan的tunnel ip可达性

d.    本地内网配置IGP,将静态路由重分发到IGP中

 

Cisco Router 1:

track 100 ip sla 10 reachability

!

crypto keyring KEYRING 

  local-address 10.10.1.100

  pre-shared-key address 54.223.192.238 key cisco

!

crypto isakmp policy 100

 encr aes

 authentication pre-share

 group 2

 lifetime 28800

crypto isakmp keepalive 10 10

crypto isakmp profile isakmp-profile

   keyring KEYRING

   match identity address 54.223.192.238 255.255.255.255

   local-address 10.10.1.100

!

crypto ipsec security-association replay window-size 128

!

crypto ipsec transform-set TRAN esp-aes esp-sha-hmac

 mode tunnel

crypto ipsec df-bit clear

!

crypto ipsec profile ipsec-profile

 set transform-set TRAN

 set pfs group2

!

interface Tunnel100

 ip address 169.254.100.1 255.255.255.0

 ip tcp adjust-mss 1387

 tunnel source 10.10.1.100

 tunnel mode ipsec ipv4

 tunnel destination 54.223.192.238

 tunnel protection ipsec profile ipsec-profile

 ip virtual-reassembly

!

router ospf 100

 router-id 1.1.1.1

 redistribute static subnets route-map static2ospf

!

ip route 172.16.0.0 255.255.0.0 Tunnel100 169.254.100.2 tag 100 track 100

!

ip sla 10

 icmp-echo 169.254.100.2 source-ip 169.254.100.1

 frequency 5

ip sla schedule 10 start-time now

!

route-map static2ospf permit 10

 match tag 100

 

Cisco Router 2:

track 100 ip sla 10 reachability

!

crypto keyring KEYRING 

  local-address 10.10.2.100

  pre-shared-key address 54.222.191.34 key cisco

!

crypto isakmp policy 100

 encr aes

 authentication pre-share

 group 2

 lifetime 28800

crypto isakmp keepalive 10 10

crypto isakmp profile isakmp-profile

   keyring KEYRING

   match identity address 54.222.191.34 255.255.255.255

   local-address 10.10.2.100

!

crypto ipsec security-association replay window-size 128

!

crypto ipsec transform-set TRAN esp-aes esp-sha-hmac

 mode tunnel

crypto ipsec df-bit clear

!

crypto ipsec profile ipsec-profile

 set transform-set TRAN

 set pfs group2

!

interface Tunnel100

 ip address 169.254.200.1 255.255.255.0

 ip tcp adjust-mss 1387

 tunnel source 10.10.2.100

 tunnel mode ipsec ipv4

 tunnel destination 54.222.191.34

 tunnel protection ipsec profile ipsec-profile

 ip virtual-reassembly

!

router ospf 100

 router-id 2.2.2.2

 redistribute static subnets route-map static2ospf

!

ip route 172.16.0.0 255.255.0.0 Tunnel100 169.254.200.2 tag 100 track 100

!

ip sla 10

 icmp-echo 169.254.200.2 source-ip 169.254.200.1

 frequency 5

ip sla schedule 10 start-time now

!

route-map static2ospf permit 10

 match tag 100

 

作者介绍:

余骏

亚马逊AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广。在加入AWS之前,在思科中国担任系统工程师,负责方案咨询和架构设计,在企业私有云和基础网络方面有丰富经验。