+86 189 8218 1436 周一至五 10:00-22:00

AWS构建健壮的混合云网络

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

 

背景介绍:

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

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

1.    纯VPN组网

2.    纯专线组网

3.    VPN与专线的混合组网

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

本篇主要讲述第二种组网方式,着眼点在于如何实现混合云网络的健壮性及故障自愈。

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

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

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

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

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

拓扑图:

1124-1

AWS与本地站点之间建立两条专线,为了保证一条专线故障后,剩下的专线能够承载所有的业务流量,建议使用主备模式,考虑到高可用,建议两条专线分别终结在SINNET和CIDS两个DX Location,并且可以使用两家专线提供商的链路。

配置步骤:

1.    申请专线

小于500M的专线由AWS APN Partner提供,这里以APN Partner方案为例,大于1G的专线接入请参考如下文档:

https://www.amazonaws.cn/en/documentation/directconnect/

向APN Partner申请链路,根据要求提供相关信息,通常包括用户AWS账号,专线带宽等信息。

2.    接受连接并创建virtual interface

当APN Partner建立好专线后,登入management console,选择Direct Connect服务,将可以看到相关的连接,需要选择接受连接。

1124-2

创建Virtual Interface。

1124-3

选择创建Private Virtual Interface,设置接口名称并与相关VPC的VGW关联

1124-4

根据自己的需要设置互联地址及本地站点的AS号

1124-5

3.    下载本地站点端路由器的配置

1124-6

1124-7

4.    修改本地路由器端BGP配置,实现主备冗余

a.    AWS侧出向流量主备通过AS-PATH属性实现

b.    本地站点侧出向流量主备通过Local-Preference属性实现

下面是本地站点侧,备份链路路由器上的参考配置:

route-map LOCAL-PRE permit 10

 set local-preference 50

!

route-map PREPEND permit 10

 set as-path prepend 1111 1111

!

router bgp 1111

 network 0.0.0.0

 neighbor 169.254.10.2 remote-as 17493

 neighbor 169.254.10.2 route-map LOCAL-PRE in

 neighbor 169.254.10.2 route-map PREPEND out

5.    确认接口up

1124-8

6.    设置需要通过专线访问本地站点的路由表的下一跳为VGW

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

背景介绍:

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

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

1.    纯VPN组网

2.    纯专线组网

3.    VPN与专线的混合组网

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

本篇主要讲述第三种组网方式,着眼点在于如何实现混合云网络的健壮性及故障自愈。

此外笔者始终认为“Network is not just ping success”,尤其对于大型企业来说,网络流量的监控,故障事件的告警,日志的搜集检索等功能并非可选项,所以本篇也会顺带介绍如何在AWS云上实现这些功能。

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

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

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

注意:本篇以AWS中国区VGW尚未落地为前提,VPN部分以开源软件实现,但应用场景并不仅限于AWS中国区,如何客户需要一些VGW暂时无法满足的功能,同样可以在AWS Global利用本篇搭建符合自身需求的解决方案,具体可能的需求包括但不限于:

1.    需要使用VGW暂时不支持的加解密算法

2.    需要使用VGW暂时不支持的hash算法

3.    需要使用证书认证

4.    All in one解决方案,VPN设备除了提供VPN功能外,还需要提供防火墙,NAT等功能

拓扑图:

1125-1

对于DX与VPN互备的场景,有如下几种情况:

1.    1条DX+1条VPN

2.    2条DX+1条VPN

3.    1条DX+2条VPN

4.    2条DX+2条VPN

对于1,2两种场景下,可以简单地通过调整Private-1,Private-2的路由表实现AWS侧的主备,即:流量优先选择DX专线,在专线故障时切换到VPN链路。

启用路由传递,路由表中会出现一条10.10.0.0/16,target为VGW的路由

1125-2

设置一条静态路由10.0.0.0/8,target为VPN设备的eni

1125-3

由于路由最长匹配的原则,默认去往本地站点10.10.0.0/16的流量会通过VGW走专线,当专线发生故障的时候,10.10.0.0/16的路由不会传递进入路由表,此时10.0.0.0/8的路由生效,流量切换到VPN链路。

对于3,4两种场景下,无法通过上述方式在两条VPN链路之间切换,需要部署拓扑图中的monitor设备来监控DX和VPN链路及VPN设备的健康状态并实现链路切换。

本例主要介绍monitor及Strongswan设备上的脚本功能,及如何与监控,告警相结合。

VPC基本配置,DX基本配置,Strongswan配置及本地站点切换方式请参考:

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

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

1.    链路切换逻辑:

1125-4

