5.18. 使用 nmstatectl 配置基于 IPsec 的 VPN 连接


IPsec(互联网协议安全)是一个安全协议套件,由 Libreswan 提供,用于 VPN 的实现。IPsec 包括在连接建立时启动身份验证的协议,并在数据传输过程中管理密钥。当应用程序在网络中部署,并使用 IP 协议进行通信时,IPsec 可以保护数据通信。

要管理基于 IPsec 的配置来验证 VPN 连接,您可以使用 nmstatectl 工具。此工具提供对用于主机网络管理的声明性 API 的命令行访问。以下是 host-to-subnethost-to-host 通信模式的身份验证类型:

  • Host-to-subnet PKI 身份验证
  • Host-to-subnet RSA 身份验证
  • Host-to-subnet PSK 身份验证
  • Host-to-host 隧道模式身份验证
  • Host-to-host 传输模式身份验证

如果要根据 IPsec 中的可信实体身份验证使用加密,公钥基础架构(PKI)通过在两个主机之间使用加密密钥来提供安全通信。两个通信主机都生成私钥和公钥,其中每个主机通过与可信实体证书颁发机构(CA)共享公钥来维护私钥。验证真实性后,CA 生成一个数字证书。在加密和解密的情况下,主机使用私钥进行加密,使用公钥进行解密。

通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置基于 PKI 身份验证的 IPsec 连接。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate 会自动回滚更改,以避免不正确的系统状态。

要在 主机到子网 配置中建立加密通信,远程 IPsec 端通过使用参数 dhcp: true 向主机提供另一个 IP。在 nmstate 中为 IPsec 定义系统的情况,左侧 命名的系统是本地主机,而 右侧 命名的系统是远程主机。以下流程需要在两台主机上运行。

先决条件

  • 通过使用密码,您已生成了一个存储证书和加密密钥的 PKCS #12 文件。

流程

  1. 安装所需的软件包:

    # dnf install nmstate libreswan NetworkManager-libreswan
    Copy to Clipboard Toggle word wrap
  2. 重启 NetworkManager 服务:

    # systemctl restart NetworkManager
    Copy to Clipboard Toggle word wrap
  3. 由于 Libreswan 已安装,请删除其旧的数据库文件,并重新创建它们:

    # systemctl stop ipsec
    # rm /etc/ipsec.d/*db
    # ipsec initnss
    Copy to Clipboard Toggle word wrap
  4. 启用并启动 ipsec 服务:

    # systemctl enable --now ipsec
    Copy to Clipboard Toggle word wrap
  5. 导入 PKCS#12 文件:

    # ipsec import node-example.p12
    Copy to Clipboard Toggle word wrap

    导入 PKCS#12 文件时,请输入用来创建该文件的密码。

  6. 创建一个包含以下内容的 YAML 文件,如 ~/create-pki-authentication.yml

    ---
    interfaces:
    - name: 'example_ipsec_conn1'            
    1
    
      type: ipsec
      ipv4:
        enabled: true
        dhcp: true
      libreswan:
        ipsec-interface: 'yes'               
    2
    
        left: '192.0.2.250'                  
    3
    
        leftid: '%fromcert'                  
    4
    
        leftcert: 'local-host.example.com'   
    5
    
        right: '192.0.2.150'                 
    6
    
        rightid: '%fromcert'                 
    7
    
        ikev2: 'insist'                      
    8
    
        ikelifetime: '24h'                   
    9
    
        salifetime: '24h'                    
    10
    Copy to Clipboard Toggle word wrap

    YAML 文件定义以下设置:

    1
    IPsec 连接名称
    2
    yes 表示 libreswan 创建一个 IPsec xfrm 虚拟接口 ipsec<number>,并自动查找下一个可用数字
    3
    用于本地主机的公共网络接口的静态 IPv4 地址
    4
    在本地主机上,%fromcert 的值将 ID 设置为从加载的证书中获取的可分辨名称(DN)
    5
    本地主机的公钥的可分辨名称(DN)
    6
    用于远程主机的公共网络接口的静态 IPv4 地址
    7
    在远程主机上,%fromcert 的值将 ID 设置为从加载的证书中获取的可分辨名称(DN)。
    8
    insist 值只接受并接收互联网密钥交换(IKEv2)协议
    9
    IKE 协议的持续时间
    10
    IPsec 安全联盟(SA)的持续时间
  7. 将设置应用到系统:

    # nmstatectl apply ~/create-pki-authentication.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 验证 IPsec 状态:

    # ip xfrm status
    Copy to Clipboard Toggle word wrap
  2. 验证 IPsec 策略:

    # ip xfrm policy
    Copy to Clipboard Toggle word wrap

