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。
  • VPN 客户端流量的返回路由在内部网络上配置,指向 VPN 网关。

流程

  1. 如果 Libreswan 尚未安装:

    1. 安装 libreswan 软件包:

      # dnf install libreswan
    2. 初始化 Network Security Services (NSS)数据库:

      # ipsec initnss

      命令在 /var/lib/ipsec/nss/ 目录中创建数据库。

    3. 启用并启动 ipsec 服务:

      # systemctl enable --now ipsec
    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
  2. 将 PKCS #12 文件导入到 NSS 数据库中:

    # ipsec import ~/file.p12
    Enter password for PKCS12 file: <password>
    pk12util: PKCS12 IMPORT SUCCESSFUL
    correcting trust bits for Example-CA
  3. 显示服务器的昵称和 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,,
    ...

    您需要配置文件的此信息。

  4. /etc/ipsec.d/ 目录中为连接创建一个 .conf 文件。例如,使用以下设置创建 /etc/ipsec.d/host-to-site.conf 文件:

    1. 添加 config setup 部分以启用 CRL 检查:

      config setup
          crl-strict=yes
          crlcheckinterval=1h

      示例中指定的设置包括:

      crl-strict=yes
      启用 CRL 检查。如果 NSS 数据库中没有 CRL,则身份验证客户端将被拒绝。
      crlcheckinterval=1h
      在指定的时间段后,从服务器证书中指定的 URL 重新获取 CRL。
    2. 为网关添加一个部分:

      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=%fromcertrightid=%fromcert
      将 Libreswan 配置为从证书的可分辨名称(DN)字段检索身份。
      leftcert="<server_certificate_nickname>"
      设置 NSS 数据库中使用的服务器证书的昵称。
      leftrsasigkey=%certrightrsasigkey=%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) 手册页。

  5. 启用数据包转发:

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
  6. 重启 ipsec 服务:

    # systemctl restart ipsec

    如果您在配置文件中使用 auto=start,则连接会自动激活。使用其他方法时,需要执行额外的步骤来激活连接。详情请查看您系统上的 ipsec.conf (5) 手册页。

验证

  1. 配置一个客户端并连接到 VPN 网关
  2. 检查服务是否加载了 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

后续步骤

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部