6.5. 手动配置具有基于证书身份验证的 IPsec 主机到站点 VPN
主机到站点 VPN 在远程计算机和专用网络之间创建一个安全、加密的连接。这会跨公共网络(如互联网)链接它们。
远程员工使用主机到站点的 VPN 访问其公司的内部网络。它们可以从其计算机访问资源,就如同它们在办公室中一样。
要进行身份验证,请使用由证书颁发机构(CA)管理的数字证书。这提供了一个安全、可扩展的解决方案。每个主机和网关都提供由可信 CA 签名的证书。这个方法提供了强大的身份验证,并简化了用户管理。您可以在 CA 中集中管理或撤销访问权限。libreswan 根据证书撤销列表(CRL)检查每个证书。如果证书位于列表中,Libreswan 拒绝访问。
6.5.1. 手动设置 IPsec 网关 复制链接链接已复制到粘贴板!
您必须正确配置 Libreswan IPsec 网关来启用安全远程访问。Libreswan 从网络安全服务(NSS)数据库读取服务器证书、私钥和 CA 证书。
以下示例允许经过身份验证的用户访问内部 192.0.2.0/24 子网,并将虚拟 IP 池中的 IP 地址动态分配给每个客户端。要保持安全性,网关会验证客户端证书是否由同一可信 CA 发布,并自动使用证书撤销列表(CRL)来确保对于任何撤销的证书都拒绝访问。
先决条件
Public Key Cryptography Standards #12(PKCS #12)文件
~/file.p12在网关上存在,并具有以下内容:- 服务器的私钥
- 服务器证书
- 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)被设置为
- VPN 客户端流量的返回路由在内部网络上配置,指向 VPN 网关。
流程
如果 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 vpn-gateway u,u,u Example-CA CT,, ...您需要配置文件的此信息。
在
/etc/ipsec.d/目录中为连接创建一个.conf文件。例如,使用以下设置创建/etc/ipsec.d/host-to-site.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=start ikev2=insist authby=rsasig # VPN gateway settings left=%defaultroute leftid=%fromcert leftcert="<server_certificate_nickname>" leftrsasigkey=%cert leftsendcert=always leftsubnet=192.0.2.0/24 rekey=no mobike=yes narrowing=yes # Client-related settings right=%any rightid=%fromcert rightrsasigkey=%cert rightaddresspool=198.51.100.129-198.51.100.254 rightmodecfgclient=yes modecfgclient=yes modecfgdns=192.0.2.5 modecfgdomains="example.com" # Dead Peer Detection dpddelay=30 dpdtimeout=120 dpdaction=clear示例中指定的设置包括:
ikev2=insist- 将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。
left=%defaultroute-
当
ipsec服务启动时,动态设置默认路由接口的 IP 地址。或者,您可以将left参数设置为 IP 地址或主机的 FQDN。 leftid=%fromcert和rightid=%fromcert- 将 Libreswan 配置为从证书的可分辨名称(DN)字段检索身份。
leftcert="<server_certificate_nickname>"- 设置 NSS 数据库中使用的服务器证书的昵称。
leftrsasigkey=%cert和rightrsasigkey=%cert- 将 Libreswan 配置为使用证书中嵌入的 RSA 公钥。
leftsendcert=always- 指示网关始终发送证书,以便客户端可以针对 CA 证书对其进行验证。
leftsubnet=<subnets>- 指定连接到客户端可以通过隧道访问的网关的子网。
mobike=yes- 启用客户端在网络间 roam。
rightaddresspool=<ip_range>- 指定网关可以将哪个范围的 IP 地址分配给客户端。
modecfgclient=yes-
使客户端能够接收
modecfgdns参数中设置的 DNS 服务器 IP,以及modecfgdomains中设置的 DNS 搜索域。
有关示例中使用的所有参数的详情,请查看您系统上的
ipsec.conf (5)手册页。启用数据包转发:
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf重启
ipsec服务:# systemctl restart ipsec如果您在配置文件中使用
auto=start,则连接会自动激活。使用其他方法时,需要执行额外的步骤来激活连接。详情请查看您系统上的ipsec.conf (5)手册页。
验证
- 配置一个客户端并连接到 VPN 网关。
检查服务是否加载了 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 流量,请验证
firewalld中是否启用了 IPsec 服务:# firewall-cmd --list-services ipsec如果该服务没有列出,请添加它:
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload如果证书验证失败,请验证 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。
如果 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 -rw-r--r--. root root system_u:object_r:ipsec_key_file_t:s0 pkcs11.txt
后续步骤
- 配置防火墙规则,以确保客户端只能与所需的资源进行通信。有关防火墙的详情,请参阅 配置防火墙和数据包过滤器。