构建AWS Site-to-Site IPsec实现内网互联

Posted Carlton Xu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构建AWS Site-to-Site IPsec实现内网互联相关的知识,希望对你有一定的参考价值。

1、需求描述

最近在进行公司内部在进行容灾产品测试,将本地IDC机房网络VMware虚拟机可以容灾到AWS,由于网络通信需求,需要将本地IDC私有云网络与AWS的VPC网络进行对等连接,实现内网可以双向访问。

首先这个需求既是满足混合云网络架构需求、另一个层面也是出于数据传输层面的安全考虑、可以在容灾备份上云时可以走加密网络、而且可以优化网络传输质量。

现有很多公司都在使用公有云、私有云和IDC机房,所以在混合云场景下进行多云之间的网络私有互联是必不可少网络架构方案。

2、构建方案

前边我们已经提到了网络打通的需求,下面我们看如果想要满足这个需求,大概有几个方案可以选择。根据市面上常见的三个解决方案进行分析。

  1. AWS Site-to-Site VPN
  2. 自行搭建VPN
  3. 购买入云专线网络

其实除了以上几个方案之外,还有很多的网络解决方案,像通过软硬件SD-WAN来实现等,这里我们不在赘述。

2.1. AWS Site-to-Site VPN

通过AWS提供的Site-to-Site VPN来实现,是AWS托管的一个VPN解决方案,AWS Site-to-Site VPN方案搭建完成后,IDC与AWS VPC网络互通走的还是互联网链路,支持Internet 协议安全(IPsec)VPN连接,主要是通过AWS 虚拟私有网关(VGW)+ 客户网关 与 本地IDC的VPN设备进行互联建立隧道连接,实现IDC与AWS Site-to-Site VPN内网互联,不过我在AWS中国北京区域操作时发现并没有客户网关的地方,不知道国内是不是没有开放还是怎么回事。大家如果有兴趣也可以自行操作下

AWS Site-to-Site VPN 官方文档:https://docs.aws.amazon.com/zh_cn/vpn/latest/s2svpn/VPC_VPN.html

2.2. 自行搭建VPN

通过自行搭建IPsec VPN来进行实现内网互联,IPsec VPN解决方案也是目前企业内部使用比较多的,一般使用与企业多地办公室之间的内网打通,这样在办公时可以实现一个大二层的网络,使用上可以内网直接相关互联,减少来沟通访问的成本,而且IPsec VPN走的虽然时Internet互联网,但是网络隧道是经过加密连接的,安全性上比互联网直接访问要好很多。

2.3. 购买入云专线

通过入云专线打通实现内网互联,这种在整体架构设计上,等于是直接通过网络运营商申请一条专线网络直接接入云PoP点实现内网互联,整体传输速率以及网络质量上要快很多,但是价格成本要贵很多,根据专线网络带宽每年来进行收费,买了你用不用每年都需要缴纳这个专线费用。

经过以上三个方案的分析,AWS Site-to-Site VPN目标行不通,入云专线那好是好,测试没必要在申请拉一根专线了,而且老板也不会同意,那目前来看只能通过自行搭建VPN来实现了。

3、架构规划

自行搭建VPN实现Site-to-Site互联,架构设计设计以及所需资源如下:

3.1. 网络架构设计

左侧是IDC机房网络,网络是 192.168.10.0/24 的私有网络,主要运行了企业内部的一些服务器,都运行在这个网络里面,路由器配置了拨号的公网IP,通过边缘的路由器来进行Internet访问。

右侧AWS VPC网络是 172.16.0.0/16,VPC又分为Public subnet 172.16.0.0/20,Public subnet主要用来可以访问互联网,Private subnet 172.16.128.0/20 主要是内网主机无法访问互联网,运行一些内网服务,中间件和数据库服务。

通过IDC的边缘路由器具备可以上网的能力,而且支持IPsec VPN连接能力,通过互联网与AWS侧Public subnet可以访问公网的EC2实例来进行IPsec VPN互联隧道打通。再通过两边路由来进行策略转发做到两边内网互通。

3.2. 所需资源配置

