5.7. 配置网格 VPN
网格 VPN 网络(也称为 any-to-any VPN ) 是一个所有节点都使用 IPsec 进行通信的网络。该配置可以对于无法使用 IPsec 的节点进行例外处理。可使用两种方式配置网格 VPN 网络:
- 需要 IPsec。
- 首选 IPsec,但允许回退到使用明文通信。
节点之间的身份验证可以基于 X.509 证书或 DNS 安全扩展(DNSSEC)。
您可以对 opportunistic IPsec 使用任何常规 IKEv2 验证方法,因为这些连接是常规的 Libreswan 配置,除了由 right=%opportunisticgroup
条目定义的机会 IPsec 之外。常见的身份验证方法是用于主机使用常用的共享认证机构(CA)根据 X.509 证书互相验证。作为标准流程的一部分,云部署通常为云中的每个节点发布证书。
不要使用 PreSharedKey (PSK)身份验证,因为一个被破坏的主机会导致组 PSK secret 也被破坏。
您可以使用 NULL 身份验证部署没有身份验证的节点间加密,这只防止被动攻击者。
以下流程使用 X.509 证书。您可以使用任何类型的 CA 管理系统(如 Dogtag 证书系统)生成这些证书。Dogtag 假设每个节点的证书都以 PKCS #12 格式(.p12
文件)提供,其包含私钥、节点证书和用于验证其他节点的 X.509 证书的 Root CA 证书。
每个节点的配置与其 X.509 证书不同。这允许在不重新配置网络中的任何现有节点的情况下添加新节点。PKCS #12 文件需要一个"友好名称",为此,我们使用名称"节点",这样引用友好名称的配置文件对所有节点都是相同的。
先决条件
-
Libreswan 已安装 ,并在每个节点上启动了
ipsec
服务。 新的 NSS 数据库已初始化。
如果您已经有旧的 NSS 数据库,请删除旧的数据库文件:
# systemctl stop ipsec # rm /var/lib/ipsec/nss/*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
变量有几个选项:您可以使用带有机会 IPsec 的
ondemand
连接选项来启动 IPsec 连接,或者显式配置不需要一直处于活动状态的连接。这个选项在内核中设置一个陷阱 XFRM 策略,使 IPsec 连接在收到与该策略匹配的第一个数据包时开始。您可以使用以下选项有效地配置和管理 IPsec 连接,无论是使用机会 IPsec 还是明确配置的连接:
add
选项-
加载连接配置,并准备好响应远程启动。但是,连接不会自动从本地端启动。您可以使用命令
ipsec auto --up
手动启动 IPsec 连接。 start
选项- 加载连接配置,并准备好响应远程启动。此外,它会立即启动到远程对等点的连接。您可以将这个选项用于永久的和一直活跃的连接。
- 2
leftid
和rightid
变量标识 IPsec 隧道连接的右和左通道。如果您配置了一个,您可以使用这些变量来获取本地 IP 地址或本地证书的主题 DN 的值。- 3
leftcert
变量定义您要使用的 NSS 数据库的昵称。将网络的 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 中的身份验证方法。