在 AWS 运行 VNS3 配置 ipsec VPN

354 阅读9分钟

现在大部分企业都会使用到公有云。目前公有云都支持配置在企业本地数据中心或企业办公网络与专有网络 VPC(Virtual Private Cloud)之间建立网络连接,建立连接后,企业本地数据中心或企业办公网络可以直接访问VPC内的资源。

在 AWS 上与合作伙伴对接 ipsec vpn 时候,你就会发现 AWS ipsec VPN 某些参数不支持(比如不支持 3DES加密算法)。AWS 技术工程师之前给的解决方案是可以询问对接的设备型号,然后在 aws marketplace 寻找支持该厂家设备型号的 AMI,然后进行安装测试对接。

在这里介绍下另外个解决方案 VNS3。VNS3 是一种设备即服务,可提供网络安全和连接:安全设备、应用程序交付控制器和统一威胁管理全部集成到基于云的应用程序中。下面来看下如何在 AWS 部署 VNS3 和如何使用它进行 ipsec vpn 配置以及 firewall 配置。

VNS3 在 AWS 安装

创建EC2, 选择 AMI 和 Instance type

在 EC2 -> Instances -> Launch an instance ,然后在 Application and OS Images (Amazon Machine Image) 点击 Browse more AMls,再点击 AWS Marketplace AMIs 。在搜索框里输入 VNS3 进行搜索。

AWS Marketplace AMIs 里提供2个 AMI,可以根据业务情况选择对应的 AMI。Free Edition 只可以创建一个 IPsec Endpoint,一般只作测试用途。其他版本可通过这两个版本创建好实例后,购买 license 再调用它的 API 进行版本升级。

选择好对应的 AMI,点击 Subscribe on instance launch 或者 Subscribe now

一般情况它会自动选择推荐的实例类型,这个 AMI 推荐的是 t3a.small

创建一个单独的 VPC 子网

Cohesive Networks 建议为 VNS3 控制器创建一个单独小型的 VPC 子网(比如/28),该子网与为应用程序实例定义的一个或多个子网不同。在我以前所在的金融公司,也会有类似的网络架构划分,与合作伙伴对接的网络区域称为 partner 区。合作伙伴的流量一般不能直接到应用所在的网段,需要经 partner 区作转发。

VPC 子网可以在启动实例这个页面上的 Network settings -> Create new subnet 创建,也可在 VPC dashboard -> Virtual private cloud -> subnet -> Create new subnet 创建。

创建一个新的安全组

安全组包含以下入站规则:

  • Public IP 的 TCP 端口 8000 -> VNS3 controller dashboard
  • UDP 端口 500 -> 用于 IPsec VPN 连接的第一阶段或 IKE(互联网密钥交换)组件
  • ESP (50) -> IPsec 协商时用于 IPsec VPN 连接的第 2 阶段或 ESP(封装安全有效负载)组件
  • UDP 端口 4500 -> 当使用 NAT 遍历封装时,该端口用于 IPsec VPN 连接的第 2 阶段或 ESP(封装安全负载)组件
  • ICMP

启动 vns3 实例

这时候可以点击启动 VNS3 实例。然后在 EC2 dashboard 选择上对应的实例。

禁用实例网卡的源/目标检查

在 Actions -> Networking -> Change soure/destination check

勾选 Stop,然后点击 Save。

绑定弹性 public ip

创建的实例如果选择的是自动分配公网ip,机器在停止状态就会被重新分配,无法固定下来。比较推荐申请 Elastic IP 关联到实例上。这样我们在更改实例配置需要停止实例的时候,public ip也不会被回收。

在 EC2 -> Elastic IP addresses 申请 Elastic IP ,有就不用申请了。

点击申请的 Elastic IP,然后点击 Associate Elastic IP address

关联到 VNS3 实例上,点击 Associate。

Logging in VNS3 Web

VNS3 实例创建好之后,需要等一段时间初始化。初始化完成就可以通过它的 web dashboard 去管理和配置。

vns3 web 地址: https://VNS3-ip:8000

初始 username - vnscubed

初始 password - 实例 ID (例如这里是 i-0e08c91b237d1fb64)

登陆成功后,可以看到提示尽快重置密码。

VNS3 controller dashboard

VNS3 面板上可以查看系统状态,抓包,ipsec vpn 配置和防火墙配置等。比较常用的就是抓包,ipsec vpn配置和防火墙配置。

Network Sniffers

在 Runtime -> Network Sniffer 这里可以抓包,使用 tcpdump 语法。它输出的形式和 tcpdump 命令差不多,你可以将抓到的数据包下载到本地使用像 wireshark 工具进行查看。

IPSec

Unsupported IPsec Parameters

对接 ipsec vpn 时候需要了解下 VNS3 有哪些参数不支持

  • Main mode vs. Aggressive (VNS3 is “Main” mode only)
  • Authentication Header (VNS3 do not support Authentication Header or “AH”)
  • Tunnel vs. Transport Mode (VNS3 is “Tunnel” mode only)
  • X509 Certificates vs. PSK (VNS3 supports PSK authentication only)

VNS3 提供 GUI 配置 IPsec VPN,可以非常简单方便进行配置。ipsec VPN 配置需要先创建 endpoint 然后再创建 tunnel。

创建 endpoint

在 Connection -> IPsec 可以配置 Ipsec VPN