序号资源内网IP外网IP备注
1IDC机房路由器192.168.10.1固定IP地址要用进行配置IPsecVPN与AWS EC2 自建IPsec VPN Server进行Peer互联
2IDC 服务器网络192.168.10.0/24运行内网服务
3AWS EC2实例172.16.4.12554.222.149.26EC2实例,CentOS 7.x 操作系统安装strongswan IPsec VPN服务
4Public subnet172.16.0.0/20AWS 公有子网,IPsec VPN Server放在此网络进行互联网访问
5Private subnet172.16.128.0/20AWS 私有子网,内部网络无法进行互联网访问,只能通过Pubcli subnet的EC2进行网络转发

具备条件:

  • IDC机房私有子网不能和云侧VPC子网重复,需要保证不在同一个子网内,否则无法进行路由
  • IDC机房边缘路由器可以有固定公网IP,也可以是动态分配IP地址
  • AWS EC2实例必须保证有一个对外访问的公网IP地址
  • AWS EC2实例所在Public subnet需要增加静态路由策略,访问IDC 192.168.10.0/24 网络都做IGW网关
  • AWS侧Private subnet的网络安全组需要配置策略所有访问IDC的内网流量端口都走Public subnet EC2实例的网卡,否则Private subnet子网的所有资源无法与IDC 192.168.10.0/24 网络的虚拟机通信(如果安全组全放通可以不考虑,如果需要配置精准策略时,需注意)

重要的两个概念:

  • Public subnet(公有子网)

如果子网的默认流量路由到互联网网关,则该子网称为公有子网。例如,如果在此子网中启动的实例具有弹性 IP 地址或与之关联的公有 IP 地址,则该实例可以公开访问。

  • Private subnet(私有子网)

如果子网的默认流量路由到 NAT 实例/网关或完全没有默认路由,则该子网称为私有子网。例如,即使具有弹性 IP 地址或与之关联的公有 IP 地址,在此子网中启动的实例也不可公开访问。

对与公有子网和私有子网两个,可以理解都是VPC下面的子网网络,不过就是在创建的时候,
Public subnet子网在创建之后会关联一个互联网网关(IGW)来进行公网网络的访问
Private subnet子网在创建之后不会关联一个互联网网关(IGW),从而就算你放在这个子网里面的资源有公网IP也无法访问互联网

4、配置AWS侧IPsec VPN Server实例

下面可以安装前边的规划,在aws侧创建对应的VPC网络,包含Public subnet及Private subnet子网,可以分布在不同的AZ可用区域,并创建EC2实例并安装相关IPsec VPN软件服务。

分为以下几个步骤来进行配置:

  • 前期准备
    • 创建VPC网络及子网
    • 创建EC2实例
  • 安装配置IPsec VPN服务
  • 添加路由条目
  • 配置IDC侧IPsec VPN连接
  • 网络测试访问

4.1. 前期准备

  • 创建VPC网络及子网

这里可以按照自身需求在AWS VPC管理控制台进行创建VPC及相关子网

参考文档:https://docs.amazonaws.cn/vpc/latest/userguide/VPC_Networking.html

  • 创建EC2实例

EC2实例规格我这里选择的是t2.medium,操作系统为CentOS7.5版本,也可以按照需求自行进行调整,关于创建步骤这里不做赘述

EC2实例创建时要放在Public subnet子网内,切分配一个公网IP或弹性公网IP,让其可以访问互联网。
EC2实例所在安全组需要放通IDC侧访问的UDP500、4500两个端口用来VPN连接,另外为了访问测试,需要将ICMP端口打开

4.3. 安装配置IPsec VPN服务

  • 访问EC2实例(ssh或其他工具)
  • 配置yum源
# vi /etc/yum.repos.d/strongswan.repo

[strongswan]
name = strongswan
baseurl = http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/
gpgcheck = 0
enabled = 1
  • 安装openswan服务
# yum install -y strongswan
  • 禁用ipv4相关配置选项
# sysctl -a | egrep "ipv4.*(accept|send)_redirects" | awk -F "=" 'print$1"= 0"' >> /etc/sysctl.conf
  • 开启路由转发