如果要在 IPsec 中使用基于非对称加密的密钥身份验证,则 RSA 算法通过使用私钥和公钥在两个主机之间进行加密和解密来提供安全通信。此方法使用私钥进行加密,使用公钥进行解密。

通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置基于 RSA 的 IPsec 身份验证。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate 会自动回滚更改,以避免不正确的系统状态。

要在 主机到子网 配置中建立加密通信,远程 IPsec 端通过使用参数 dhcp: true 向主机提供另一个 IP。在 nmstate 中为 IPsec 定义系统的情况,左侧 命名的系统是本地主机,而 右侧 命名的系统是远程主机。以下流程需要在两台主机上运行。

流程

  1. 安装所需的软件包:

    # dnf install nmstate libreswan NetworkManager-libreswan
    Copy to Clipboard Toggle word wrap
  2. 重启 NetworkManager 服务:

    # systemctl restart NetworkManager
    Copy to Clipboard Toggle word wrap
  3. 如果 Libreswan 已安装,请删除其旧的数据库文件,并重新创建它们:

    # systemctl stop ipsec
    # rm /etc/ipsec.d/*db
    # ipsec initnss
    Copy to Clipboard Toggle word wrap
  4. 在每个主机上生成一个 RSA 密钥对:

    # ipsec newhostkey --output
    Copy to Clipboard Toggle word wrap
  5. 显示公钥:

    # ipsec showhostkey --list
    Copy to Clipboard Toggle word wrap
  6. 上一步返回的生成的密钥 ckaid。对左侧使用以下命令和 ckaid,例如:

    # ipsec showhostkey --left --ckaid <0sAwEAAesFfVZqFzRA9F>
    Copy to Clipboard Toggle word wrap
  7. 上一命令的输出生成了配置所需的 leftrsasigkey= 行。在第二个主机(右侧)上执行相同的操作:

    # ipsec showhostkey --right --ckaid <0sAwEAAesFfVZqFzRA9E>
    Copy to Clipboard Toggle word wrap
  8. 启用 ipsec 服务,来在引导时自动启动:

    # systemctl enable --now ipsec
    Copy to Clipboard Toggle word wrap
  9. 创建一个包含以下内容的 YAML 文件,如 ~/create-rsa-authentication.yml

    ---
    interfaces:
    - name: 'example_ipsec_conn1'               
    1
    
      type: ipsec                               
    2
    
      ipv4:
        enabled: true
        dhcp: true
      libreswan:
        ipsec-interface: '99'                   
    3
    
        leftrsasigkey: '0sAwEAAesFfVZqFzRA9F'   
    4
    
        left: '192.0.2.250'                     
    5
    
        leftid: 'local-host-rsa.example.com'    
    6
    
        right: '192.0.2.150'                    
    7
    
        rightrsasigkey: '0sAwEAAesFfVZqFzRA9E'  
    8
    
        rightid: 'remote-host-rsa.example.com'  
    9
    
        ikev2: 'insist'                         
    10
    Copy to Clipboard Toggle word wrap

    YAML 文件定义以下设置:

    1
    IPsec 连接名称
    2
    接口名称
    3
    99 表示 libreswan 创建一个 IPsec xfrm 虚拟接口 ipsec<number>,并自动查找下一个可用数字
    4
    本地主机的 RSA 公钥
    5
    本地主机的公共网络接口的静态 IPv4 地址
    6
    本地主机的可分辨名称(DN)
    7
    远程主机的 RSA 公钥
    8
    远程主机的公共网络接口的静态 IPv4 地址
    9
    远程主机的可分辨名称(DN)
    10
    insist 值只接受并接收互联网密钥交换(IKEv2)协议
  10. 将设置应用到系统:

    # nmstatectl apply ~/create-rsa-authentication.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 显示网络接口的 IP 设置:

    # ip addr show example_ipsec_conn1
    Copy to Clipboard Toggle word wrap
  2. 验证 IPsec 状态:

    # ip xfrm status
    Copy to Clipboard Toggle word wrap
  3. 验证 IPsec 策略:

    # ip xfrm policy
    Copy to Clipboard Toggle word wrap

