5.13. 使用 RHEL 系统角色配置带有 IPsec 的 VPN 连接


使用 vpn 系统角色,您可以使用 Red Hat Ansible Automation Platform 在 RHEL 系统上配置 VPN 连接。您可以使用它来设置主机到主机、网络到网络、VPN 远程访问服务器和网格配置。

对于主机到主机连接,角色使用默认参数在 vpn_connections 列表中的每一对主机之间设置 VPN 通道,包括根据需要生成密钥。另外,您还可以将其配置为在列出的所有主机之间创建 机会主义网格配置。该角色假定 hosts 下的主机名称与 Ansible 清单中使用的主机的名称相同,并且您可以使用这些名称来配置通道。

注意

vpn RHEL 系统角色目前仅支持 Libreswan (其是一种 IPsec 实现)作为 VPN 提供者。

5.13.1. 使用 vpn RHEL 系统角色,创建具有 IPsec 的主机到主机的 VPN

您可以通过在控制节点上运行 Ansible playbook 来使用 vpn 系统角色配置主机到主机的连接,这将配置清单文件中列出的所有受管节点。

先决条件

步骤

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    - name: Host to host VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      roles:
        - rhel-system-roles.vpn
      vars:
        vpn_connections:
          - hosts:
              managed-node-01.example.com:
              managed-node-02.example.com:
        vpn_manage_firewall: true
        vpn_manage_selinux: true

    此 playbook 通过使用系统角色自动生成的密钥和预共享的密钥身份验证来配置连接 managed-node-01.example.com-to-managed-node-02.example.com。因为 vpn_manage_firewallvpn_manage_selinux 都被设为 true,因此 vpn 角色使用 firewallselinux 角色来管理 vpn 角色使用的端口。

    要配置从受管主机到清单文件中未列出的外部主机的连接,请将以下部分添加到主机的 vpn_connections 列表中:

        vpn_connections:
          - hosts:
              managed-node-01.example.com:
              <external_node>:
                hostname: <IP_address_or_hostname>

    这将配置一个额外的连接:managed-node-01.example.com-to-<external_node>

    注意

    连接仅在受管节点上配置,而不在外部节点上配置。

  2. 可选:您可以使用 vpn_connections 中的其它部分(如,控制平面和数据平面)为受管节点指定多个 VPN 连接:

    - name: Multiple VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      roles:
        - rhel-system-roles.vpn
      vars:
        vpn_connections:
          - name: control_plane_vpn
            hosts:
              managed-node-01.example.com:
                hostname: 192.0.2.0 # IP for the control plane
              managed-node-02.example.com:
                hostname: 192.0.2.1
          - name: data_plane_vpn
            hosts:
              managed-node-01.example.com:
                hostname: 10.0.0.1 # IP for the data plane
              managed-node-02.example.com:
                hostname: 10.0.0.2
  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  4. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  1. 在受管节点上,确认连接已成功载入:

    # ipsec status | grep <connection_name>

    <connection_name> 替换为来自此节点的连接的名称,例如 managed_node1-to-managed_node2

    注意

    默认情况下,从每个系统的角度来看,角色为其创建的每个连接生成一个描述性名称。例如,当在 managed_node1managed_node2 之间创建连接时,此连接在 managed_node1 上的描述性名称为 managed_node1-to-managed_node2,但在 managed_node2 上,连接的描述性名称为 managed_node2-to-managed_node1

  2. 在受管节点上,确认连接是否成功启动:

    # ipsec trafficstatus | grep <connection_name>
  3. 可选:如果连接没有成功加载,请输入以下命令来手动添加连接。这提供了更具体的信息,说明连接为何不能建立:

    # ipsec auto --add <connection_name>
    注意

    加载和启动连接过程中可能会出现的任何错误都在 /var/log/pluto.log 文件中报告。由于这些日志很难解析,因此改为手动添加连接,以从标准输出获得日志消息。

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件
  • /usr/share/doc/rhel-system-roles/vpn/ 目录

5.13.2. 使用 vpn RHEL 系统角色创建带有 IPsec 的机会性网状 VPN 连接

您可以使用 vpn 系统角色来配置机会性网状 VPN 连接,该连接通过在控制节点上运行 Ansible playbook 来使用证书进行身份验证,这将配置清单文件中列出的所有受管节点。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • /etc/ipsec.d/ 目录中的 IPsec 网络安全服务(NSS)加密库包含必要的证书。

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    - name: Mesh VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com
      roles:
        - rhel-system-roles.vpn
      vars:
        vpn_connections:
          - opportunistic: true
            auth_method: cert
            policies:
              - policy: private
                cidr: default
              - policy: private-or-clear
                cidr: 198.51.100.0/24
              - policy: private
                cidr: 192.0.2.0/24
              - policy: clear
                cidr: 192.0.2.7/32
        vpn_manage_firewall: true
        vpn_manage_selinux: true

    通过在 playbook 中定义 auth_method: cert 参数来配置用证书进行身份验证。默认情况下,节点名称用作证书的昵称。在本例中,这是 managed-node-01.example.com。您可以使用清单中的 cert_name 属性来定义不同的证书名称。

    在本例流程中,控制节点是您将运行 Ansible playbook 的系统,其与受管节点(192.0.2.0/24)和 IP 地址为 192.0.2.7 的节点共享同样的无类别域间路由(CIDR)号。因此,控制节点属于为 CIDR 192.0.2.0/24 自动创建的私有策略。

    为防止在操作期间出现 SSH 连接丢失,控制节点的清晰策略包含在策略列表中。请注意,在策略列表中还有一个项 CIDR 等于 default。这是因为此 playbook 覆盖了默认策略中的规则,以使其为私有,而非私有或清晰。

    因为 vpn_manage_firewallvpn_manage_selinux 都被设为 true,因此 vpn 角色使用 firewallselinux 角色来管理 vpn 角色使用的端口。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件
  • /usr/share/doc/rhel-system-roles/vpn/ 目录
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.