背景介绍:
近年来,随着公有云的普及,一方面,越来越多的用户选择利用公有云在弹性、灵活性等方面的优势,在云上部署新的应用系统,另一方面,大量的企业有很多现有的本地基础设施投资,所以企业上云的过程并不是一触而就的,期间势必存在云应用与本地数据中心应用并存的局面,为了更好的融合云与本地数据中心的应用环境,实现整体应用系统的稳定性和高可用性,构建一个健壮的混合云网络至关重要。
在 AWS 上,用来连接 AWS 与本地数据中心的方式主要有以下 3 种:
纯 VPN 组网
纯专线组网
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 中的两台内网设备。
本场景需要实现如下目的:
Private-1,Private-2 能够与本地站点内的设备通过私网互通
AWS 侧能够检测 VPN 连接的健康状态并实现自动的故障切换
AWS 侧能够检测 VPN 设备的健康状态并实现自动的故障切换
本地站点侧能够检测 VPN 连接的健康状态并实现自动的故障切换
本地站点侧能够检测 VPN 设备的健康状态并实现自动的故障切换
系统工作流程:
Strongswan-1 和 Strongswan-2 设置开机自动运行 vpn_monitor.sh 脚本,该脚本首先会将 Private-1 和 Private-2 去往本地站点的路由分别指向本 AZ 中的 VPN 设备,即:Strongswan-1 和 Strongswan-2
接着 Strongswan-1 和 Strongswan-2 会通过互相 ping 来检测对端的可达性,同时通过 ping 本地站点 VPN 设备的 tunnel 地址来检测 VPN 连接的可达性。
如果 Strongswan-1 的 VPN 连接发生故障,Strongswan-1 会将 Private-1 路由的 target 从 Strongswan-1 修改为指向 Strongswan-2,连接恢复后,Strongswan-1 会将路由切换回自身
如果 Strongswan-1 发生故障,Strongswan-2 的 ping 检测失败,Strongswan-2 会将 Private-1 路由的 target 从 Strongswan-1 修改为指向 Strongswan-2
Strongswan-2 接着会对 Strongswan-1 做 stop,start 操作
当 Strongswan-1 在另外一台物理机上启动后,自动运行的脚本会将 Private-1 路由从 Strongswan-2 修改为指向 Strongswan-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 无法建立,并且需要在控制台关闭源/目地址检查
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 为本地站点网段
配置 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
创建 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 为对端本地站点路由器的出口地址
本地站点路由器参考配置
此处以 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 之前,在思科中国担任系统工程师,负责方案咨询和架构设计,在企业私有云和基础网络方面有丰富经验。
本文转载自 AWS 技术博客。
原文链接:
https://amazonaws-china.com/cn/blogs/china/hybrid-bjs-vpn/
评论