如果要在 IPsec 中使用基于相互认证的加密,Pre-Shared Key (PSK)方法通过在两个主机之间使用机密密钥来提供安全通信。文件存储机密密钥,相同的密钥加密通过隧道的数据流。

通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置基于 PSK 的 IPsec 身份验证。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate 会自动回滚更改,以避免不正确的系统状态。

要在 主机到子网 配置中建立加密通信,远程 IPsec 端通过使用参数 dhcp: true 向主机提供另一个 IP。在 nmstate 中为 IPsec 定义系统的情况,左侧 命名的系统是本地主机,而 右侧 命名的系统是远程主机。以下流程需要在两台主机上运行。

注意

由于此方法使用静态字符串进行身份验证和加密,因此仅用于测试/开发目的。

流程

  1. 安装所需的软件包:

    # dnf install nmstate libreswan NetworkManager-libreswan
    Copy to Clipboard Toggle word wrap
  2. 重启 NetworkManager 服务:

    # systemctl restart NetworkManager
    Copy to Clipboard Toggle word wrap
  3. 如果 Libreswan 已安装,请删除其旧的数据库文件,并重新创建它们:

    # systemctl stop ipsec
    # rm /etc/ipsec.d/*db
    # ipsec initnss
    Copy to Clipboard Toggle word wrap
  4. 启用 ipsec 服务,来在引导时自动启动:

    # systemctl enable --now ipsec
    Copy to Clipboard Toggle word wrap
  5. 创建一个包含以下内容的 YAML 文件,如 ~/create-pks-authentication.yml

    ---
    interfaces:
    - name: 'example_ipsec_conn1'           
    1
    
      type: ipsec
      ipv4:
        enabled: true
        dhcp: true
      libreswan:
        ipsec-interface: 'no'               
    2
    
        right: '192.0.2.250'                
    3
    
        rightid: 'remote-host.example.org'  
    4
    
        left: '192.0.2.150'                 
    5
    
        leftid: 'local-host.example.org'    
    6
    
        psk: "example_password"
        ikev2: 'insist'                     
    7
    Copy to Clipboard Toggle word wrap

    YAML 文件定义以下设置:

    1
    IPsec 连接名称
    2
    设置 no 值表示 libreswan 只创建 xfrm 策略,而不是虚拟 xfrm 接口
    3
    远程主机的公共网络接口的静态 IPv4 地址
    4
    远程主机的可分辨名称(DN)
    5
    本地主机的公共网络接口的静态 IPv4 地址
    6
    本地主机的可分辨名称(DN)
    7
    insist 值只接受并接收互联网密钥交换(IKEv2)协议
  6. 将设置应用到系统:

    # nmstatectl apply ~/create-pks-authentication.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 显示网络接口的 IP 设置:

    # ip addr show example_ipsec_conn1
    Copy to Clipboard Toggle word wrap
  2. 验证 IPsec 状态:

    # ip xfrm status
    Copy to Clipboard Toggle word wrap
  3. 验证 IPsec 策略:

    # ip xfrm policy
    Copy to Clipboard Toggle word wrap

IPsec (互联网协议安全)是一个安全协议套件,用于验证和加密网络和设备中的 IP 通信。Libreswan 软件为 VPN 提供一个 IPsec 实现。

