6.13. 使用 nmstatectl 配置 IPsec VPN 连接
配置 IPsec VPN 连接,以便在不受信任的网络上建立加密隧道,并确保数据在传输过程中的完整性。通过使用 Nmstate,您可以使用声明性 API 创建 IPsec VPN 连接。
您可以使用 nmstatectl 工具通过 Nmstate API 配置 Libreswan IPsec VPN 连接。nmstatectl 工具是一个命令行工具,用于通过声明性 Nmstate API 管理主机网络。您不必运行多个命令来配置接口,而是在 YAML 文件中定义预期的状态。然后,nmstate 会采用此定义并将其应用到系统。这种方法的关键优点是原子结果。nmstate 确保生成的配置与您的 YAML 定义准确匹配。如果配置的任何部分无法应用,它会自动回滚所有更改,并防止系统进入不正确或损坏的网络状态。
由于 NetworkManager-libreswan 插件的设计,您只能在一个对等点上使用 nmstatectl,且必须在另一个对等点上手动配置 Libreswan。
您可以使用声明性 Nmstate API 在两个设备之间配置主机到主机的 VPN,来在不安全的网络上安全地进行通信。nmstate 确保结果与配置文件匹配或回滚更改。
对于身份验证,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需求,并提供强大的对等身份验证来简化部署。
通常,选择将哪台主机命名为 left 和 right 是任意的。但是,NetworkManager 始终对本地主机使用术语 left,对远程主机使用术语 right。
先决条件
远程对等点运行 Libreswan IPsec,并为 主机到主机 连接做好了准备。
由于
NetworkManager-libreswan插件的设计,Nmstate 无法与其他也使用此插件进行同样连接的对等点进行通信。
流程
如果 Libreswan 尚未安装,请执行以下步骤:
安装所需的软件包:
# dnf install nmstate libreswan NetworkManager-libreswan重启 NetworkManager 服务:
# systemctl restart NetworkManager初始化 Network Security Services (NSS)数据库:
# ipsec initnss命令在
/var/lib/ipsec/nss/目录中创建数据库。在防火墙中打开 IPsec 端口和协议:
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
创建一个 RSA 密钥对:
# ipsec newhostkeyipsec工具将密钥对存储在 NSS 数据库中。在左和右对等点上显示证书密钥属性 ID (CKAID):
# ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>在下一步中需要两个对等主机上的 CKAID。
显示公钥:
在左对等主机上,输入:
# ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...在右对等主机上,输入:
# ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
命令会显示公钥,以及您必须在配置文件中使用的相应参数。
创建一个包含以下内容的 YAML 文件,如
~/ipsec-host-to-host-rsa-auth.yml:--- interfaces: - name: '<connection_name>' type: ipsec libreswan: ikev2: insist left: <ip_address_or_fqdn_of_left_peer> leftid: peer_b leftrsasigkey: <public_key_of_left_peer> leftmodecfgclient: false right: <ip_address_or_fqdn_of_right_peer> rightid: peer_a rightrsasigkey: <public_key_of_right_peer> rightsubnet: <ip_address_of_right_peer>/32示例中指定的设置包括:
ikev2: insist- 将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。在使用 Nmstate 的主机配置中,此设置是必须的。
left=<ip_address_or_fqdn_of_left_peer>和right=<ip_address_or_fqdn_of_right_peer>- 定义对等点主机的 IP 地址或 DNS 名称。
leftid=<id>和rightid=<id>-
定义在互联网密钥交换(IKE)协商过程中是如何识别每个对等主机的。这可以是 IP 地址或字面字符串。请注意,NetworkManager 将 IP 地址以外的所有值解释为字面字符串,并在内部添加一个前导
@符号。这要求 Libreswan 对等点也使用字面字符串作为 ID ,否则身份验证失败。 leftrsasigkey=<public_key>andrightrsasigkey=<public_key>-
指定对等点主机的公钥。使用上一步中
ipsec showhostkey命令显示的值。 leftmodecfgclient: false- 禁用此主机上的动态配置。在使用 Nmstate 的主机配置中,此设置是必须的。
rightsubnet: <ip_address_of_right_peer>/32- 定义主机只能访问这个对等点。在使用 Nmstate 的主机配置中,此设置是必须的。
将设置应用到系统:
# nmstatectl apply ~/ipsec-host-to-host-rsa-auth.yml
验证
显示 IPsec 状态:
# ipsec status如果连接成功建立,输出会包含如下行:
互联网密钥交换版本 2 (IKEv2)协商的阶段 1 已成功完成:
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;Security Association(SA)现在已准备好协商实际数据加密隧道,称为子 SA 或阶段 2 SA。
子 SA 已建立:
000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;这是您的数据流量通过的实际隧道。
故障排除
要显示 NetworkManager 传递给 Libreswan 的实际配置,请输入:
# nmcli connection export <connection_name>当您将设置与远程主机上的 Libreswan 配置进行比较时,输出可帮助识别有偏差的设置(如 ID 和密钥)。
后续步骤
- 如果您在具有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能容易被重定向。有关详情和缓解步骤,请参阅 将 VPN 连接分配给专用的路由表,以防止连接绕过隧道。