30.3. 使用 vpn RHEL 系统角色使用基于证书的身份验证配置 IPsec 网格 VPN


Libreswan 支持创建一个机会网格,以便在每个主机上带有单个配置的大量主机之间建立 IPsec 连接。将主机添加到网格中不需要更新现有主机上的配置。为提高安全性,请在 Libreswan 中使用基于证书的身份验证。

通过使用 vpn RHEL 系统角色,您可以在受管节点之间自动化配置带有基于证书的身份验证的 VPN 网格。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您可以为每个受管节点准备一个 PKCS #12 文件:

    • 每个文件包含:

      • 证书颁发机构(CA)证书
      • 节点的私钥
      • 节点的客户端证书
    • 文件被命名为 <managed_node_name_as_in_the_inventory>.p12
    • 文件存储在与 playbook 相同的目录中。

流程

  1. 编辑 ~/inventory 文件,并附加 cert_name 变量:

    managed-node-01.example.com cert_name=managed-node-01.example.com
    managed-node-02.example.com cert_name=managed-node-02.example.com
    managed-node-03.example.com cert_name=managed-node-03.example.com
    Copy to Clipboard Toggle word wrap

    cert_name 变量设置为每个主机的证书中使用的通用名称(CN)字段的值。通常,CN 字段被设置为完全限定域名(FQDN)。

  2. 将敏感变量存储在加密的文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard Toggle word wrap
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pkcs12_pwd: <password>
      Copy to Clipboard Toggle word wrap
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  3. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Install LibreSwan
          ansible.builtin.package:
            name: libreswan
            state: present
    
        - name: Identify the path to IPsec NSS database
          ansible.builtin.set_fact:
            nss_db_dir: "{{ '/etc/ipsec.d/' if
              ansible_distribution in ['CentOS', 'RedHat']
              and ansible_distribution_major_version is version('8', '=')
              else '/var/lib/ipsec/nss/' }}"
    
        - name: Locate IPsec NSS database files
          ansible.builtin.find:
            paths: "{{ nss_db_dir }}"
            patterns: "*.db"
          register: db_files
    
        - name: Remove IPsec NSS database files
          ansible.builtin.file:
            path: "{{ item.path }}"
            state: absent
          loop: "{{ db_files.files }}"
          when: db_files.matched > 0
    
        - name: Initialize IPsec NSS database
          ansible.builtin.command:
            cmd: ipsec initnss
    
        - name: Copy PKCS #12 file to the managed node
          ansible.builtin.copy:
            src: "~/{{ inventory_hostname }}.p12"
            dest: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            mode: 0600
    
        - name: Import PKCS #12 file in IPsec NSS database
          ansible.builtin.shell:
            cmd: 'pk12util -d {{ nss_db_dir }} -i /etc/ipsec.d/{{ inventory_hostname }}.p12 -W "{{ pkcs12_pwd }}"'
    
        - name: Remove PKCS #12 file
          ansible.builtin.file:
            path: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            state: absent
    
        - name: Opportunistic mesh IPsec VPN with certificate-based authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - opportunistic: true
                auth_method: cert
                policies:
                  - policy: private
                    cidr: default
                  - policy: private
                    cidr: 192.0.2.0/24
                  - policy: clear
                    cidr: 192.0.2.1/32
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    opportunistic: true
    在多个主机之间启用机会网格。policies 变量定义哪些子网和主机流量必须或可以加密,它们中哪些应该继续使用明文连接。
    auth_method: cert
    启用基于证书的身份验证。这要求您在清单中指定每个受管节点的证书的昵称。
    policies: <list_of_policies>

    以 YAML 列表格式定义 Libreswan 策略。

    默认策略是 private-or-clear。要将它改为 private,上面的 playbook 包含默认 cidr 条目的一个相应策略。

    如果 Ansible 控制节点与受管节点在同一个 IP 子网中,要防止执行 playbook 期间丢失 SSH 连接,请为控制节点的 IP 地址添加一个 clear 策略。例如,如果应该为 192.0.2.0/24 子网配置网格,并且控制节点使用 IP 地址 192.0.2.1,则您需要一个用于192.0.2.1/32clear 策略,如 playbook 中所示。

    有关策略的详情,请查看安装了 Libreswan 的系统上的 ipsec.conf (5) 手册页。

    vpn_manage_firewall: true
    定义角色在受管节点上的 firewalld 服务中打开所需的端口。
    vpn_manage_selinux: true
    定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件。

  4. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  5. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 在网格的一个节点上,ping 另一个节点来激活连接:

    [root@managed-node-01]# ping managed-node-02.example.com
    Copy to Clipboard Toggle word wrap
  2. 确认连接是否处于活跃状态:

    [root@managed-node-01]# ipsec trafficstatus
    006 #2: "private#192.0.2.0/24"[1] ...192.0.2.2, type=ESP, add_time=1741938929, inBytes=372408, outBytes=545728, maxBytes=2^63B, id='CN=managed-node-02.example.com'
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat