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
系统角色配置主机到主机的连接,这将配置清单文件中列出的所有受管节点。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
步骤
创建一个包含以下内容的 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_firewall
和vpn_manage_selinux
都被设为true
,因此vpn
角色使用firewall
和selinux
角色来管理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>
注意连接仅在受管节点上配置,而不在外部节点上配置。
可选:您可以使用
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
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在受管节点上,确认连接已成功载入:
# ipsec status | grep <connection_name>
将
<connection_name>
替换为来自此节点的连接的名称,例如managed_node1-to-managed_node2
。注意默认情况下,从每个系统的角度来看,角色为其创建的每个连接生成一个描述性名称。例如,当在
managed_node1
和managed_node2
之间创建连接时,此连接在managed_node1
上的描述性名称为managed_node1-to-managed_node2
,但在managed_node2
上,连接的描述性名称为managed_node2-to-managed_node1
。在受管节点上,确认连接是否成功启动:
# ipsec trafficstatus | grep <connection_name>
可选:如果连接没有成功加载,请输入以下命令来手动添加连接。这提供了更具体的信息,说明连接为何不能建立:
# 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)加密库包含必要的证书。
流程
创建一个包含以下内容的 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_firewall
和vpn_manage_selinux
都被设为true
,因此vpn
角色使用firewall
和selinux
角色来管理vpn
角色使用的端口。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
其他资源
-
/usr/share/ansible/roles/rhel-system-roles.vpn/README.md
文件 -
/usr/share/doc/rhel-system-roles/vpn/
目录