5.18. 使用 nmstatectl 配置基于 IPsec 的 VPN 连接
IPsec(互联网协议安全)是一个安全协议套件,由 Libreswan
提供,用于 VPN 的实现。IPsec 包括在连接建立时启动身份验证的协议,并在数据传输过程中管理密钥。当应用程序在网络中部署,并使用 IP 协议进行通信时,IPsec 可以保护数据通信。
要管理基于 IPsec 的配置来验证 VPN 连接,您可以使用 nmstatectl
工具。此工具提供对用于主机网络管理的声明性 API 的命令行访问。以下是 host-to-subnet
和 host-to-host
通信模式的身份验证类型:
- Host-to-subnet PKI 身份验证
- Host-to-subnet RSA 身份验证
- Host-to-subnet PSK 身份验证
- Host-to-host 隧道模式身份验证
- Host-to-host 传输模式身份验证
5.18.1. 使用 nmstatectl ,配置带有 PKI 身份验证和隧道模式的主机到子网 IPSec VPN
如果要根据 IPsec 中的可信实体身份验证使用加密,公钥基础架构(PKI)通过在两个主机之间使用加密密钥来提供安全通信。两个通信主机都生成私钥和公钥,其中每个主机通过与可信实体证书颁发机构(CA)共享公钥来维护私钥。验证真实性后,CA 生成一个数字证书。在加密和解密的情况下,主机使用私钥进行加密,使用公钥进行解密。
通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置基于 PKI 身份验证的 IPsec 连接。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate
会自动回滚更改,以避免不正确的系统状态。
要在 主机到子网
配置中建立加密通信,远程 IPsec 端通过使用参数 dhcp: true
向主机提供另一个 IP。在 nmstate 中为 IPsec
定义系统的情况,左侧
命名的系统是本地主机,而 右侧
命名的系统是远程主机。以下流程需要在两台主机上运行。
先决条件
- 通过使用密码,您已生成了一个存储证书和加密密钥的 PKCS #12 文件。
流程
安装所需的软件包:
# dnf install nmstate libreswan NetworkManager-libreswan
重启 NetworkManager 服务:
# systemctl restart NetworkManager
由于
Libreswan
已安装,请删除其旧的数据库文件,并重新创建它们:# systemctl stop ipsec # rm /etc/ipsec.d/*db # ipsec initnss
启用并启动
ipsec
服务:# systemctl enable --now ipsec
导入 PKCS#12 文件:
# ipsec import node-example.p12
导入 PKCS#12 文件时,请输入用来创建该文件的密码。
创建一个包含以下内容的 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
YAML 文件定义以下设置:
- 1
- IPsec 连接名称
- 2
- 值
yes
表示libreswan
创建一个 IPsecxfrm
虚拟接口ipsec<number>
,并自动查找下一个可用数字 - 3
- 用于本地主机的公共网络接口的静态 IPv4 地址
- 4
- 在本地主机上,
%fromcert
的值将 ID 设置为从加载的证书中获取的可分辨名称(DN) - 5
- 本地主机的公钥的可分辨名称(DN)
- 6
- 用于远程主机的公共网络接口的静态 IPv4 地址
- 7
- 在远程主机上,
%fromcert
的值将 ID 设置为从加载的证书中获取的可分辨名称(DN)。 - 8
insist
值只接受并接收互联网密钥交换(IKEv2)协议- 9
- IKE 协议的持续时间
- 10
- IPsec 安全联盟(SA)的持续时间
将设置应用到系统:
# nmstatectl apply ~/create-pki-authentication.yml
验证
验证 IPsec 状态:
# ip xfrm status
验证 IPsec 策略:
# ip xfrm policy
其他资源
-
您系统上的
IPsec.conf (5)
手册页
5.18.2. 使用 nmstatectl 配置带有 RSA 身份验证和隧道模式的主机到子网 IPSec VPN
如果要在 IPsec 中使用基于非对称加密的密钥身份验证,则 RSA 算法通过使用私钥和公钥在两个主机之间进行加密和解密来提供安全通信。此方法使用私钥进行加密,使用公钥进行解密。
通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置基于 RSA 的 IPsec 身份验证。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate
会自动回滚更改,以避免不正确的系统状态。
要在 主机到子网
配置中建立加密通信,远程 IPsec 端通过使用参数 dhcp: true
向主机提供另一个 IP。在 nmstate 中为 IPsec
定义系统的情况,左侧
命名的系统是本地主机,而 右侧
命名的系统是远程主机。以下流程需要在两台主机上运行。
流程
安装所需的软件包:
# dnf install nmstate libreswan NetworkManager-libreswan
重启 NetworkManager 服务:
# systemctl restart NetworkManager
如果
Libreswan
已安装,请删除其旧的数据库文件,并重新创建它们:# systemctl stop ipsec # rm /etc/ipsec.d/*db # ipsec initnss
在每个主机上生成一个 RSA 密钥对:
# ipsec newhostkey --output
显示公钥:
# ipsec showhostkey --list
上一步返回的生成的密钥
ckaid
。对左侧使用以下命令和ckaid
,例如:# ipsec showhostkey --left --ckaid <0sAwEAAesFfVZqFzRA9F>
上一命令的输出生成了配置所需的
leftrsasigkey=
行。在第二个主机(右侧)上执行相同的操作:# ipsec showhostkey --right --ckaid <0sAwEAAesFfVZqFzRA9E>
启用
ipsec
服务,来在引导时自动启动:# systemctl enable --now ipsec
创建一个包含以下内容的 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
YAML 文件定义以下设置:
将设置应用到系统:
# nmstatectl apply ~/create-rsa-authentication.yml
验证
显示网络接口的 IP 设置:
# ip addr show example_ipsec_conn1
验证 IPsec 状态:
# ip xfrm status
验证 IPsec 策略:
# ip xfrm policy
其他资源
-
您系统上的
IPsec.conf (5)
手册页
5.18.3. 使用 nmstatectl 配置带有 PSK 身份验证和隧道模式的主机到子网 IPSec VPN
如果要在 IPsec 中使用基于相互认证的加密,Pre-Shared Key (PSK)方法通过在两个主机之间使用机密密钥来提供安全通信。文件存储机密密钥,相同的密钥加密通过隧道的数据流。
通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置基于 PSK 的 IPsec 身份验证。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate
会自动回滚更改,以避免不正确的系统状态。
要在 主机到子网
配置中建立加密通信,远程 IPsec 端通过使用参数 dhcp: true
向主机提供另一个 IP。在 nmstate 中为 IPsec
定义系统的情况,左侧
命名的系统是本地主机,而 右侧
命名的系统是远程主机。以下流程需要在两台主机上运行。
由于此方法使用静态字符串进行身份验证和加密,因此仅用于测试/开发目的。
流程
安装所需的软件包:
# dnf install nmstate libreswan NetworkManager-libreswan
重启 NetworkManager 服务:
# systemctl restart NetworkManager
如果
Libreswan
已安装,请删除其旧的数据库文件,并重新创建它们:# systemctl stop ipsec # rm /etc/ipsec.d/*db # ipsec initnss
启用
ipsec
服务,来在引导时自动启动:# systemctl enable --now ipsec
创建一个包含以下内容的 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
YAML 文件定义以下设置:
将设置应用到系统:
# nmstatectl apply ~/create-pks-authentication.yml
验证
显示网络接口的 IP 设置:
# ip addr show example_ipsec_conn1
验证 IPsec 状态:
# ip xfrm status
验证 IPsec 策略:
# ip xfrm policy
5.18.4. 使用 nmstatectl 配置具有 PKI 身份验证和隧道模式的主机到主机的 IPsec VPN
IPsec (互联网协议安全)是一个安全协议套件,用于验证和加密网络和设备中的 IP 通信。Libreswan
软件为 VPN 提供一个 IPsec 实现。
在隧道模式中,通信的源和目标 IP 地址在 IPsec 隧道中被加密。外部网络嗅探器只能获取左侧 IP 和右侧 IP。通常,对于隧道模式,它支持 host-to-host
、host-to-subnet
和 subnet-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 文件。
流程
安装所需的软件包:
# dnf install nmstate libreswan NetworkManager-libreswan
重启 NetworkManager 服务:
# systemctl restart NetworkManager
由于
Libreswan
已安装,请删除其旧的数据库文件,并重新创建它们:# systemctl stop ipsec # rm /etc/ipsec.d/*db # ipsec initnss
导入 PKCS#12 文件:
# ipsec import node-example.p12
在导入 PKCS#12 文件时,输入用来生成该文件的密码。
启用并启动
ipsec
服务:# systemctl enable --now ipsec
一个创建包含以下内容的 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
YAML 文件定义以下设置:
将设置应用到系统:
# nmstatectl apply ~/create-p2p-vpn-authentication.yml
验证
显示创建的 P2P 策略:
# ip xfrm policy
验证 IPsec 状态:
# ip xfrm status
其他资源
-
您系统上的
IPsec.conf (5)
手册页
5.18.5. 使用 nmstatectl 配置具有 PSK 验证和传输模式的 host-to-host IPsec VPN
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 文件。
流程
安装所需的软件包:
# dnf install nmstate libreswan NetworkManager-libreswan
重启 NetworkManager 服务:
# systemctl restart NetworkManager
由于
Libreswan
已安装,请删除其旧的数据库文件,并重新创建它们:# systemctl stop ipsec # rm /etc/ipsec.d/*db # ipsec initnss
导入 PKCS#12 文件:
# ipsec import node-example.p12
导入 PKCS#12 文件时,请输入用来创建该文件的密码。
启用并启动
ipsec
服务:# systemctl enable --now ipsec
创建一个包含以下内容的 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
YAML 文件定义以下设置:
- 1
- IPsec 连接名称
- 2
- IPsec 模式
- 3
- 值
99
表示libreswan
创建一个 IPsecxfrm
虚拟接口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)的持续时间
将设置应用到系统:
# nmstatectl apply ~/create-p2p-transport-authentication.yml
验证
验证 IPsec 状态:
# ip xfrm status
验证 IPsec 策略:
# ip xfrm policy
其他资源
-
您系统上的
IPsec.conf (5)
手册页