在隧道模式中,通信的源和目标 IP 地址在 IPsec 隧道中被加密。外部网络嗅探器只能获取左侧 IP 和右侧 IP。通常,对于隧道模式,它支持 host-to-hosthost-to-subnetsubnet-to-subnet。在此模式中,新的 IP 数据包封装现有的数据包及其有效负载和标头。此模式下的封装保护不安全网络上的 IP 数据、源和目标标头。此模式可用于在 subnet-to-subnet、远程访问连接和不受信任的网络(如开放的公共 Wi-Fi 网络)中传输数据。默认情况下,IPsec 在隧道模式下,在两个站点之间建立一个安全通道。使用以下配置,您可以将 VPN 连接建立成一个 host-to-host 架构。

通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置 IPsec VPN 连接。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate 会自动回滚更改,以避免不正确的系统状态。

host-to-host 配置中,您需要设置 leftmodecfgclient: no,以便它不能从服务器接收网络配置,因此该值为 no。在 nmstate 中为 IPsec 定义系统的情况,左侧 命名的系统是本地主机,而 右侧 命名的系统是远程主机。以下流程需要在两台主机上运行。

先决条件

  • 通过使用密码,您已生成了一个存储证书和加密密钥的 PKCS #12 文件。

流程

  1. 安装所需的软件包:

    # dnf install nmstate libreswan NetworkManager-libreswan
    Copy to Clipboard Toggle word wrap
  2. 重启 NetworkManager 服务:

    # systemctl restart NetworkManager
    Copy to Clipboard Toggle word wrap
  3. 由于 Libreswan 已安装,请删除其旧的数据库文件,并重新创建它们:

    # systemctl stop ipsec
    # rm /etc/ipsec.d/*db
    # ipsec initnss
    Copy to Clipboard Toggle word wrap
  4. 导入 PKCS#12 文件:

    # ipsec import node-example.p12
    Copy to Clipboard Toggle word wrap

    在导入 PKCS#12 文件时,输入用来生成该文件的密码。

  5. 启用并启动 ipsec 服务:

    # systemctl enable --now ipsec
    Copy to Clipboard Toggle word wrap
  6. 一个创建包含以下内容的 YAML 文件,如 ~/create-p2p-vpn-authentication.yml

    ---
    interfaces:
    - name: 'example_ipsec_conn1'             
    1
    
      type: ipsec
      libreswan:
        left: '192.0.2.250'                   
    2
    
        leftid:  'local-host.example.com'     
    3
    
        leftcert: 'local-host.example.com'    
    4
    
        leftmodecfgclient: 'no'               
    5
    
        right: '192.0.2.150'                  
    6
    
        rightid: 'remote-host.example.com'    
    7
    
        rightsubnet: '192.0.2.150/32'         
    8
    
        ikev2: 'insist'                       
    9
    Copy to Clipboard Toggle word wrap

    YAML 文件定义以下设置:

    1
    IPsec 连接名称
    2
    用于本地主机的公共网络接口的静态 IPv4 地址
    3
    本地主机的可分辨名称(DN)
    4
    本地主机上安装的证书的名称
    5
    用于不是从远程主机检索客户端配置的值
    6
    用于远程主机的公共网络接口的静态 IPv4 地址
    7
    远程主机的可分辨名称(DN)
    8
    远程主机的子网范围 - 192.0.2.150,有 32 个 IPv4 地址
    9
    只接受和接收互联网密钥交换(IKEv2)协议的值
  7. 将设置应用到系统:

    # nmstatectl apply ~/create-p2p-vpn-authentication.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 显示创建的 P2P 策略:

    # ip xfrm policy
    Copy to Clipboard Toggle word wrap
  2. 验证 IPsec 状态:

    # ip xfrm status
    Copy to Clipboard Toggle word wrap

IPsec (互联网协议安全)是一个安全协议套件,用于验证和加密网络和设备中的 IP 通信。Libreswan 工具为 VPN 提供基于 IPsec 的实现。