# 编辑/etc/sysctl.conf配置文件,增加如下内容
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1     #开启路由转发
net.ipv4.conf.default.rp_filter = 0 #关闭对数据包源地址的反向路由校验
net.ipv4.conf.all.rp_filter = 0 #关闭所有网络设备对数据包源地址的反向路由校验

# 执行指令使其生效
# sysctl -p
  • 修改openswan的配置

这里主要有两个配置文件

第一个:/etc/strongswan/ipsec.conf 主要配置文件,setup和conn两个段需求配置

第二个:/etc/strongswan/ipsec.secrets 主要用来保存RSA Keys和preshared secrets(PSKS)双方认证的密钥

# 修改/etc/strongswan/ipsec.conf配置文件,添加如下内容
# vi /etc/strongswan/ipsec.conf
config setup
    charondebug="all"

conn %default
    ikelifetime=28800s *#第一阶段生存时间*
    keylife=60m
    rekeymargin=3m
    keyingtries=0
    keyexchange=ikev1 *#ike版本*
    authby=secret *#配置安全网关如何认证,默认是rsa,这里使用共享密钥*

conn aws-to-idc
    type=tunnel *#隧道模式,支持host-to-host,host-to-network和network-to-network;如果设置transport,表示为host-to-host传输模式*
    left=172.16.4.125 *#本机服务器提供对外(通常是指Internet)服务的接口,网上大多说是公网IP,这个说法对于服务器是直接对接Internet,并作为内网的网关的时候,是对的;但是,对于本例,在防火墙内部,就是不对的,其IP仍然是私网地址,所以,这点很重要,要认真区分*
    leftid=54.222.149.26 *#设置身份ID(本端),如果是域名,使用@指定;如果用IP,直接使用IP地址接口,不需要@符号*
    leftsubnet=172.16.0.0/20 *#表示本地的子网网络,如果有多个网段就有leftsubnets*
    right=61.xx.xxx.26 *#对端公网IP,无固定IP或不确定IP,设置为%any,这里必须设置为公网IP,跟left有些不同*
    rightsubnet=192.168.10.0/24  *#表示对端的子网网络,如果有多个网段就有leftsubnets*
    rightid=61.xx.xxx.26 *#设置身份ID(对端)如果是域名,使用@指定;如果用IP,直接使用IP地址接口,不需要@符号*
    auto=start *#start是表示connection随Ipsec服务器启动而自动连接;add不会随ipsec服务启动而启动,需要ipsec auto up idc-to-office启动connection*
    ike=3des-md5-modp1024 *#第一阶段算法参数*
    esp=3des-md5 *#指定第二阶段的算法参数*
    dpdaction=hold *#eroute进入hold,等待对方的return信息;tunnel模式,推荐设置为hold;transport模式,推荐设置为clear*
    dpddelay=10 *#每10秒钟检测一次,默认是30秒*
    dpdtimeout=30 *#闲置超时时间,这个时间内没有流量,没有响应,就表示对等实体已经死亡,并删除SA,默认120秒*
    keyingtries=%forever
# 增加/etc/strongswan/ipsec.secrets配置文件,添加如下内容
# vi /etc/strongswan/ipsec.secrets
%any %any : PSK "yR8zZHsUx6y5RWkk2E3S"  #第一个%any表示对端外网IP,第二个%any表示本地外网IP,如果只有一个通道的话,这里可以都设置为%any; 如果有多个通道,需要指定IP地址,每一行代表一个
  • 启动ipsec服务
# strongswan start
  • 检查ipsec服务状态
# strong status


出现如下截图展示则表示所有strongswan服务启动成功,等待连接中。如果有对接连接none就会显示为正常连接的对端信息;

4.4. 添加路由条目


如上图所示,在所有需要访问IDC内网网络的子网路由表中添加目标为192.168.10.0/24,第二个目标这里选择为实例 —> IPsecVPNServer实例(这里自动会匹配IPsecVPNServer这台实例的eni网卡),则表示去往192.168.10.0/24网络都由IPsecVPNServer这台实例进行网络转发。