当专线链路正常时,设置服务器的路由指向VGW,流量通过专线传输,当监测到专线故障时,将服务器路由指向相同AZ中的Strongswan,并且开始监测Strongswan实例及VPN链路的健康状态,当一条VPN链路发生故障时,切换相应流量跨AZ传输给另一个AZ中的Strongswan,当其中一个AZ的Strongswan发送故障时,切换流量的同时,通过stop/start该Strongswan恢复实例。

2.    除了链路切换功能外,通过monitor及Strongswan上运行脚本能实现故障告警,VPN流量统计及事件日志收集检索功能:

1125-5

SNS邮件及短信告警:

1125-6

1125-7

CloudWatch针对VPN流量监控:

1125-8

Elasticsearch & Kibana做事件日志收集及检索:

1125-9

可以针对site,dx,vpn做检索:

1125-10

1125-11

1125-12

所有脚本可以从如下的github上下载得到:

1125-13

3.    脚本功能说明:

3.1 monitor实例上运行的脚本:

monitor.sh:

 

1.    实现DX链路,VPN链路及VPN设备的健康检测并修改服务器路由切换流量

2.    发现故障后,产生告警通知,通过SNS服务邮件及短信通知相关运维人员

3.    本地产生故障日志,通过logstash输出到Elasticsearch服务存储

注:SNS短信通知目前BJS暂不支持,Elasticsearch & Kibana服务在BJS需要自己搭建

monitor实例需要对路由表做操作,并与SNS服务交互,所以需要赋予相关的角色

1125-14

其中,monitor policy的配置如下:

{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Action": [

                "ec2:DescribeInstances",

                "ec2:CreateRoute",

                "ec2:ReplaceRoute",

                "ec2:StartInstances",

                "ec2:StopInstances"

            ],

            "Effect": "Allow",

            "Resource": "*"

        }

    ]

}

3.2 Strongswan实例上运行的脚本:

tunnel_init.sh:创建tunnel接口及路由相关流量到tunnel口

traffic_monitor.sh:收集进出tunnel口的VPN流量统计信息,通过自定义metric发送到CloudWatch中,实现VPN流量的监控

ipsec.conf/ipsec.secrets配置文件:Strongswan配置文件,建立ipsec vpn隧道

Strongswan实例需要收集VPN流量信息并与CloudWatch交互,所以需要赋予相关的角色

1125-141

4.    脚本使用方法:

monitor.sh:运行在monitor实例上,monitor实例需要拥有操控路由表,SNS等

monitor.sh的如下脚本语句需要做相应的修改

VPN_ID1="i-0e1466e8a5dd4892c"

VPN_ID2="i-0430fe110cdec5835"

VGW_ID="vgw-078bcc55"

VPN_RT_ID1="rtb-468f5222"

VPN_RT_ID2="rtb-4b8f522f"

DX_IP="10.10.3.100"

Remote_IP1="169.254.100.1"

Remote_IP2="169.254.200.1"

logstash_site="Singapore"

litterbin=$(aws sns publish --region ap-southeast-1 --topic-arn "arn:aws:sns:ap-southeast-1:93870664XXXX:DCI-Status" --subject "Status of DCI between Singapore and Ireland Changed!" --message file://logfile)

litterbin=$(aws sns publish --region ap-southeast-1 --phone-number "+861860135XXXX" --message file://logfile)

其中VPN_ID1,VPN_ID2分别为Strongswan-1,Strongswan-2的instance id,VGW_ID为VGW的id,VPN_RT_ID1,VPN_RT_ID2分别为Private-1,Private-2关联的路由表id,DX_IP为DX链路的检测ip,通常为专线提供商MPLS VPN网络的PE设备或者是本地站点的出口路由器公网ip,Remote_IP1,Remote_IP2分别为本地站点两条VPN的隧道口ip,logstash_site为AWS站点标示,该值会体现在告警及日志中,用于区分多个AWS站点。

–region,–topic-arn,–phone-number根据需要修改,其中SNS的topic需要事先创建并且通过相关邮箱订阅来接收消息。

所有事件日志会先写入本地/tmp/logstash.txt文件中,通过logstash上传给elasticsearch。

 

修改/etc/logstash/conf.d/logstash.conf

input {

file {

         path => "/tmp/logstash.txt"

         codec => json

}

}

 

output {

elasticsearch {

         hosts => "http://search-test-cfwkwatg5unnpsgvbd5lyruquy.ap-southeast-1.es.amazonaws.com"

         index => "XXXX"

}

}

可以设置/etc/rc.d/rc.local文件,使monitor实例开机运行monitor.sh脚本

 

vpn_monitor.sh:运行在Strongswan实例上,创建VPN隧道接口及相关路由

traffic_monitor.sh:运行在Strongswan实例上,收集隧道接口的流量信息并以自定义metric的方式传输给CloudWatch服务

可以设置/etc/rc.d/rc.local文件,使Strongswan实例开机运行vpn_monitor.sh和traffic_monitor脚本