使用 Docker 封装 IPSec 安全网关

阅读数:121 2019 年 11 月 20 日 08:00

使用Docker封装IPSec安全网关
随着云成为新常态,越来越多的客户开始采用 AWS 云服务,使用 VPN 隧道安全的连接到 AWS 成为一个常见的场景。本文介绍一种仅需少量交互与配置即可与多个 AWS VPC 建立动态路由 VPN 连接并在各个互联 VPC 之间转发流量的方案。该方案主要使用了 Docker、IPSec 套件 strongSwan、动态路由软件 BIRD,并在此基础上,使用 AWS SDK for Python( Boto 3)、docker-py 等实现快速建立与 AWS VPC 的动态 VPN。
复制代码
项目中使用的 Dockerfile、相关的 shell 脚本以及 Python 应用等源文件均已经在这里开放,做为一种快速部署 Customer Gateway 的方法,供各位读者参考。
本文假定读者从概念上理解 AWS VPC、IPSec VPN 以及动态路由协议 BGP。如果希望了解更多如何与 AWS VPC 建立 VPN 连接的信息,读者可以参考 AWS VPC 网络管理员指南。
** 如何使用 **
我们从最基本的场景开始,假定您需要将本地网络与单个 AWS VPC 通过 IPSec 隧道互联。
!
图中 Customer Gateway 应为一台可以访问 Internet 且 IP 固定的 Linux 服务器, 这台服务器将作为 IPSec 网关和 BGP 路由器,将内部网络与 AWS VPC 通过 IPSec 隧道和 BGP 动态路由协议连接起来。
Customer Gateway 上执行如下预备工作:
一、我们需要 预先安装和配置好 docker 引擎 ;
二、我们的脚本使用了 Python 和一些第三方库,所以需要安装 Python 2.7 或更新版本以及 Python 包管理工具,例如 pip
三、通过 pip 安装如下软件包 ;
a. boto3 —— AWS SDK for Python,用于获取 VPN 连接的配置信息
b. xmltodict —— 便于 python 处理 XML 格式的数据
c. docker-py —— 用于连接 docker engine 并创建、运行容器
四、配置 boto3 连接 AWS 的 IAM 凭证,需要注意使用的 IAM 用户需要拥有执行 describe_vpn_connections API 所需的权限。
$ cat ~/.aws/credentials
[default]
aws_access_key_id = YOUR_KEY
aws_secret_access_key = YOUR_SECRET
** 建立连接 **
参照 AWS VPC 用户指南中关于“设置 VPN 连接”章节的指导,完成如下步骤:
步骤一、创建虚拟专用网关,附加到目标 VPC 并启用路由传播;
步骤二、创建客户网关,输入 Customer Gateway 的公网 IP 地址,选择动态路由,并输入 65000 作为本地网络的 BGP ASN 号;
步骤三、创建虚拟专用网关和客户网关之间的 VPN 连接,每个 VPN 连接包含两条相护冗余的 VPN 隧道;
步骤四、在 Customer Gateway 上执行 peer.py 脚本,传入目标 VPC 所在的 region 名称和 vpn 连接 id,该脚本将会调用 AWS API 下载指定的 VPN 连接的配置信息、然后连接 Docker Engine 创建 cgw 容器并将关键参数作为环境变量传入容器 ;
步骤五、cgw 容器会根据传入的环境变量完成自举并发起到 AWS 侧虚拟专用网关的 2 条动态路由 VPN 连接。
!
**CGW 容器的实现 **
正常的容器运行中的进程信息可见下图!
可以看到容器中共有 4 个进程,其功能分别为:
一、cgw.sh 容器启动脚本,主要在容器开始运行时完成以下动作 ;
a. 根据传入的环境变量生成 strongSwan、BIRD 的配置文件
b. 配置 virtual tunnel interface 以便将两条 ipsec 隧道暴露给动态路由软件
c. 拉起 strongSwan、BIRD
二、strongSwan 守护进程,负责与虚拟专用网关协商和交换加密、解密密钥、调用 Linux 内核中 IPSec 相关的系统调用设定隧道;
三、BIRD 守护进程 ;
a. 与虚拟专用网关的两个端点分别建立 BGP 邻居关系并以 10 秒的间隔持续检测对端是否健康
b. 与本地网络中其他路由器建立 BGP 邻居关系并将路由信息发布到本地网络和 AWS VPC;实现本地网络与 AWS VPC 的互通
c. 当两条隧道中的一条由于某种原因发生故障,BIRD 会检测到邻居状态的改变从而自动将流量切换到另外一条健康的隧道中去,从而实现了 VPN 连接的冗余
** 扩展性和可用性 **
一、如果需要与多个不同的 VPC 建立多条 VPN 连接,那么只需要重复前面建立连接的步骤在同一台服务器上创建多个 cgw 容器,分别建立与不同的虚拟专用网关的 VPN 连接即可。如下图所示
!
但是要做到不同 VPC 之间的流量互通,我们还需要在多个 cgw 容器之间建立 iBGP 邻居关系。传统的 iBGP 互联要求 full mesh,这里我们为了简化部署和配置,可以在容器所在服务器上运行 BIRD 并将其配置为路由反射器,所有 cgw 容器都与路由反射器建立邻居关系并学习到其他容器、隧道的路由信息,从而实现多个 VPN 连接之间的流量互通。
二、如果需要保证高可用,需要在不同的 VPN 网关之间实现互为备份,那么可以通过运行两台物理服务器,各自建立与 AWS VPC 的 VPN 连接,通过动态路由协议来实现故障流量切换;
!
三、如果需要进一步增大吞吐量,超出单个服务器的可用带宽的情况下,我们可以将 cgw 容器分散到多个物理服务器上实现水平扩展;同样的,在服务器之间需要建立 iBGP 邻居关系并交换路由信息;
!
** 作者介绍:**
!
丁成银
亚马逊 AWS 解决方案架构师,获得 AWS 解决方案架构师专业级认证和 DevOps 工程师专业级认证。负责基于 AWS 的云计算方案架构的咨询和设计,同时致力于 AWS 云服务在国内的应用和推广,在数字媒体、电信、互联网和游戏、企业混合 IT 等方面有着丰富的实践和设计经验。在加入 AWS 之前,历任数字媒体娱乐系统工程师、宽带业务架构师、云解决方案架构师,负责数字媒体娱乐系统、云计算解决方案等服务的咨询和架构设计工作。

本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/ipsec-docker/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布