strongswan IKE 的两种维护方式

587 阅读6分钟

strongswan IKE 的维护方式有两种:

  1. ipsec (ipsec.conf)
  2. vici (swanctl.conf)

在 ipsec.conf 的使用场景中,所有 ipsec connection 都在一个配置文件中,每当有 connection 变更,都需要重启一次服务。这在云服务场景,是无法维护的。不可能用户为一个新的站点,添加了一个新的 ipsec conn,服务都需要重启一下,这样所有连接都需要重连一次。

image.png

星型(中心辐射型)拓扑

比如我有一个中心 IPSec vpn 网关, 那这个网关是不能重启的,所以中心网关上,不能用一个 ipsec.conf 来提供服务。所以中心网关必须使用一种面向每一个 ipsec connection 能够用逐个处理的架构。

strongswan 实现了这个新的架构,叫做 vici

那么我们来详细了解一下 StrongSwan Vici 的全称、架构设计,以及它在整个 StrongSwan 系统中的作用。

1. Vici 的全称:

Vici 的全称是 Versatile IKE Configuration Interface,中文可以翻译为“通用 IKE 配置接口”。

2. 架构设计:

Vici 的架构设计基于客户端-服务器模型,主要包含以下几个组件:

  • Vici Server (Charon): Vici Server 是 StrongSwan 的 IKE 守护进程 (Charon) 的一部分。 它监听 Unix 域套接字 (Unix domain socket),等待客户端连接,并处理来自客户端的配置和控制请求。 无论是 strongswan-charon 还是 charon-systemd,都包含了 Vici Server 的功能。

  • Vici Client (swanctl): Vici Client 是一个独立的命令行工具,用于通过 Vici 接口与 Vici Server 进行通信。 它允许用户加载配置、启动/停止连接、查看状态等。 swanctl 是 StrongSwan 提供的官方 Vici Client。

  • Vici 协议: Vici 协议定义了客户端和服务器之间通信的消息格式和交互流程。 它基于简单的文本格式,易于解析和实现。

Vici 的工作流程:

  1. 客户端发起连接: Vici Client (例如 swanctl) 通过 Unix 域套接字连接到 Vici Server (Charon)。

  2. 客户端发送请求: 客户端使用 Vici 协议将配置或控制请求发送到服务器。 例如,客户端可以发送一个 load-conn 请求来加载一个新的 VPN 连接配置。

  3. 服务器处理请求: Vici Server 接收到请求后,会对请求进行解析和处理。 如果请求是合法的,服务器会执行相应的操作,例如加载配置、启动连接、停止连接等。

  4. 服务器发送响应: 服务器将处理结果以 Vici 协议格式发送回客户端。 响应可以包含成功或失败的状态码,以及其他相关信息。

  5. 客户端接收响应: 客户端接收到响应后,会对响应进行解析,并根据结果采取相应的行动。 例如,如果连接加载成功,客户端可能会显示一条成功消息。

Vici 架构图:

+---------------------+     +---------------------+
|   Vici Client       |     |   Vici Server       |
|   (e.g., swanctl)    |     |   (Charon Daemon)   |
+---------------------+     +---------------------+
         |                      |
         | Unix Domain Socket   |
         ---------------------->|
         |                      |
         | Vici Protocol        |
         <----------------------|
         |                      |
+---------------------+     +---------------------+

3. Vici 在 StrongSwan 系统中的作用:

Vici 在 StrongSwan 系统中扮演着关键的角色,它实现了以下功能:


-   `swanctl --add-connection <connection_name> <connection_parameters>`:添加一个新的 VPN 连接。
-   `swanctl --load-all` 加载配置文件
-   `swanctl --initiate <connection_name>`:启动一个 VPN 连接。
-   `swanctl --terminate <connection_name>`:停止一个 VPN 连接。
-   `swanctl --list-connections`:列出所有已配置的 VPN 连接。

  • 动态配置: Vici 允许在 StrongSwan 运行时动态地加载、修改和删除 VPN 连接配置,而无需重启 StrongSwan 服务。 这对于需要频繁更改配置的场景非常有用。

  • 细粒度控制: Vici 允许对每个 VPN 连接进行精细化控制,例如启动、停止、重新协商连接,查看连接状态等。

  • 远程管理: Vici 可以通过 Unix 域套接字进行远程管理,这意味着你可以通过网络连接到 StrongSwan 服务器,并使用 swanctl 命令来管理 VPN 连接。

  • 可编程性: Vici 协议是基于文本的,易于解析和实现。 这使得你可以使用任何编程语言编写自定义的 Vici 客户端,从而实现 StrongSwan 的自动化管理。

