HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

使用 Docker 封装 IPSec 安全网关

  • 2019-11-20
  • 本文字数:2329 字

    阅读完需:约 8 分钟

使用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隧道互联。
![](https://s3.cn-north-1.amazonaws.com.cn/images-bjs/0526-1.png)
图中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连接。
![](https://s3.cn-north-1.amazonaws.com.cn/images-bjs/0526-2.jpg)
**CGW容器的实现**
正常的容器运行中的进程信息可见下图![](https://s3.cn-north-1.amazonaws.com.cn/images-bjs/0526-3.png)
可以看到容器中共有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连接即可。如下图所示
![](https://s3.cn-north-1.amazonaws.com.cn/images-bjs/0526-4.jpg)
但是要做到不同VPC之间的流量互通,我们还需要在多个cgw容器之间建立iBGP邻居关系。传统的iBGP互联要求full mesh,这里我们为了简化部署和配置,可以在容器所在服务器上运行BIRD并将其配置为路由反射器,所有cgw容器都与路由反射器建立邻居关系并学习到其他容器、隧道的路由信息,从而实现多个VPN连接之间的流量互通。
二、如果需要保证高可用,需要在不同的VPN网关之间实现互为备份,那么可以通过运行两台物理服务器,各自建立与AWS VPC的VPN连接,通过动态路由协议来实现故障流量切换;
![](https://s3.cn-north-1.amazonaws.com.cn/images-bjs/0526-5.jpg)
三、如果需要进一步增大吞吐量,超出单个服务器的可用带宽的情况下,我们可以将cgw容器分散到多个物理服务器上实现水平扩展;同样的,在服务器之间需要建立iBGP邻居关系并交换路由信息;
![](https://s3.cn-north-1.amazonaws.com.cn/images-bjs/0526-6.jpg)
**作者介绍:**
![](https://s3.cn-north-1.amazonaws.com.cn/images-bjs/Ding+Chandler.jpg)
丁成银
亚马逊AWS解决方案架构师,获得AWS解决方案架构师专业级认证和DevOps工程师专业级认证。负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,在数字媒体、电信、互联网和游戏、企业混合IT等方面有着丰富的实践和设计经验。在加入AWS之前,历任数字媒体娱乐系统工程师、宽带业务架构师、云解决方案架构师,负责数字媒体娱乐系统、云计算解决方案等服务的咨询和架构设计工作。
复制代码


TAGS:


AWS VPC


,


Docker


,


大咖专栏


,


安全


,


网络和内容发布


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/ipsec-docker/


2019-11-20 08:00935

评论

发布
暂无评论
发现更多内容

【网络安全】打造安全的应用程序:了解 SSDLC 的关键步骤

sidiot

SSDLC 6 月 优质更文活动

四大因素解析:常规阻抗控制为什么只能是10%?

华秋电子

警惕度量指标陷阱

BY林子

度量 绩效考核 质量度量

“事后达尔文”—— 游戏业务效果评估方法实践

vivo互联网技术

效果评估 分层抽样 事后达尔文

如何在金融企业推进故障演练?中国人寿分阶段实践总结

TakinTalks稳定性社区

保护数据隐私:深入探索Golang中的SM4加密解密算法

王中阳Go

Go 高效工作 学习方法 6 月 优质更文活动

Vue3中常用的Composition(组合)API-shallowReavtive和shallowRef

不觉心动

6 月 优质更文活动

Nautilus Chain:模块化Layer3架构为RWA赛道构建基础设施

鳄鱼视界

AI近十年盘点:纵览AI发展历程,探寻AI未来走向

Baihai IDP

人工智能 深度学习 白海科技 AI十年盘点

Apache RocketMQ EventBridge:构建下一代事件驱动引擎

阿里巴巴云原生

Apache 阿里云 云原生 EventBridge

深度Q网络:DQN项目实战CartPole-v0

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 6 月 PK 榜

Ionic用于构建跨平台移动应用程序的开源框架

没有用户名丶

对线面试官-Redis(缓存的三大问题)

派大星

Java 面试题

Vue3中常用的Composition(组合)API-自定义hook函数

不觉心动

6 月 优质更文活动

ABAQUS 在车辆驻车制动系统中的应用

思茂信息

abaqus abaqus软件 abaqus有限元仿真 有限元仿真技术

炫酷教程:用全代码编写WPF程序,轻松掌握.NET深呼吸技巧!

EquatorCoco

.net 开源WPF项目

Nop平台中的模块依赖关系

canonical

开源 低代码 低代码平台 Nop平台

STM32采集传感器数据通过冒泡排序取稳定值

DS小龙哥

6 月 优质更文活动

攻克信创难题|海泰新一代信创迁移平台解决方案“神农二号”问世

电子信息发烧客

飞桨携手登临解读软硬一体技术优势,共推AI产业应用落地

飞桨PaddlePaddle

人工智能 百度 飞桨

Vue3中常用的Composition(组合)API-readonly 与 shallowReadonly

不觉心动

6 月 优质更文活动

Vue3中常用的Composition(组合)API-toRaw 与 markRaw

不觉心动

6 月 优质更文活动

【JAVA】浅说 AQS

sidiot

Java AQS 6 月 优质更文活动

【AI】浅谈使用正则化防止过拟合(下)

sidiot

人工智能 正则化 6 月 优质更文活动

聚力领航,2023 开放原子全球开源峰会燃爆夏日开源热

开放原子开源基金会

Vue3中常用的Composition(组合)API-toRef API和toRefs API

不觉心动

6 月 优质更文活动

揭秘虚拟人技术:独家解析让你彻底领悟其原理!

EquatorCoco

人工智能 AI 数字人 虚拟人

蔚来手撕代码题:三个线程循环打印ABC

王磊

java面试

【AI】浅谈使用正则化防止过拟合(上)

sidiot

人工智能 正则化 6 月 优质更文活动

Vue3中常用的Composition(组合)API-set的两个注意点

不觉心动

6 月 优质更文活动

Vue3中常用的Composition(组合)API-watchEffect()函数

不觉心动

6 月 优质更文活动

使用Docker封装IPSec安全网关_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章