点击 New Endpoint 创建新的 ipsec endpoint

配置信息参数需要跟远端设备要保持一致,比如要跟如下对端建立 ipsec vpn

VNS3 配置如下

更多 ipsec parameters 可以参考官档 docs.cohesive.net/docs/vns3/i…

创建 tunnels

创建好 endpoint,可以在对应的 endpoint 上 Action -> New tunnel 创建 ipsec tunnel 配置感兴趣流。

配置好可以查看 tunnel 状态。

也可以点击 Show log 查看日志,进行问题定位

配置 AWS 路由表

另外还需要配置感兴趣流量的子网 AWS 路由表,我们需要将 ipsec 对端的子网路由指向到 VNS3 实例。

VPC -> Route tables -> 对应的路由表 -> Edit routes

Destination 填写对应网段,Target 选择对应 Instance 后面它会自动转换成实例的Network Interface,也可以直接一步到位选择对应的network Interface。

Firewall

VNS3 防火墙是 Linux 的 iptables 的封装。它也是由表,链,规则组成,用户在VNS3 不能像 linux iptables 那样可以创建自定义链。VNS3 防火墙还支持网络地址转换 (SNAT,DNAT)、端口转发、网络映射、SNMP 支持和流量复制。

Tables and Traffic Order

VNS3 有 5 个系统表:PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING。而 linux iptables 是 filter,nat,mangle,raw 这4个表,PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING 只是这几个表其中的链。总结来说,VNS3 将复杂的 iptables 逻辑简化为五个主要“系统表”,以便于用户更容易地管理流量规则和策略。同时,这些表与 iptables 中的链紧密映射,帮助用户快速理解和使用。流量将从一个表移动到另一个表,并通过 VNS3 根据规则条件与规则进行匹配并采取定义的规则操作。规则的表和位置决定了何时将其与流量进行匹配

VNS3 数据包流向

VNS3 数据包流向

通常会存在三个流量路径:VNS3 路由流量、VNS3 终止流量和 VNS3 发起流量。我们主要看下使用最多的VNS3 路由流量。

VNS3 路由流量:这是源自 VNS3 外部且目的地位于 VNS3 外部的流量。表路径如下:

  1. PREROUTING
  2. FORWARD
  3. POSTROUTING

Rules

规则包含您的 VNS3 网络策略。这些规则决定了哪些流量流向哪里。每个规则都有一个表和位置。规则的表和位置决定了何时将其与流量进行匹配。规则的索引为 0,并按从最小到最大的顺序排列。这意味着位置 0 的规则将首先匹配,然后是 1,然后是 2,依此类推。规则也可以分配给 1 个或多个组,或者具有注释以添加解释。每个规则都提供了一个用于定位的唯一 ID。最后,规则可以处于启用或禁用状态。

再看下默认策略,linux iptables 可以设置默认策略,比如没有找到匹配规则,就匹配默认规则。而 VNS3 的默认规则是允许,不过是有条件的允许,比如你创建了隧道配置感兴趣流,默认不用放行感兴趣流网段策略,其他来源的流量还是需要加下防火墙策略。

Linux iptables filter 表链默认规则

Linux iptables filter 表链默认规则

If your customer rules don’t reject a packet, it will be allowed by default. However, this “default” is fairly restrictive. Traffic is allowed from “known” VLANS. Known VLANs are VLANS that are listed in IPSec tunnel rules, and the VNS3 virtual VLAN. Allowing traffic from other sources requires adding firewall rules to accept that traffic.

VNS3 Firewall 规则

创建防火墙规则

VNS3 控制台提供了一种构建策略规则的简单方法。在“规则”页面中,单击“添加规则” :

可以在上面使用类似iptables 语法创建防火墙规则,也可按它提供的规则导航创建。

比如创建以下需求:

丢弃从 1.1.1.1 到 2.2.2.2 的所有数据包

INPUT -s 1.1.1.1 -d 2.2.2.2 -j DROP

丢弃来自 192.168.3.0/24(整个子网)的所有流量(192.168.3.11 除外):

INPUT -s 192.168.3.11/32 -j ACCEPT
INPUT -s 192.168.3.0/24 -j DROP

VNS3 controller 面板也提供了防火墙导入和导出的功能,另外 VNS3 也提供了API 接口进行防火墙增删改查,有兴趣可自行查阅。docs.cohesive.net/docs/vns3/f…

troubleshooting

当流量无法正常访问,可以先检查下调用链路。比如我们线上的流量是 app -> vns3 -> partner firewall -> partner app。先在 vns3 抓包看流量是否可以正常到达 vns3,检查他们的 AWS 安全组。还有一个很重要的是必须关闭 vns3 网卡的源/目标检查,开启状态就相当于路由器或者 linux 没打开 ip.forward 转发功能。另外再检查下 VNS3 防火墙是否有规则限制。

最后

VNS3 上手难度还是比较低的,对比新版开源strongswan配置 ipsec vpn 简直简单太多了。但毕竟免费版本只支持一个 endpoint,而 Lite 版本有 4 个,不过需要150$每月。不管你是哪个版本遇到问题,都可以提交工单寻求帮助。目前 VNS3 只提供 web dashboard 的方式去管理,没有 ssh 访问。

参考链接:

docs.cohesive.net/docs/cloud-…

docs.cohesive.net/docs/vns3/i…

docs.cohesive.net/docs/troubl…