这里需要注意,所有同一个VPC下面Private subnet私有子网的如果都有需求进行IDC互联则需要每一个Private
subnet私有子网都需要配置这条路由条目,不然无法进行通信。另外还要注意路由配置完成之后,如果出现AWS侧无法访问IDC网络端口时,需要检查IPsecVPNServer
EC2实例的安全组是否放开了需要访问的端口。因为云侧到云下是通过IPsecVPNServer
EC2实例进行转发,所有流量都经过这台实例,确保安全组都访问才可以。

4.5. 配置IDC侧IPsec VPN连接

IDC侧我这里是直接使用边缘路由器的VPN能力,或者如果路由器没有VPN功能,也可以选择在内网找一台VM来部署安装openswan IPsec VPN来实现对等的连接配置。

  • 添加IPsec VPN的虚接口

虚接口名称,可以选择ipsec3

绑定接口 关联到WAN1,这里WAN1为外网IP地址的通信接口

  • 配置IKE安全提议

IKE验证算法、IKE加密算法、IKE DH组 —> ipsec.conf 中 conn aws-to-idc 段中ike的值3des-md5-modp1024

  • 配置IKE对等体

虚接口 —> 第一步骤创建的ipsec3

对端地址 —> AWS侧EC2实例的公网IP

协商模式 —> 选择主动模式

安全提议一 —> 选择前边创建的AWSIKE

预共享密钥(PSK) —> 选择/etc/strongswan/ipsec.secrets配置文件配置PSK值,必须保持一致

生命周期 —> 与配置文件/etc/strongswan/ipsec.secrets中ikelifetime值保持一致

DPD —> 选择开启

DPD周期 —> 与配置文件/etc/strongswan/ipsec.secrets中dpddelay值保持一致

DPD超时时间 —> 与配置文件/etc/strongswan/ipsec.secrets中dpdtimeout值保持一致

  • 配置IPsec安全提议

安全协议类型 —> 选择ESP

ESP验证算法 —> 选择MD5 与 /etc/strongswan/ipsec.secrets中 conn aws-to-idc 段中esp值3des-md5保持一致

ESP加密算法 —> 选择3DES 与 /etc/strongswan/ipsec.secrets中 conn aws-to-idc 段中esp值3des-md5保持一致

  • 配置IPsec安全策略

本地子网IP/掩码 —> IDC本地互联子网IP地址段

对端子网IP/掩码 —> AWS云侧需要互联的VPC网段,可以是大的VPC,也可以是Subnet子网

协商类型 —> IKE协商

对等体 —> AWSVPN,前边所定义的

安全提议一 —> AWSIPsec,前边所定义的

PFS —> 这里选择禁止

生命周期 —> 与配置文件保持一致,28800s

触发模式 —> 可以按需选择,流量触发/长连模式

以上配置完整即可进行应用,应用完成后,可以IDC的路由器查看连接状态,目前看是已经连接成功,已经有流量产生。

4.6. AWS侧查看连接状态

# strongswan status

通过以上查看也已经与IDC对端连接成功。

5. 网络访问测试

测试一:IDC网络192.168.10.0/24网络可以访问到AWS侧Public subnet公有子网172.16.0.0/20的EC2实例 【正常访问】

测试二:AWS侧Public subnet公有子网172.16.0.0/20可以访问到IDC 192.168.10.0/24网络**【正常访问】**

测试三:IDC网络192.168.10.0/24网络可以访问到AWS侧Private subnet公有子网172.16.128.0/20的EC2实例**【正常访问】**
测试四:AWS侧Public subnet公有子网172.16.128.0/20可以访问到IDC 192.168.10.0/24网络

到这里位置,我们通过IPsec自建VPN就实现了IDC与AWS Site-to-Site VPN的访问,后面就可以通过内网进行资源互访了。

以上是关于构建AWS Site-to-Site IPsec实现内网互联的主要内容,如果未能解决你的问题,请参考以下文章

构建AWS Site-to-Site IPsec实现内网互联

centos部署ipsec *** nat穿越

centos部署ipsec *** nat穿越

在 terraform IPSec 隧道中使用的 AWS IP 地址(通过 Transit Gateway)

多子网Cisco ASA to AWS IPSEC ××× 问题

如何在AWS EC2上架设L2TP/IPsec服务