总结:

Vici (Versatile IKE Configuration Interface) 是 StrongSwan 的通用 IKE 配置接口。 它基于客户端-服务器模型,通过 Unix 域套接字和 Vici 协议实现动态配置、细粒度控制、远程管理和可编程性。 Vici 在 StrongSwan 系统中扮演着关键的角色,使得 StrongSwan 能够适应各种复杂的 VPN 部署场景。

中心 IPSec vpn 网关和分步式 网关的启动方式

image.png

# swanctl.conf site to site 

connections {
{% for conn in connections %}
    net-net-{{ conn.name }} {
        local {
            auth = {{ conn.auth }}
            certs = tls.crt
        }
        remote {
            auth = {{ conn.auth }}
            id = "CN={{ conn.remoteCN }}"
        }
        remote_addrs = {{ conn.remoteCN }}
        children {
            net-net {
                local_ts = {{ conn.localPrivateCidrs }}
                remote_ts = {{ conn.remotePrivateCidrs }}
                dpd_action = restart # 关注这个
                start_action = trap  # 关注这个
            }
        }
        version = {{ conn.ikeVersion }}
        proposals = {{ conn.proposals }}
    }
{% endfor %}
}


这段配置描述了一个 VPN 连接, 启动和连接重连的两个点:

  • dpd_action = restart

    • dpd_action 定义了当 Dead Peer Detection (DPD,死对端检测) 检测到连接的对端不再响应时应该采取的动作。
    • restart 表示当 DPD 检测到对端失效时,尝试重新启动 (重新协商) VPN 连接。 这是一个常用的选项,用于在网络出现短暂故障后自动恢复 VPN 连接。
  • start_action = trap

    • start_action 定义了 StrongSwan 应该如何处理这个连接的启动。
    • trap 表示 "被动" 模式。 StrongSwan 不会主动尝试建立连接。 而是等待对端发起连接请求。 只有当对端尝试连接时,StrongSwan 才会响应并建立 VPN 连接。 这通常用于中心辐射型 VPN 网络,其中中心站点接受来自多个分支站点的连接,但不主动连接到分支站点。
  1. 配置了 DPD,以便在对端失效时自动重启连接。
  2. 配置为 "trap" 模式,意味着 StrongSwan 会被动等待对端发起连接。
  3. 配置为 "start" 模式, 意味着在 swanctl --load-all 加载配置后,立即尝试建立连接。

使用场景:

这种配置通常用于以下场景:

  • 中心辐射型 VPN (Hub-and-Spoke VPN):  中心站点配置为 start_action = trap,等待分支站点发起连接。 分支站点配置为 start_action = start,主动连接到中心站点。(中心节点肯定有更好的高可用设计,等待连接可以节省开销,分布式点发现连接断开后,自动发起重连即可)
  • 动态 VPN 网络:  VPN 连接的参数 (例如 IP 地址、子网) 是动态分配的。 使用模板引擎可以根据动态获取的参数生成 VPN 配置。

如何安装

ipsec : apt install strongswan-charon

civi : apt install charon-systemd

2. 优缺点比较:

表格

特性strongswan-charoncharon-systemd
依赖strongswan-startersystemd 库 (即使不运行 systemd)
systemd 集成尝试与 systemd 集成 (即使 systemd 没有运行,也会尝试使用 systemd 库的函数)
启动方式通过 strongswan-starter 脚本直接运行
适用场景通用,适用于所有容器更适合运行 systemd 的容器,但也可以在没有 systemd 的容器中使用
优点简单,无额外的 systemd 依赖如果容器运行 systemd,可以利用 systemd 的服务管理功能
缺点需要 strongswan-starter 脚本来启动和管理在没有 systemd 的情况下运行,会引入不必要的 systemd 依赖,并且无法发挥其优势
配置方式通常与 ipsec.conf 配置文件一起使用通常与 Vici 接口 (swanctl) 一起使用

如果使用容器,不用关注 systemd 集成的影响,毕竟重点是使用 ipsec.conf 还是 civi (swanctl.conf)