Red Hat Training

A Red Hat training course is available for RHEL 8

4.6. 配置网格 VPN

网格 VPN 网络(也称为 任意 VPN) 是一个网络,所有节点都使用 IPsec 进行通信。该配置允许在无法使用 IPsec 的节点中出现例外。可使用两种方式配置网格 VPN 网络:

  • 需要 IPsec
  • 首选 IPsec,但允许回退清除文本通信。

节点之间的身份验证可以基于 X.509 证书或 DNS 安全扩展(DNSSEC)。

以下流程使用 X.509 证书。这些证书可以使用任何类型的证书颁发机构(CA)管理系统生成,如 Dogtag 证书系统。Dogtag 假定每个节点的证书可用 PKCS #12 格式(.p12 文件),其中包含私钥、节点证书和用于验证其他节点的 X.509 证书的 Root CA 证书。

每个节点的配置与其 X.509 证书不同。这允许在不重新配置网络中的任何现有节点的情况下添加新节点。PKCS #12 文件需要一个"友好名称",对于它,我们使用名称"node",以便引用友好名称的配置文件对所有节点都相同。

先决条件

  • Libreswan 已安装,在每个节点上启动 ipsec 服务。

流程

  1. 在每个节点中导入 PKCS #12 文件。此步骤需要用于生成 PKCS #12 文件的密码:

    # ipsec import nodeXXX.p12
  2. 需要 (专用)、IPsec 可选 (private-or-clear)和 No IPsec (clear)配置集创建以下三个连接定义:

    # cat /etc/ipsec.d/mesh.conf
    conn clear
    	auto=ondemand
    	type=passthrough
    	authby=never
    	left=%defaultroute
    	right=%group
    
    conn private
    	auto=ondemand
    	type=transport
    	authby=rsasig
    	failureshunt=drop
    	negotiationshunt=drop
    	# left
    	left=%defaultroute
    	leftcert=nodeXXXX
    	leftid=%fromcert
            leftrsasigkey=%cert
    	# right
    	rightrsasigkey=%cert
    	rightid=%fromcert
    	right=%opportunisticgroup
    
    conn private-or-clear
    	auto=ondemand
    	type=transport
    	authby=rsasig
    	failureshunt=passthrough
    	negotiationshunt=passthrough
    	# left
    	left=%defaultroute
    	leftcert=nodeXXXX
    	leftid=%fromcert
            leftrsasigkey=%cert
    	# right
    	rightrsasigkey=%cert
    	rightid=%fromcert
    	right=%opportunisticgroup
  3. 以适当的类别添加网络的 IP 地址。例如,如果所有节点都驻留在 10.15.0.0/16 网络中,所有节点都应强制进行 IPsec 加密:

    # echo "10.15.0.0/16" >> /etc/ipsec.d/policies/private
  4. 要允许某些节点(如 10.15.34.0/24)使用或不使用 IPsec,请使用以下 方法将这些节点添加到 private-or-clear 组中:

    # echo "10.15.34.0/24" >> /etc/ipsec.d/policies/private-or-clear
  5. 要定义 IPsec 无法到清除组中的主机(如 10.15.1.2),请使用:

    # echo "10.15.1.2/32" >> /etc/ipsec.d/policies/clear

    /etc/ipsec.d/policies 目录中的文件可以从每个新节点的模板创建,也可以使用 Puppet 或 Ansible 来调配。

    请注意,每个节点都有相同的异常列表或不同流量流预期的列表。因此,两个节点可能无法通信,因为一个节点需要 IPsec,另一个节点无法使用 IPsec

  6. 重启节点将其添加到配置的网格中:

    # systemctl restart ipsec
  7. 完成添加节点后,ping 命令就足以打开 IPsec 隧道。查看节点已打开的隧道:

    # ipsec trafficstatus