6.6. 手动配置具有基于证书的身份验证的 IPsec 网格 VPN
IPsec 网格会创建一个完全互连的网络,其中每个服务器都可以与其他服务器安全且直接地进行通信。这是跨多个数据中心或云提供商的分布式数据库集群或高可用性环境的理想选择。
在每对服务器之间建立直接的加密隧道可确保安全通信,而没有中央瓶颈。为进行身份验证,使用由证书颁发机构(CA)管理的数字证书,可提供安全、可扩展的解决方案。网格中的每个主机都存在一个由可信 CA 签名的证书。这个方法提供强大的、可靠的身份验证,并简化了用户管理。可以在 CA 中集中授予或撤销访问权限,Libreswan 通过针对证书撤销列表(CRL)检查每个证书来强制实施这个操作,如果证书出现在列表中,则拒绝访问。
先决条件
网格中的每个对等点都存在一个 Public Key Cryptography Standards #12 (PKCS #12)文件,其中包含以下内容:
- 服务器的私钥
- 服务器证书
- CA 证书
- 如果需要,则为中间证书
有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。
服务器证书包含以下字段:
-
Extended Key Usage(EKU)被设置为
TLS Web Server Authentication。 - Common Name(CN)或 Subject Alternative Name(SAN)被设置为主机的完全限定域名(FQDN)。
- X509v3 CRL 发行版点包含证书撤销列表(CRL)的 URL。
-
Extended Key Usage(EKU)被设置为
流程
如果 Libreswan 尚未安装,请执行以下步骤:
安装
libreswan软件包:# dnf install libreswan初始化 Network Security Services (NSS)数据库:
# ipsec initnss命令在
/var/lib/ipsec/nss/目录中创建数据库。启用并启动
ipsec服务:# systemctl enable --now ipsec在防火墙中打开 IPsec 端口和协议:
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
将 PKCS #12 文件导入到 NSS 数据库中:
# ipsec import <file>.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CA显示服务器的昵称和 CA 证书:
# certutil -L -d /var/lib/ipsec/nss/ Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI server1 u,u,u Example-CA CT,, ...您需要配置文件的此信息。
在
/etc/ipsec.d/目录中为连接创建一个.conf文件。例如,使用以下设置创建/etc/ipsec.d/mesh.conf文件:添加
config setup部分以启用 CRL 检查:config setup crl-strict=yes crlcheckinterval=1h示例中指定的设置包括:
crl-strict=yes- 启用 CRL 检查。如果 NSS 数据库中没有 CRL,身份验证对等点将被拒绝。
crlcheckinterval=1h- 在指定的时间段后,从服务器证书中指定的 URL 重新获取 CRL。
添加一个在网格中成员间强制实施流量的部分:
conn <connection_name> # General setup and authentication type auto=ondemand authby=rsasig # Local settings settings left=%defaultroute leftid=%fromcert leftcert="<server_certificate_nickname>" leftrsasigkey=%cert leftsendcert=always failureshunt=drop type=transport # Settings related to other peers in the mesh right=%opportunisticgroup rightid=%fromcert示例中指定的设置包括:
left=%defaultroute-
当
ipsec服务启动时,动态设置默认路由接口的 IP 地址。或者,您可以将left参数设置为 IP 地址或主机的 FQDN。 leftid=%fromcert和rightid=%fromcert- 将 Libreswan 配置为从证书的可分辨名称(DN)字段检索身份。
leftcert="<server_certificate_nickname>"- 设置 NSS 数据库中使用的服务器证书的昵称。
leftrsasigkey=%cert- 将 Libreswan 配置为使用证书中嵌入的 RSA 公钥。
leftsendcert=always- 指示对等点始终发送证书,以便对等点可以针对 CA 证书进行验证。
failureshunt=drop- 如果 IPsec 协商失败,强制实施加密并丢弃流量。这对于安全网格至关重要。
right=%opportunisticgroup- 指定连接应应用到策略文件中定义的动态远程对等点组。这可让 Libreswan 对该组中每个列出的 IP 或子网实例化 IPsec 隧道。
有关示例中使用的所有参数的详情,请查看您系统上的
ipsec.conf (5)手册页。创建
/etc/ipsec.d/policies/server-mesh策略文件,该文件以无类别域间路由(CIDR)格式指定对等点或子网:192.0.2.0/24 198.51.100.0/24使用这些设置,
ipsec服务会加密这些子网中主机之间的流量。如果主机没有被配置为 IPsec 网格的成员,则此主机和网格成员之间的通信会失败。重启
ipsec服务:# systemctl restart ipsec- 对您在策略文件中指定的子网中的每个主机上重复这个流程。
验证
将流量发送到网格中的主机,来建立隧道。例如,ping 主机:
# ping -c3 <peer_in_mesh>显示 IPsec 状态:
# ipsec status如果连接成功建立了,输出会包含对等点的以下行:
互联网密钥交换版本 2 (IKEv2)协商的阶段 1 已成功完成:
#1: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_IKE_SA (established IKE SA); REKEY in 12822s; REPLACE in 13875s; newest; idle;Security Association(SA)现在已准备好协商实际数据加密隧道,称为子 SA 或阶段 2 SA。
子 SA 已建立:
#2: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_CHILD_SA (established Child SA); REKEY in 13071s; REPLACE in 13875s; newest; eroute owner; IKE SA #1; idle;这是您的数据流量通过的实际隧道。
检查服务是否加载了 CRL ,并将条目添加到 NSS 数据库中:
# ipsec listcrls List of CRLs: issuer: CN=Example-CA revoked certs: 1 updates: this Tue Jul 15 10:22:36 2025 next Sun Jan 11 10:22:36 2026 List of CRL fetch requests: Jul 15 15:13:56 2025, trials: 1 issuer: 'CN=Example-CA' distPts: 'https://ca.example.com/crl.pem'
故障排除
如果连接无法建立,请检查 IPsec 日志:
# journalctl -u ipsec -n 50如果防火墙阻止 IPsec 流量,请验证是否启用了 IPsec 服务:
# firewall-cmd --list-services | grep ipsec防火墙必须允许 ESP 协议(IP 协议 50)和 UDP 端口 500 和 4500。
如果证书验证失败,请验证 CA 证书是否在 NSS 数据库中被信任:
# certutil -L -d /var/lib/ipsec/nss/ Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI Example-CA CT,,CA 证书信任属性必须为证书颁发机构信任包括
C。- 如果 CRL 下载失败,请检查到服务器证书中指定的 CRL 发行版 URL 的网络连接,并验证是否可从所有网格成员访问 URL。
-
如果网格成员之间的流量尽管配置没有加密,请验证
/etc/ipsec.d/policies/server-mesh文件中的 IP 地址或子网是否与网格成员的实际网络地址匹配。 如果 NSS 数据库有权限问题,请验证 root 用户拥有正确的 SELinux 上下文的数据库文件:
# ls -lZ /var/lib/ipsec/nss/ -rw-r--r--. root root system_u:object_r:ipsec_key_file_t:s0 cert9.db -rw-r--r--. root root system_u:object_r:ipsec_key_file_t:s0 key4.db
后续步骤
- 如果您在具有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能容易被重定向。有关详情和缓解步骤,请参阅 将 VPN 连接分配给专用的路由表,以防止连接绕过隧道。