5.7. 配置网格 VPN
网格 VPN 网络(也称为 any-to-any VPN ) 是一个所有节点都使用 IPsec 进行通信的网络。该配置可以对于无法使用 IPsec 的节点进行例外处理。可使用两种方式配置网格 VPN 网络:
- 需要 IPsec。
- 首选 IPsec,但允许回退到使用明文通信。
节点之间的身份验证可以基于 X.509 证书或 DNS 安全扩展(DNSSEC)。
您对 opportunistic IPsec 使用任何常规的 IKEv2 验证方法,因为这些连接是常规的 Libreswan 配置,除了由 right=%opportunisticgroup
条目定义的 opportunistic IPsec 之外。常见的身份验证方法是主机使用常用共享认证机构(CA)根据 X.509 证书进行互相验证。作为标准流程的一部分,云部署通常为云中的每个节点发布证书。
不要使用 PreSharedKey (PSK)身份验证,因为一个被泄露的主机也会导致组 PSK secret 被泄露。
您可以使用 NULL 身份验证在节点间部署加密,而无需认证,这只防止被动攻击者。
以下流程使用 X.509 证书。您可以使用任何类型的 CA 管理系统(如 Dogtag 证书系统)生成这些证书。dogtag 假设每个节点的证书以 PKCSautomationhub 格式(.p12
文件)提供,其中包含私钥、节点证书和用于验证其他节点的 X.509 证书的 Root CA 证书。
每个节点的配置与其 X.509 证书不同。这允许在不重新配置网络中的任何现有节点的情况下添加新节点。PKCS #12 文件需要一个"友好名称",为此,我们使用名称"节点",这样引用友好名称的配置文件对所有节点都是相同的。
前提条件
-
Libreswan 已安装 ,并在每个节点上启动了
ipsec
服务。 一个新的 NSS 数据库已初始化。
如果您已经有一个旧的 NSS 数据库,请删除旧的数据库文件:
# systemctl stop ipsec # rm /etc/ipsec.d/*db
您可以使用以下命令初始化新数据库:
# ipsec initnss
流程
在每个节点中导入 PKCS #12 文件。此步骤需要用于生成 PKCS #12 文件的密码:
# ipsec import nodeXXX.p12
为
IPsec 需要的
(专用)、IPsec 可选的
(private-or-clear)和No IPsec
(clear)配置文件创建以下三个连接定义:# cat /etc/ipsec.d/mesh.conf conn clear auto=ondemand 1 type=passthrough authby=never left=%defaultroute right=%group conn private auto=ondemand type=transport authby=rsasig failureshunt=drop negotiationshunt=drop ikev2=insist left=%defaultroute leftcert=nodeXXXX leftid=%fromcert 2 rightid=%fromcert right=%opportunisticgroup conn private-or-clear auto=ondemand type=transport authby=rsasig failureshunt=passthrough negotiationshunt=passthrough # left left=%defaultroute leftcert=nodeXXXX 3 leftid=%fromcert leftrsasigkey=%cert # right rightrsasigkey=%cert rightid=%fromcert right=%opportunisticgroup
- 1
auto
变量有几个选项:您可以使用带有 opportunistic IPsec 的
ondemand
连接选项来启动 IPsec 连接,或者用于显式配置不需要一直激活的连接。这个选项在内核中建立一个陷阱 XFRM 策略,使 IPsec 连接在收到与该策略匹配的第一个数据包时开始。您可以使用以下选项有效地配置和管理 IPsec 连接,无论是使用 Opportunistic IPsec 还是明确配置的连接:
add
选项-
加载连接配置,并为响应远程启动做好准备。但是,连接不会自动从本地端启动。您可以使用
ipsec auto --up
命令手动启动 IPsec 连接。 start
选项- 加载连接配置,并为响应远程启动做好准备。此外,它会立即启动到远程对等点的连接。您可以将这个选项用于永久的和一直活跃的连接。
- 2
leftid
和rightid
变量标识 IPsec 隧道连接的右侧和左侧频道。如果您配置了证书,您可以使用这些变量来获取本地 IP 地址或本地证书的主题 DN 的值。- 3
leftcert
变量定义您要使用的 NSS 数据库的 nickname。将网络的 IP 地址添加到对应的类中。例如,如果所有节点都位于
10.15.0.0/16
网络中,则所有节点都必须使用 IPsec 加密:# echo "10.15.0.0/16" >> /etc/ipsec.d/policies/private
要允许某些节点(如
10.15.34.0/24
)使用或不使用 IPsec,请将这些节点添加到 private-or-clear 组中:# echo "10.15.34.0/24" >> /etc/ipsec.d/policies/private-or-clear
要将一个不支持 IPsec 的主机(如
10.15.1.2
)定义到 clear 组,请使用:# echo "10.15.1.2/32" >> /etc/ipsec.d/policies/clear
您可以从每个新节点的模板中创建
/etc/ipsec.d/policies
目录中创建文件,也可以使用 Puppet 或 Ansible 来置备它们。请注意,每个节点都有相同的异常列表或不同的流量预期。因此,两个节点可能无法通信,因为一个节点需要 IPsec,而另一个节点无法使用 IPsec。
重启节点将其添加到配置的网格中:
# systemctl restart ipsec
验证
使用
ping
命令打开 IPsec 隧道:# ping <nodeYYY>
显示带有导入认证的 NSS 数据库:
# certutil -L -d sql:/etc/ipsec.d Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI west u,u,u ca CT,,
查看节点上打开了哪个隧道:
# ipsec trafficstatus 006 #2: "private#10.15.0.0/16"[1] ...<nodeYYY>, type=ESP, add_time=1691399301, inBytes=512, outBytes=512, maxBytes=2^63B, id='C=US, ST=NC, O=Example Organization, CN=east'
其他资源
-
系统中
IPsec.conf (5)
手册页 -
有关
authby
变量的更多信息,请参阅 6.2.Libreswan 中的身份验证方法。