在传输模式下,加密仅适用于 IP 数据包的有效负载。另外,通过保持原始 IP 标头,新的 IPsec 标头被附加到 IP 数据包中。传输模式不会加密通信的源和目标 IP,而是将它们复制到外部 IP 标头中。因此,加密只保护网络中的 IP 数据。此模式可用于在网络的 host-to-host 连接中传输数据。此模式通常与 GRE 隧道一起使用,以节省 20 字节(IP 标头)的开销。默认情况下,IPsec 工具使用隧道模式。要使用传输模式,请为 host-to-host 连接数据传输设置 type: transport

通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置 IPsec VPN 连接。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate 会自动回滚更改,以避免不正确的系统状态。要覆盖默认的 tunnel 模式,请指定 transport 模式。

在 nmstate 中为 IPsec 定义系统的情况,左侧 命名的系统是本地主机,而 右侧 命名的系统是远程主机。以下流程需要在两台主机上运行。

先决条件

  • 通过使用密码,您已生成了一个存储证书和加密密钥的 PKCS #12 文件。

流程

  1. 安装所需的软件包:

    # dnf install nmstate libreswan NetworkManager-libreswan
    Copy to Clipboard Toggle word wrap
  2. 重启 NetworkManager 服务:

    # systemctl restart NetworkManager
    Copy to Clipboard Toggle word wrap
  3. 由于 Libreswan 已安装,请删除其旧的数据库文件,并重新创建它们:

    # systemctl stop ipsec
    # rm /etc/ipsec.d/*db
    # ipsec initnss
    Copy to Clipboard Toggle word wrap
  4. 导入 PKCS#12 文件:

    # ipsec import node-example.p12
    Copy to Clipboard Toggle word wrap

    导入 PKCS#12 文件时,请输入用来创建该文件的密码。

  5. 启用并启动 ipsec 服务:

    # systemctl enable --now ipsec
    Copy to Clipboard Toggle word wrap
  6. 创建一个包含以下内容的 YAML 文件,如 ~/create-p2p-transport-authentication.yml

    ---
    interfaces:
    - name: 'example_ipsec_conn1'           
    1
    
      type: ipsec
      libreswan:
        type: 'transport'                   
    2
    
        ipsec-interface: '99'               
    3
    
        left: '192.0.2.250'                 
    4
    
        leftid: '%fromcert'                 
    5
    
        leftcert: 'local-host.example.org'  
    6
    
        right: '192.0.2.150'                
    7
    
        prefix-length: '32'                 
    8
    
        rightid: '%fromcert'                
    9
    
        ikev2: 'insist'                     
    10
    
        ikelifetime: '24h'                  
    11
    
        salifetime: '24h'                   
    12
    Copy to Clipboard Toggle word wrap

    YAML 文件定义以下设置:

    1
    IPsec 连接名称
    2
    IPsec 模式
    3
    99 表示 libreswan 创建一个 IPsec xfrm 虚拟接口 ipsec<number>,并自动查找下一个可用数字
    4
    用于本地主机的公共网络接口的静态 IPv4 地址
    5
    在本地主机上,%fromcert 的值将 ID 设置为从加载的证书获取的可分辨名称(DN)
    6
    本地主机的公钥的可分辨名称(DN)
    7
    用于远程主机的公共网络接口的静态 IPv4 地址
    8
    本地主机的静态 IPv4 地址的子网掩码
    9
    在远程主机上,%fromcert 的值将 ID 设置为从加载的证书中获取的可分辨名称(DN)
    10
    只接受和接收互联网密钥交换(IKEv2)协议的值
    11
    IKE 协议的持续时间
    12
    IPsec 安全联盟(SA)的持续时间
  7. 将设置应用到系统:

    # nmstatectl apply ~/create-p2p-transport-authentication.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 验证 IPsec 状态:

    # ip xfrm status
    Copy to Clipboard Toggle word wrap
  2. 验证 IPsec 策略:

    # ip xfrm policy
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat