23.3. 设置 IPsec VPN
虚拟专用网络(VPN)是一种通过互联网连接到本地网络的方法。Libreswan
提供的 IPsec
是创建 VPN 的首选方法。libreswan
是 VPN 的用户空间 IPsec
实现。VPN 通过在中间网络(如互联网)设置隧道来启用 LAN 和另一个远程 LAN 之间的通信。为了安全起见,VPN 隧道总是使用认证和加密。对于加密操作,Libreswan
使用 NSS
库。
23.3.1. libreswan 作为 IPsec VPN 的实现 复制链接链接已复制到粘贴板!
在 RHEL 中,您可以使用 Libreswan 应用程序支持的 IPsec 协议配置虚拟专用网络(VPN)。Libreswan 是 Openswan 应用程序的延续,Openswan 文档中的许多示例可以通过 Libreswan 交换。
VPN 的 IPsec 协议使用互联网密钥交换(IKE)协议进行配置。术语 IPsec 和 IKE 可互换使用。IPsec VPN 也称为 IKE VPN、IKEv2 VPN、XAUTH VPN、Cisco VPN 或 IKE/IPsec VPN。IPsec VPN 变体,它使用 Level 2 Tunneling Protocol(L2TP),被称为 L2TP/IPsec VPN,它需要 optional
软件仓库提供的 xl2tpd
软件包。
libreswan 是一个开源用户空间 IKE 实现。IKE v1 和 v2 作为用户级别的守护进程实现。IKE 协议也加密。IPsec 协议由 Linux 内核实现,Libreswan 配置内核以添加和删除 VPN 隧道配置。
IKE 协议使用 UDP 端口 500 和 4500。IPsec 协议由两个协议组成:
- 封装安全性 Payload(ESP),其协议号为 50。
- 经过身份验证的标头(AH),其协议号为 51。
不建议使用 AH 协议。建议将 AH 用户迁移到使用 null 加密的 ESP。
IPsec 协议提供两种操作模式:
- 隧道模式(默认)
- 传输模式
您可以用没有 IKE 的 IPsec 来配置内核。这称为 手动键控。您还可以使用 ip xfrm
命令来配置手动密钥,但为了安全起见,强烈建议您不要这样做。Libreswan 使用 Netlink 接口与 Linux 内核进行通信。内核执行数据包加密和解密。
Libreswan 使用网络安全服务 (NSS) 加密库。NSS 认证用于 联邦信息处理标准( FIPS)出版物 140-2。
IKE/IPsec VPN(由 Libreswan 和 Linux 内核实现)是 RHEL 中推荐的唯一 VPN 技术。在不了解这样做风险的情况下不要使用任何其他 VPN 技术。
在 RHEL 中,Libreswan 默认遵循系统范围的加密策略。这样可确保 Libreswan 将当前威胁模型包括(IKEv2)的安全设置用作默认协议。如需更多信息,请参阅 使用系统范围的加密策略。
Libreswan 没有使用术语"源(source)"和"目的地(destination)"或"服务器(server)"和"客户端(client)",因为 IKE/IPsec 使用对等(peer to peer)协议。相反,它使用术语"左"和"右"来指端点(主机)。这也允许您在大多数情况下在两个端点使用相同的配置。但是,管理员通常选择始终对本地主机使用"左",对远程主机使用"右"。
leftid
和 rightid
选项充当身份验证过程中相应主机的标识。详情请查看 ipsec.conf(5)
手册页。
23.3.2. Libreswan 中的身份验证方法 复制链接链接已复制到粘贴板!
Libreswan 支持多种身份验证方法,每种方法适合不同的场景。
预共享密钥(PSK)
预共享密钥 (PSK)是最简单的身份验证方法。出于安全考虑,请勿使用小于 64 个随机字符的 PSK。在 FIPS 模式中,PSK 必须符合最低强度要求,具体取决于所使用的完整性算法。您可以使用 authby=secret
连接来设置 PSK。
原始 RSA 密钥
原始 RSA 密钥 通常用于静态主机到主机或子网到子网 IPsec 配置。每个主机都使用所有其他主机的公共 RSA 密钥手动配置,Libreswan 在每对主机之间建立 IPsec 隧道。对于大量主机,这个方法不能很好地扩展。
您可以使用 ipsec newhostkey
命令在主机上生成原始 RSA 密钥。您可以使用 ipsec showhostkey
命令列出生成的密钥。使用 CKA ID 密钥的连接配置需要 leftrsasigkey=
行。原始 RSA 密钥使用 authby=rsasig
连接选项。
X.509 证书
X.509 证书 通常用于大规模部署连接到通用 IPsec 网关的主机。中心 证书颁发机构 (CA)为主机或用户签署 RSA 证书。此中央 CA 负责中继信任,包括单个主机或用户的撤销。
例如,您可以使用 openssl
命令和 NSS certutil
命令来生成 X.509 证书。因为 Libreswan 使用 leftcert=
配置选项中证书的昵称从 NSS 数据库读取用户证书,所以在创建证书时请提供昵称。
如果使用自定义 CA 证书,则必须将其导入到网络安全服务(NSS)数据库中。您可以使用 ipsec import
命令将 PKCS #12 格式的任何证书导入到 Libreswan NSS 数据库。
Libreswan 需要互联网密钥交换(IKE)对等 ID 作为每个对等证书的主题替代名称(SAN),如 RFC 4945 的 3.1 章节 所述。通过设置 require-id-on-certificate=no
connection 选项禁用此检查,可能会导致系统容易受到中间人攻击。
使用 authby=rsasig
连接选项,根据使用带 SHA-1 和 SHA-2 的 RSA 的 X.509 证书进行身份验证。您可以通过将 authby=
设为 ecdsa
,使用 SHA-2 ,以及使用通过 authby=rsa-sha2
的基于 SHA-2 的身份验证的 RSA 概率签名方案(RSASSA-PSS)数字签名来进一步限制 ECDSA 数字签名。默认值为 authby=rsasig,ecdsa
。
证书和 authby=
签名方法应匹配。这提高了互操作性,并在一个数字签名系统中保留身份验证。
NULL 身份验证
NULL 身份验证 用来在没有身份验证的情况下获得网状加密。它可防止被动攻击,但不能防止主动攻击。但是,因为 IKEv2 允许非对称身份验证方法,因此 NULL 身份验证也可用于互联网规模的机会主义 IPsec。在此模型中,客户端对服务器进行身份验证,但服务器不对客户端进行身份验证。此模型类似于使用 TLS 的安全网站。使用 authby=null
进行 NULL 身份验证。
保护量子计算机
除了上述身份验证方法外,您还可以使用 Post-quantum Pre-shared Key (PPK)方法来防止量子计算机可能的攻击。单个客户端或客户端组可以通过指定与带外配置的预共享密钥对应的 PPK ID 来使用它们自己的 PPK。
使用带有预共享密钥的 IKEv1 防止量子攻击者。重新设计 IKEv2 不会原生提供这种保护。Libreswan 提供使用 Post-quantum Pre-shared Key (PPK)来保护 IKEv2 连接免受量子攻击。
要启用可选的 PPK 支持,请在连接定义中添加 ppk=yes
。如需要 PPK,请添加 ppk=insist
。然后,可以给每个客户端一个带有 secret 值的 PPK ID ,该 secret 值在带外进行通信(最好是量子安全的)。PPK 应该具有很强的随机性,而不是基于字典中的单词。PPK ID 和 PPK 数据保存在 ipsec.secrets
文件中,例如:
@west @east : PPKS "user1" "thestringismeanttobearandomstr"
@west @east : PPKS "user1" "thestringismeanttobearandomstr"
PPKS
选项指的是静态 PPK。这个实验性功能使用基于一次性平板的动态 PPK。在每个连接中,一次性平板的一个新部件用作 PPK。当使用时,文件中动态 PPK 的那部分被零覆盖,以防止重复使用。如果没有剩下一次性资源,连接会失败。详情请查看 ipsec.secrets(5)
手册页。
动态 PPK 的实现是作为不受支持的技术预览提供的。请谨慎使用。
23.3.3. 安装 Libreswan 复制链接链接已复制到粘贴板!
在通过 Libreswan IPsec/IKE 实现设置 VPN 之前,您必须安装相应的软件包,启动 ipsec
服务,并在防火墙中允许服务。
先决条件
-
AppStream
存储库已启用。
流程
安装
libreswan
软件包:yum install libreswan
# yum install libreswan
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果要重新安装 Libreswan,请删除其旧的数据库文件,并创建一个新的数据库:
systemctl stop ipsec rm /etc/ipsec.d/*db ipsec initnss
# systemctl stop ipsec # rm /etc/ipsec.d/*db # ipsec initnss
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
ipsec
服务,并启用该服务,以便其在引导时自动启动:systemctl enable ipsec --now
# systemctl enable ipsec --now
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过添加
ipsec
服务,将防火墙配置为允许 IKE、ESP 和 AH 协议的 500 和 4500/UDP 端口:firewall-cmd --add-service="ipsec" firewall-cmd --runtime-to-permanent
# firewall-cmd --add-service="ipsec" # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
23.3.4. 创建主机到主机的 VPN 复制链接链接已复制到粘贴板!
您可以使用原始 RSA 密钥身份验证将 Libreswan 配置为在两个称为 left 和 right 的主机之间创建主机到主机的 IPsec VPN。
先决条件
-
Libreswan 已安装 ,并在每个节点上启动了
ipsec
服务。
流程
在每台主机上生成原始 RSA 密钥对:
ipsec newhostkey
# ipsec newhostkey
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上一步返回生成的密钥的
ckaid
。在 左 主机上使用ckaid
和以下命令,例如:ipsec showhostkey --left --ckaid 2d3ea57b61c9419dfd6cf43a1eb6cb306c0e857d
# ipsec showhostkey --left --ckaid 2d3ea57b61c9419dfd6cf43a1eb6cb306c0e857d
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上一命令的输出生成了配置所需的
leftrsasigkey=
行。在第二台主机(右)上执行相同的操作:ipsec showhostkey --right --ckaid a9e1f6ce9ecd3608c24e8f701318383f41798f03
# ipsec showhostkey --right --ckaid a9e1f6ce9ecd3608c24e8f701318383f41798f03
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
/etc/ipsec.d/
目录中,创建一个新的my_host-to-host.conf
文件。将上一步中ipsec showhostkey
命令的输出中的 RSA 主机密钥写入新文件。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 导入密钥后,重启
ipsec
服务:systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 加载连接:
ipsec auto --add mytunnel
# ipsec auto --add mytunnel
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 建立隧道:
ipsec auto --up mytunnel
# ipsec auto --up mytunnel
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要在
ipsec
服务启动时自动启动隧道,请在连接定义中添加以下行:auto=start
auto=start
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
23.3.5. 配置站点到站点的 VPN 复制链接链接已复制到粘贴板!
要创建站点到站点的 IPsec VPN,通过加入两个网络,在两个主机之间创建一个 IPsec 隧道。主机因此充当端点,它们配置为允许来自一个或多个子网的流量通过。因此您可以将主机视为到网络远程部分的网关。
站点到站点 VPN 的配置只能与主机到主机 VPN 不同,同时必须在配置文件中指定一个或多个网络或子网。
先决条件
- 已配置了主机到主机的 VPN。
流程
将带有主机到主机 VPN 配置的文件复制到新文件中,例如:
cp /etc/ipsec.d/my_host-to-host.conf /etc/ipsec.d/my_site-to-site.conf
# cp /etc/ipsec.d/my_host-to-host.conf /etc/ipsec.d/my_site-to-site.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上一步创建的文件中添加子网配置,例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
23.3.6. 配置远程访问 VPN 复制链接链接已复制到粘贴板!
公路勇士是指拥有移动客户端和动态分配的 IP 地址的旅行用户。移动客户端使用 X.509 证书进行身份验证。
以下示例显示了 IKEv2
的配置,并且避免使用 IKEv1
XAUTH 协议。
在服务器中:
在移动客户端(即 road warrior 的设备)上,使用与之前配置稍有不同的配置:
如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
23.3.7. 配置网格 VPN 复制链接链接已复制到粘贴板!
网格 VPN 网络(也称为 any-to-any VPN ) 是一个所有节点都使用 IPsec 进行通信的网络。该配置可以对于无法使用 IPsec 的节点进行例外处理。可使用两种方式配置网格 VPN 网络:
- 需要 IPsec。
- 首选 IPsec,但允许回退到使用明文通信。
节点之间的身份验证可以基于 X.509 证书或 DNS 安全扩展(DNSSEC)。
您对 opportunistic IPsec 使用任何常规的 IKEv2 验证方法,因为这些连接是常规的 Libreswan 配置,除了由 right=%opportunisticgroup
条目定义的 opportunistic IPsec 之外。常见的身份验证方法是主机使用常用共享认证机构(CA)根据 X.509 证书进行互相验证。作为标准流程的一部分,云部署通常为云中的每个节点发布证书。
不要使用 PreSharedKey (PSK)身份验证,因为一个有危险的主机会导致组 PSK secret 也有危险。
您可以使用 NULL 身份验证在节点间部署加密,而无需认证,这只防止被动攻击者。
以下流程使用 X.509 证书。您可以使用任何类型的 CA 管理系统(如 Dogtag 证书系统)生成这些证书。Dogtag 假设每个节点的证书都以 PKCS #12 格式(.p12
文件)提供,其包含私钥、节点证书和用于验证其他节点的 X.509 证书的根 CA 证书。
每个节点的配置与其 X.509 证书不同。这允许在不重新配置网络中的任何现有节点的情况下添加新节点。PKCS #12 文件需要一个"友好名称",为此,我们使用名称"节点",这样引用友好名称的配置文件对所有节点都是相同的。
先决条件
-
Libreswan 已安装 ,并在每个节点上启动了
ipsec
服务。 一个新的 NSS 数据库已初始化。
如果您已经有一个旧的 NSS 数据库,请删除旧的数据库文件:
systemctl stop ipsec rm /etc/ipsec.d/*db
# systemctl stop ipsec # rm /etc/ipsec.d/*db
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以使用以下命令初始化新数据库:
ipsec initnss
# ipsec initnss
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
在每个节点中导入 PKCS #12 文件。此步骤需要用于生成 PKCS #12 文件的密码:
ipsec import nodeXXX.p12
# ipsec import nodeXXX.p12
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为
IPsec 需要的
(专用)、IPsec 可选的
(private-or-clear)和No IPsec
(clear)配置文件创建以下三个连接定义:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
auto
变量有几个选项:您可以使用带有 opportunistic IPsec 的
ondemand
连接选项来启动 IPsec 连接,或者用于显式配置不需要一直激活的连接。这个选项在内核中建立一个陷阱 XFRM 策略,使 IPsec 连接在收到与该策略匹配的第一个数据包时开始。您可以使用以下选项有效地配置和管理 IPsec 连接,无论是使用 Opportunistic IPsec 还是明确配置的连接:
add
选项-
加载连接配置,并为响应远程启动做好准备。但是,连接不会自动从本地端启动。您可以使用
ipsec auto --up
命令手动启动 IPsec 连接。 start
选项- 加载连接配置,并为响应远程启动做好准备。此外,它会立即启动到远程对等点的连接。您可以将这个选项用于永久的和一直活跃的连接。
- 2
leftid
和rightid
变量标识 IPsec 隧道连接的右和左通道。如果您配置了证书,您可以使用这些变量来获取本地 IP 地址或本地证书的主题 DN 的值。- 3
leftcert
变量定义您要使用的 NSS 数据库的昵称。
将网络的 IP 地址添加到对应的类中。例如,如果所有节点都位于
10.15.0.0/16
网络中,则所有节点都必须使用 IPsec 加密:echo "10.15.0.0/16" >> /etc/ipsec.d/policies/private
# echo "10.15.0.0/16" >> /etc/ipsec.d/policies/private
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要允许某些节点(如
10.15.34.0/24
)使用或不使用 IPsec,请将这些节点添加到 private-or-clear 组中:echo "10.15.34.0/24" >> /etc/ipsec.d/policies/private-or-clear
# echo "10.15.34.0/24" >> /etc/ipsec.d/policies/private-or-clear
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要定义一个主机(如
10.15.1.2
),其不能将 IPsec 添加到 clear 组中,请使用:echo "10.15.1.2/32" >> /etc/ipsec.d/policies/clear
# echo "10.15.1.2/32" >> /etc/ipsec.d/policies/clear
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以在
/etc/ipsec.d/policies
目录中从每个新节点的模板创建文件,也可以使用 Puppet 或 Ansible 来置备它们。请注意,每个节点都有相同的异常列表或不同的流量预期。因此,两个节点可能无法通信,因为一个节点需要 IPsec,而另一个节点无法使用 IPsec。
重启节点将其添加到配置的网格中:
systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
验证
使用
ping
命令打开 IPsec 隧道:ping <nodeYYY>
# ping <nodeYYY>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示带有导入认证的 NSS 数据库:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看节点上哪个隧道打开了:
ipsec trafficstatus
# ipsec trafficstatus 006 #2: "private#10.15.0.0/16"[1] ...<nodeYYY>, type=ESP, add_time=1691399301, inBytes=512, outBytes=512, maxBytes=2^63B, id='C=US, ST=NC, O=Example Organization, CN=east'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
23.3.8. 部署符合 FIPS 的 IPsec VPN 复制链接链接已复制到粘贴板!
您可以使用 Libreswan 部署一个符合 FIPS 的 IPsec VPN 解决方案。为此,您可以识别哪些加密算法可用,且哪些在 FIPS 模式下对 Libreswan 禁用了。
先决条件
-
AppStream
存储库已启用。
流程
安装
libreswan
软件包:yum install libreswan
# yum install libreswan
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您要重新安装 Libreswan,请删除其旧的 NSS 数据库:
systemctl stop ipsec rm /etc/ipsec.d/*db
# systemctl stop ipsec # rm /etc/ipsec.d/*db
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
ipsec
服务,并启用该服务,以便其在引导时自动启动:systemctl enable ipsec --now
# systemctl enable ipsec --now
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过添加
ipsec
服务,将防火墙配置为允许 IKE、ESP 和 AH 协议的500
和4500
UDP 端口:firewall-cmd --add-service="ipsec" firewall-cmd --runtime-to-permanent
# firewall-cmd --add-service="ipsec" # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将系统切换到 FIPS 模式:
fips-mode-setup --enable
# fips-mode-setup --enable
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启您的系统以允许内核切换到 FIPS 模式:
reboot
# reboot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
确认 Libreswan 是否在 FIPS 模式下运行:
ipsec whack --fipsstatus
# ipsec whack --fipsstatus 000 FIPS mode enabled
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,检查
systemd
日志中的ipsec
单元条目:journalctl -u ipsec
$ journalctl -u ipsec ... Jan 22 11:26:50 localhost.localdomain pluto[3076]: FIPS Product: YES Jan 22 11:26:50 localhost.localdomain pluto[3076]: FIPS Kernel: YES Jan 22 11:26:50 localhost.localdomain pluto[3076]: FIPS Mode: YES
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以 FIPS 模式查看可用算法:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 FIPS 模式查询禁用的算法:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 FIPS 模式中列出所有允许的算法和密码:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
23.3.9. 使用密码保护 IPsec NSS 数据库 复制链接链接已复制到粘贴板!
默认情况下,IPsec 服务在第一次启动时使用空密码创建其网络安全服务(NSS)数据库。要提高安全性,您可以添加密码保护。
在 RHEL 6.6 和之前的版本中,您必须使用一个密码来保护 IPsec NSS 数据库,以满足 FIPS 140-2 标准的要求,因为 NSS 加密库是针对 FIPS 140-2 Level 2 标准认证的。在 RHEL 8 中,NIS 将 NSS 认证为该标准级别 1,并且该状态不需要对数据库进行密码保护。
先决条件
-
/etc/ipsec.d/
目录包含 NSS 数据库文件。
流程
为 Libreswan 的
NSS
数据库启用密码保护:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建包含您在上一步中设置的密码的
/etc/ipsec.d/nsspassword
文件,例如:cat /etc/ipsec.d/nsspassword NSS Certificate DB:_<password>_
# cat /etc/ipsec.d/nsspassword NSS Certificate DB:_<password>_
Copy to Clipboard Copied! Toggle word wrap Toggle overflow nsspassword
文件使用以下语法:<token_1>:<password1> <token_2>:<password2>
<token_1>:<password1> <token_2>:<password2>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认的 NSS 软件令牌是
NSS 证书 数据库
。如果您的系统以 FIPS 模式运行,则令牌的名称为NSS FIPS 140-2 证书数据库
。根据您的场景,在完成了
nsspassword
文件后,启动或重启ipsec
服务:systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在其 NSS 数据库中添加非空密码后,检查
ipsec
服务是否运行:systemctl status ipsec
# systemctl status ipsec ● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec Loaded: loaded (/usr/lib/systemd/system/ipsec.service; enabled; vendor preset: disable> Active: active (running)...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
Journal
日志是否包含确认成功初始化的条目:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
23.3.10. 配置 IPsec VPN 以使用 TCP 复制链接链接已复制到粘贴板!
Libreswan 支持 IKE 和 IPsec 数据包的 TCP 封装,如 RFC 8229 所述。有了这个功能,您可以在网络上建立 IPsec VPN,以防止通过 UDP 和封装安全负载(ESP)传输的流量。您可以将 VPN 服务器和客户端配置为使用 TCP 作为回退,或者作为主 VPN 传输协议。由于 TCP 封装的性能成本较高,因此只有在您的场景中需要永久阻止 UDP 时,才使用 TCP 作为主 VPN 协议。
先决条件
- 已配置了 远程访问 VPN。
流程
在
/etc/ipsec.conf
文件的config setup
部分中添加以下选项:listen-tcp=yes
listen-tcp=yes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要在第一次尝试 UDP 失败时使用 TCP 封装作为回退选项,请在客户端的连接定义中添加以下两个选项:
enable-tcp=fallback tcp-remoteport=4500
enable-tcp=fallback tcp-remoteport=4500
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,如果您知道 UDP 会被永久阻止,请在客户端的连接配置中使用以下选项:
enable-tcp=yes tcp-remoteport=4500
enable-tcp=yes tcp-remoteport=4500
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
23.3.11. 配置自动检测和使用 ESP 硬件卸载来加速 IPsec 连接 复制链接链接已复制到粘贴板!
卸载硬件的封装安全负载(ESP)来加速以太网上的 IPsec 连接。默认情况下,Libreswan 会检测硬件是否支持这个功能,并因此启用 ESP 硬件卸载。如果这个功能被禁用或被明确启用,您可以切回到自动检测。
先决条件
- 网卡支持 ESP 硬件卸载。
- 网络驱动程序支持 ESP 硬件卸载。
- IPsec 连接已配置且可以正常工作。
流程
-
编辑连接的
/etc/ipsec.d/
目录中的 Libreswan 配置文件,该文件应使用 ESP 硬件卸载支持的自动检测。 -
确保连接的设置中没有设置
nic-offload
参数。 如果您删除了
nic-offload
,请重启ipsec
服务:systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示 IPsec 连接使用的以太网设备的
tx_ipsec
和rx_ipsec
计数器:ethtool -S enp1s0 | grep -E "_ipsec"
# ethtool -S enp1s0 | grep -E "_ipsec" tx_ipsec: 10 rx_ipsec: 10
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过 IPsec 隧道发送流量。例如,ping 远程 IP 地址:
ping -c 5 remote_ip_address
# ping -c 5 remote_ip_address
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 再次显示以太网设备的
tx_ipsec
和rx_ipsec
计数器:ethtool -S enp1s0 | grep -E "_ipsec"
# ethtool -S enp1s0 | grep -E "_ipsec" tx_ipsec: 15 rx_ipsec: 15
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果计数器值增加了,ESP 硬件卸载正常工作。
23.3.12. 在绑定中配置 ESP 硬件卸载以加快 IPsec 连接 复制链接链接已复制到粘贴板!
将封装安全负载(ESP)卸载到硬件可加速 IPsec 连接。如果出于故障转移原因而使用网络绑定,配置 ESP 硬件卸载的要求和流程与使用常规以太网设备的要求和流程不同。例如,在这种情况下,您可以对绑定启用卸载支持,内核会将设置应用到绑定的端口。
先决条件
-
绑定中的所有网卡都支持 ESP 硬件卸载。使用
ethtool -k <interface_name> | grep "esp-hw-offload"
命令验证每个绑定端口是否都支持此功能。 - 绑定已配置且可以正常工作。
-
该绑定使用
active-backup
模式。绑定驱动程序不支持此功能的任何其他模式。 - IPsec 连接已配置且可以正常工作。
流程
对网络绑定启用 ESP 硬件卸载支持:
nmcli connection modify bond0 ethtool.feature-esp-hw-offload on
# nmcli connection modify bond0 ethtool.feature-esp-hw-offload on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个命令在对
bond0
连接启用 ESP 硬件卸载支持。重新激活
bond0
连接:nmcli connection up bond0
# nmcli connection up bond0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑应使用 ESP 硬件卸载的连接的
/etc/ipsec.d/
目录中的 Libreswan 配置文件,并将nic-offload=yes
语句附加到连接条目:conn example ... nic-offload=yes
conn example ... nic-offload=yes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
ipsec
服务:systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证方法取决于各种方面,如内核版本和驱动程序。例如,某些驱动程序提供计数器,但它们的名称可能会有所不同。详情请查看您的网络驱动程序的文档。
以下验证步骤适用于 Red Hat Enterprise Linux 8 上的 ixgbe
驱动程序:
显示绑定的活动端口:
grep "Currently Active Slave" /proc/net/bonding/bond0
# grep "Currently Active Slave" /proc/net/bonding/bond0 Currently Active Slave: enp1s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示活动端口的
tx_ipsec
和rx_ipsec
计数器:ethtool -S enp1s0 | grep -E "_ipsec"
# ethtool -S enp1s0 | grep -E "_ipsec" tx_ipsec: 10 rx_ipsec: 10
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过 IPsec 隧道发送流量。例如,ping 远程 IP 地址:
ping -c 5 remote_ip_address
# ping -c 5 remote_ip_address
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 再次显示活动端口的
tx_ipsec
和rx_ipsec
计数器:ethtool -S enp1s0 | grep -E "_ipsec"
# ethtool -S enp1s0 | grep -E "_ipsec" tx_ipsec: 15 rx_ipsec: 15
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果计数器值增加了,ESP 硬件卸载正常工作。
23.3.13. 使用 RHEL 系统角色配置 VPN 连接 复制链接链接已复制到粘贴板!
VPN 是一个加密连接,用于通过不受信任的网络安全地传输流量。通过使用 vpn
RHEL 系统角色,您可以自动化创建 VPN 配置的过程。
vpn
RHEL 系统角色只支持 Libreswan (它是一个 IPsec 实现,作为 VPN 提供商)。
您可以使用 IPsec ,通过 VPN 直接将主机互联。主机可以使用预共享密钥(PSK)进行相互验证。通过使用 vpn
RHEL 系统角色,您可以自动化创建带有 PSK 身份验证的 IPsec 主机到主机连接的过程。
默认情况下,角色创建一个基于隧道的 VPN。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
hosts: <list>
定义一个 YAML 字典,其中包含您想要在它们之间配置 VPN 的主机。如果条目不是一个 Ansible 管理的节点,则您必须在
hostname
参数中指定其完全限定域名(FQDN)或 IP 地址,例如:... - hosts: ... external-host.example.com: hostname: 192.0.2.1
... - hosts: ... external-host.example.com: hostname: 192.0.2.1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 角色在每个受管节点上配置 VPN 连接。连接被命名为
<host_A>-to-<host_B>
,例如managed-node-01.example.com-to-managed-node-02.example.com
。请注意,角色不能在外部(未管理的)节点上配置 Libreswan。您必须在这些主机上手动创建配置。auth_method: psk
-
在主机之间启用 PSK 身份验证。角色在控制节点上使用
openssl
来创建 PSK。 auto: <start-up_method>
-
指定连接的启动方法。有效值是
add
、ondemand
、start
和ignore
。详情请查看安装了 Libreswan 的系统上的ipsec.conf (5)
手册页。此变量的默认值为 null,这意味着没有自动启动操作。 vpn_manage_firewall: true
-
定义角色在受管节点上的
firewalld
服务中打开所需的端口。 vpn_manage_selinux: true
- 定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.vpn/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
确认连接已成功启动,例如:
ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
# ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"' ... 006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的
auto
变量设置为start
以外的值,您可能需要首先手动激活受管节点上的连接。
您可以使用 IPsec ,通过 VPN 直接将主机互联。例如,要通过最大程度减少被截获或破坏的控制消息的风险来增强安全性,您可以为数据流量和控制流量配置单独的连接。通过使用 vpn
RHEL 系统角色,您可以自动化创建带有单独的数据和控制平面及 PSK 身份验证的 IPsec 主机到主机连接的过程。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
hosts: <list>
定义一个 YAML 字典,其中包含您想要在它们之间配置 VPN 的主机。连接被命名为
<name>-<IP_address_A>-to-<IP_address_B>
,例如control_plane_vpn-203.0.113.1-to-198.51.100.2
。角色在每个受管节点上配置 VPN 连接。请注意,角色不能在外部(未管理的)节点上配置 Libreswan。您必须在这些主机上手动创建配置。
auth_method: psk
-
在主机之间启用 PSK 身份验证。角色在控制节点上使用
openssl
来创建预共享密钥。 auto: <start-up_method>
-
指定连接的启动方法。有效值是
add
、ondemand
、start
和ignore
。详情请查看安装了 Libreswan 的系统上的ipsec.conf (5)
手册页。此变量的默认值为 null,这意味着没有自动启动操作。 vpn_manage_firewall: true
-
定义角色在受管节点上的
firewalld
服务中打开所需的端口。 vpn_manage_selinux: true
- 定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.vpn/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
确认连接已成功启动,例如:
ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"'
# ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"' ... 006 #3: "control_plane_vpn-203.0.113.1-to-198.51.100.2", type=ESP, add_time=1741860073, inBytes=0, outBytes=0, maxBytes=2^63B, id='198.51.100.2'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的
auto
变量设置为start
以外的值,您可能需要首先手动激活受管节点上的连接。
Libreswan 支持创建一个机会网格,以便在每个主机上带有单个配置的大量主机之间建立 IPsec 连接。将主机添加到网格中不需要更新现有主机上的配置。为提高安全性,请在 Libreswan 中使用基于证书的身份验证。
通过使用 vpn
RHEL 系统角色,您可以在受管节点之间自动化配置带有基于证书的身份验证的 VPN 网格。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 您可以为每个受管节点准备一个 PKCS #12 文件:
每个文件包含:
- 证书颁发机构(CA)证书
- 节点的私钥
- 节点的客户端证书
-
文件被命名为
<managed_node_name_as_in_the_inventory>.p12
。 - 文件存储在与 playbook 相同的目录中。
流程
编辑
~/inventory
文件,并附加cert_name
变量:managed-node-01.example.com cert_name=managed-node-01.example.com managed-node-02.example.com cert_name=managed-node-02.example.com managed-node-03.example.com cert_name=managed-node-03.example.com
managed-node-01.example.com cert_name=managed-node-01.example.com managed-node-02.example.com cert_name=managed-node-02.example.com managed-node-03.example.com cert_name=managed-node-03.example.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
cert_name
变量设置为每个主机的证书中使用的通用名称(CN)字段的值。通常,CN 字段被设置为完全限定域名(FQDN)。将敏感变量存储在加密的文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:pkcs12_pwd: <password>
pkcs12_pwd: <password>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
opportunistic: true
-
在多个主机之间启用机会网格。
policies
变量定义哪些子网和主机流量必须或可以加密,它们中哪些应该继续使用明文连接。 auth_method: cert
- 启用基于证书的身份验证。这要求您在清单中指定每个受管节点的证书的昵称。
policies: <list_of_policies>
以 YAML 列表格式定义 Libreswan 策略。
默认策略是
private-or-clear
。要将它改为private
,上面的 playbook 包含默认cidr
条目的一个相应策略。如果 Ansible 控制节点与受管节点在同一个 IP 子网中,要防止执行 playbook 期间丢失 SSH 连接,请为控制节点的 IP 地址添加一个
clear
策略。例如,如果应该为192.0.2.0/24
子网配置网格,并且控制节点使用 IP 地址192.0.2.1
,则您需要一个用于192.0.2.1/32
的clear
策略,如 playbook 中所示。有关策略的详情,请查看安装了 Libreswan 的系统上的
ipsec.conf (5)
手册页。vpn_manage_firewall: true
-
定义角色在受管节点上的
firewalld
服务中打开所需的端口。 vpn_manage_selinux: true
- 定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.vpn/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在网格的一个节点上,ping 另一个节点来激活连接:
ping managed-node-02.example.com
[root@managed-node-01]# ping managed-node-02.example.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确认连接是否处于活跃状态:
ipsec trafficstatus
[root@managed-node-01]# ipsec trafficstatus 006 #2: "private#192.0.2.0/24"[1] ...192.0.2.2, type=ESP, add_time=1741938929, inBytes=372408, outBytes=545728, maxBytes=2^63B, id='CN=managed-node-02.example.com'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
23.3.14. 配置选择不使用系统范围的加密策略的 IPsec 连接 复制链接链接已复制到粘贴板!
为连接覆盖系统范围的加密策略
RHEL 系统范围的加密策略会创建一个名为 %default
的特殊连接。此连接包含 ikev2
、esp
和 ike
选项的默认值。但是,您可以通过在连接配置文件中指定上述选项来覆盖默认值。
例如,以下配置允许使用带有 AES 和 SHA-1 或 SHA-2的 IKEv1 连接,以及带有 AES-GCM 或 AES-CBC 的 IPsec(ESP) 连接:
请注意,AES-GCM 可用于 IPsec(ESP)和 IKEv2,但不适用于 IKEv1。
为所有连接禁用系统范围的加密策略
要禁用所有 IPsec 连接的系统范围的加密策略,请在 /etc/ipsec.conf
文件中注释掉以下行:
include /etc/crypto-policies/back-ends/libreswan.config
include /etc/crypto-policies/back-ends/libreswan.config
然后将 ikev2=never
选项添加到连接配置文件。
23.3.15. IPsec VPN 配置故障排除 复制链接链接已复制到粘贴板!
与 IPsec VPN 配置相关的问题通常是由于几个主要原因造成的。如果您遇到此类问题,您可以检查问题的原因是否符合一下任何一种情况,并应用相应的解决方案。
基本连接故障排除
VPN 连接的大多数问题都发生在新部署中,管理员使用不匹配的配置选项配置了端点。此外,正常工作的配置可能会突然停止工作,通常是由于新引入的不兼容的值。这可能是管理员更改配置的结果。或者,管理员可能已安装了固件更新,或者使用某些选项的不同默认值(如加密算法)安装了软件包更新。
要确认已建立 IPsec VPN 连接:
ipsec trafficstatus
# ipsec trafficstatus
006 #8: "vpn.example.com"[1] 192.0.2.1, type=ESP, add_time=1595296930, inBytes=5999, outBytes=3231, id='@vpn.example.com', lease=100.64.13.5/32
如果输出为空或者没有显示具有连接名称的条目,则隧道将断开。
检查连接中的问题:
重新载入 vpn.example.com 连接:
ipsec auto --add vpn.example.com
# ipsec auto --add vpn.example.com 002 added connection description "vpn.example.com"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 下一步,启动 VPN 连接:
ipsec auto --up vpn.example.com
# ipsec auto --up vpn.example.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
与防火墙相关的问题
最常见的问题是,其中一个 IPsec 端点或端点之间路由器上的防火墙将所有互联网密钥交换(IKE)数据包丢弃。
对于 IKEv2,类似以下示例的输出说明防火墙出现问题:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于 IKEv1,启动命令的输出如下:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
由于用于设置 IPsec 的 IKE 协议已经加密,因此您只能使用 tcpdump
工具排除一小部分问题。如果防火墙丢弃了 IKE 或 IPsec 数据包,您可以尝试使用 tcpdump
工具来查找原因。但是,tcpdump
无法诊断 IPsec VPN 连接的其他问题。
捕获
eth0
接口上的 VPN 协商以及所有加密数据:tcpdump -i eth0 -n -n esp or udp port 500 or udp port 4500 or tcp port 4500
# tcpdump -i eth0 -n -n esp or udp port 500 or udp port 4500 or tcp port 4500
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
不匹配的算法、协议和策略
VPN 连接要求端点具有匹配的 IKE 算法、IPsec 算法和 IP 地址范围。如果发生不匹配,连接会失败。如果您使用以下方法之一发现不匹配,请通过匹配算法、协议或策略来修复它。
如果远程端点没有运行 IKE/IPsec,您可以看到一个 ICMP 数据包来指示它。例如:
ipsec auto --up vpn.example.com
# ipsec auto --up vpn.example.com ... 000 "vpn.example.com"[1] 192.0.2.2 #16: ERROR: asynchronous network error report on wlp2s0 (192.0.2.2:500), complainant 198.51.100.1: Connection refused [errno 111, origin ICMP type 3 code 3 (not authenticated)] ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 不匹配 IKE 算法示例:
ipsec auto --up vpn.example.com
# ipsec auto --up vpn.example.com ... 003 "vpn.example.com"[1] 193.110.157.148 #3: dropping unexpected IKE_SA_INIT message containing NO_PROPOSAL_CHOSEN notification; message payloads: N; missing payloads: SA,KE,Ni
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 不匹配 IPsec 算法示例:
ipsec auto --up vpn.example.com
# ipsec auto --up vpn.example.com ... 182 "vpn.example.com"[1] 193.110.157.148 #5: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_256 group=MODP2048} 002 "vpn.example.com"[1] 193.110.157.148 #6: IKE_AUTH response contained the error notification NO_PROPOSAL_CHOSEN
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 不匹配的 IKE 版本还可导致远程端点在没有响应的情况下丢弃请求。这与丢弃所有 IKE 数据包的防火墙相同。
IKEv2 不匹配的 IP 地址范围示例(称为流量选择器 - TS):
ipsec auto --up vpn.example.com
# ipsec auto --up vpn.example.com ... 1v2 "vpn.example.com" #1: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_512 group=MODP2048} 002 "vpn.example.com" #2: IKE_AUTH response contained the error notification TS_UNACCEPTABLE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IKEv1 的不匹配 IP 地址范围示例:
ipsec auto --up vpn.example.com
# ipsec auto --up vpn.example.com ... 031 "vpn.example.com" #2: STATE_QUICK_I1: 60 second timeout exceeded after 0 retransmits. No acceptable response to our first Quick Mode message: perhaps peer likes no proposal
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当在 IKEv1 中使用预共享密钥(PSK)时,如果双方没有放入相同的 PSK ,则整个 IKE 信息将无法读取:
ipsec auto --up vpn.example.com
# ipsec auto --up vpn.example.com ... 003 "vpn.example.com" #1: received Hash Payload does not match computed value 223 "vpn.example.com" #1: sending notification INVALID_HASH_INFORMATION to 192.0.2.23:500
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 IKEv2 中,不匹配-PSK 错误会导致 AUTHENTICATION_FAILED 信息:
ipsec auto --up vpn.example.com
# ipsec auto --up vpn.example.com ... 002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILED
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
最大传输单元
除防火墙阻止 IKE 或 IPsec 数据包外,网络问题的最常见原因与加密数据包的数据包大小增加有关。网络硬件对于大于最大传输单元(MTU)的数据包进行分片处理,例如 1500 字节。通常,片会丢失,数据包无法重新组装。当使用小数据包的 ping 测试可以正常工作,但其他流量失败时,这会导致间歇性故障。在这种情况下,您可以建立一个 SSH 会话,但是一使用它,终端就会冻结,例如,在远程主机上输入 'ls -al /usr' 命令。
要临时解决这个问题,请通过将 mtu=1400
选项添加到隧道配置文件中来减小 MTU 大小。
另外,对于 TCP 连接,启用更改 MSS 值的 iptables 规则:
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
如果上一命令没有解决您场景中的问题,请在 set-mss
参数中直接指定较小的数值:
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380
# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380
网络地址转换(NAT)
当 IPsec 主机也充当 NAT 路由器时,可能会意外地重新映射数据包。以下示例配置演示了这个问题:
地址为 172.16.0.1 的系统有一个 NAT 规则:
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
如果地址为 10.0.2.33 的系统将数据包发送到 192.168.0.1,那么路由器会在应用 IPsec 加密前将源 10.0.2.33 转换为 172.16.0.1。
然后,源地址为 10.0.2.33 的数据包不再与 conn myvpn
配置匹配, IPsec 不会加密此数据包。
要解决这个问题,请在路由器上插入目标 IPsec 子网范围不包含 NAT 的规则,例如:
iptables -t nat -I POSTROUTING -s 10.0.2.0/24 -d 192.168.0.0/16 -j RETURN
iptables -t nat -I POSTROUTING -s 10.0.2.0/24 -d 192.168.0.0/16 -j RETURN
内核 IPsec 子系统错误
例如,当 bug 导致 IKE 用户空间和 IPsec 内核不同步时,内核 IPsec 子系统可能会失败。检查此问题:
cat /proc/net/xfrm_stat XfrmInError 0 XfrmInBufferError 0 ...
$ cat /proc/net/xfrm_stat
XfrmInError 0
XfrmInBufferError 0
...
上一命令输出中的任何非零值都表示有问题。如果您遇到这个问题,请开一个新的 支持问题单,并附上上一命令的输出与对应的 IKE 日志。
libreswan 日志
默认情况下,Libreswan 使用 syslog
协议的日志。您可以使用 journalctl
命令来查找与 IPsec 有关的日志条目。因为日志中相应的条目是由 pluto
IKE 守护进程发送的,因此请搜索 "pluto" 关键字,例如:
journalctl -b | grep pluto
$ journalctl -b | grep pluto
显示 ipsec
服务的实时日志:
journalctl -f -u ipsec
$ journalctl -f -u ipsec
如果默认日志记录级别没有显示您的配置问题,请将 plutodebug=all
选项添加到 /etc/ipsec.conf
文件的 config setup
部分来启用调试日志。
请注意,调试日志记录会生成大量的条目,journald
或 syslogd
服务的速率可能会抑制 syslog
消息。要确保您有完整的日志,请将日志记录重定向到文件中。编辑 /etc/ipsec.conf
,并在 config setup
部分中添加 logfile=/var/log/pluto.log
。
23.3.16. 使用 control-center 配置 VPN 连接 复制链接链接已复制到粘贴板!
如果您使用带有图形界面的 Red Hat Enterprise Linux,您可以在 GNOME control-center
中配置 VPN 连接。
先决条件
-
已安装
NetworkManager-libreswan-gnome
软件包。
流程
-
按 Super 键,输入
Settings
,然后按 Enter 键打开control-center
应用程序。 -
选择左侧的
Network
条目。 - 点 + 图标。
-
选择
VPN
。 选择
Identity
菜单项来查看基本配置选项:General
Gateway
- 远程 VPN 网关的名称或IP
地址。认证
Type
-
IKEv2(Certificate)
- 客户端通过证书进行身份验证。它更安全(默认)。 IKEv1(XAUTH)
- 客户端通过用户名和密码或预共享密钥(PSK)进行身份验证。以下配置设置在
高级
部分中提供:图 23.1. VPN 连接的高级选项
警告当使用
gnome-control-center
应用程序配置基于 IPsec 的 VPN 连接时,高级
对话框会显示配置,但它不允许任何更改。因此,用户无法更改任何高级 IPsec 选项。使用nm-connection-editor
或nmcli
工具来配置高级属性。身份识别
域
- 如果需要,输入域名。安全性
-
Phase1 Algorithms
- 对应于ike
Libreswan 参数 - 输入用来验证和设置加密频道的算法。 Phase2 Algorithms
- 对应于esp
Libreswan 参数 - 输入用于IPsec
协商的算法。选择
Disable PFS
字段来关闭 Perfect Forward Secrecy(PFS),以确保与不支持 PFS 的旧服务器兼容。-
Phase1 Lifetime
- 对应于ikelifetime
Libreswan 参数 - 用于加密流量的密钥的有效期。 Phase2 Lifetime
- 对应于salifetime
Libreswan 参数 - 在过期前连接的特定实例应多久。注意:为了安全起见,加密密钥应该不时地更改。
Remote network
- 对应于rightsubnet
Libreswan 参数 - 应该通过 VPN 访问的目标专用远程网络。检查
缩减
字段以启用缩小字段。请注意,它只在 IKEv2 协商中有效。-
Enable fragmentation
- 对应于fragmentation
Libreswan 参数 - 是否允许 IKE 分段。有效值为yes
(默认)或no
。 -
Enable Mobike
- 与mobike
Libreswan 参数对应 - 是否允许移动和多形协议(MOBIKE、RFC 455)启用连接来迁移其端点,而无需从头开始重启连接。这可用于在有线、无线或者移动数据连接之间进行切换的移动设备。值为no
(默认)或yes
。
-
选择
菜单条目:IPv4 方法
-
Automatic (DHCP)
- 如果您要连接的网络使用DHCP
服务器来分配动态IP
地址,请选择此选项。 -
Link-Local Only
- 如果您要连接的网络没有DHCP
服务器且您不想手动分配IP
地址,请选择这个选项。随机地址将根据 RFC 3927 分配,带有前缀169.254/16
。 -
手动
- 如果您要手动分配IP
地址,请选择这个选项。 Disable
- 在这个连接中禁用IPv4
。DNS
在
DNS
部分,当Automatic
为ON
时,将其切换到OFF
以输入您要用逗号分开的 DNS 服务器的 IP 地址。Routes
请注意,在
Routes
部分,当Automatic
为ON
时,会使用 DHCP 的路由,但您也可以添加额外的静态路由。当OFF
时,只使用静态路由。-
Address
- 输入远程网络或主机的IP
地址。 -
Netmask
- 以上输入的IP
地址的子网掩码或前缀长度。 -
Gateway
- 上面输入的远程网络或主机的网关的IP
地址。 Metric
- 网络成本,赋予此路由的首选值。数值越低,优先级越高。仅将此连接用于其网络上的资源
选择这个复选框以防止连接成为默认路由。选择这个选项意味着只有特别用于路由的流量才会通过连接自动获得,或者手动输入到连接上。
-
要在
VPN
连接中配置IPv6
设置,请选择 菜单条目:IPv6 Method
-
Automatic
- 选择这个选项使用IPv6
Stateless Address AutoConfiguration(SLAAC)根据硬件地址和路由器公告(RA)创建自动的、无状态的配置。 -
Automatic, DHCP only
- 选择这个选项以不使用 RA,但从DHCPv6
请求信息以创建有状态的配置。 -
Link-Local Only
- 如果您要连接的网络没有DHCP
服务器且您不想手动分配IP
地址,请选择这个选项。随机地址将根据 RFC 4862 分配,前缀为FE80::0
。 -
手动
- 如果您要手动分配IP
地址,请选择这个选项。 Disable
- 在这个连接中禁用IPv6
。请注意,
DNS
,Routes
,Use this connection only for resources on its network
项是IPv4
的常规设置。
-
-
编辑完
VPN
连接后,点 按钮自定义配置或 按钮为现有配置保存它。 -
将配置集切换到
ON
以激活VPN
连接。 - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
23.3.17. 使用 nm-connection-editor 配置 VPN 连接 复制链接链接已复制到粘贴板!
如果使用带有图形界面的 Red Hat Enterprise Linux,您可以在 nm-connection-editor
应用程序中配置 VPN 连接。
先决条件
-
已安装
NetworkManager-libreswan-gnome
软件包。 如果您配置了互联网密钥交换版本 2(IKEv2)连接:
- 证书导入到 IPsec 网络安全服务(NSS)数据库中。
- NSS 数据库中的证书 nickname 是已知的。
流程
打开终端窗口,输入:
nm-connection-editor
$ nm-connection-editor
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 点击 按钮来添加一个新的连接。
-
选择
IPsec based VPN
连接类型,然后点击 。 在
VPN
选项卡中:在
Gateway
字段中输入 VPN 网关的主机名或 IP 地址,然后选择验证类型。根据验证类型,您必须输入不同的额外信息:-
IKEv2(认证)
使用证书验证客户端,这会更安全。这个设置需要在 IPsec NSS 数据库中指定证书的 nickname IKEv1(XAUTH)
使用用户名和密码(预共享密钥)验证用户身份。此设置要求您输入以下值:- 用户名
- 密码
- 组名称
- Secret
-
如果远程服务器为 IKE 交换指定了本地标识符,在
Remote ID
字段中输入准确的字符串。在运行 Libreswan 的远程服务器中,这个值是在服务器的leftid
参数中设置的。可选:点
按钮配置附加设置。您可以配置以下设置:身份识别
-
域
- 如果需要,请输入域名。
-
安全性
-
Phase1 Algorithms
对应于 ikeLibreswan
参数。输入用来验证和设置加密频道的算法。 Phase2 Algorithms
对应于esp
Libreswan 参数。输入用于IPsec
协商的算法。选择
Disable PFS
字段来关闭 Perfect Forward Secrecy(PFS),以确保与不支持 PFS 的旧服务器兼容。-
Phase1 Lifetime
与ikelifetime
Libreswan 参数对应。此参数定义用于加密流量的密钥的有效期。 -
Phase2 Lifetime
与salifetime
Libreswan 参数对应。这个参数定义安全关联有效期。
-
连接性
远程网络
与rightsubnet
Libreswan 参数对应,并定义应通过 VPN 访问的目标专用远程网络。检查
缩减
字段以启用缩小字段。请注意,它只在 IKEv2 协商中有效。-
Enable fragmentation
与segmentation
Libreswan 参数对应,并定义是否允许 IKE 分段。有效值为yes
(默认)或no
。 -
Enable Mobike
与mobike
参数对应。参数定义是否允许 Mobility 和 Multihoming 协议(MOBIKE) (RFC 4555)来启用连接来迁移其端点,而无需从头开始重启连接。这可用于在有线、无线或者移动数据连接之间进行切换的移动设备。值为no
(默认)或yes
。
在
IPv4 Settings
选项卡中,选择 IP 分配方法,并可选择设置额外的静态地址、DNS 服务器、搜索域和路由。- 保存连接。
-
关闭
nm-connection-editor
。 - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
当您点 NetworkManager 会为那个连接创建新配置文件,然后打开同一个对话框来编辑现有连接。这两个对话框之间的区别在于现有连接配置集有详情菜单条目。
按钮添加新连接时,23.3.18. 将 VPN 连接分配给专用路由表,以防止连接绕过隧道 复制链接链接已复制到粘贴板!
DHCP 服务器和无状态地址自动配置(SLAAC)都可以将路由添加到客户端的路由表中。例如,恶意的 DHCP 服务器可以使用此功能强制带有 VPN 连接的主机通过物理接口而不是 VPN 隧道重定向流量。此漏洞也称为 TunnelVision,并参见 CVE-2024-3661 漏洞文章中所述。
要缓解此漏洞,您可以将 VPN 连接分配给专用路由表。这可防止 DHCP 配置或 SLAAC 来处理用于 VPN 隧道的网络数据包的路由决策。
如果至少有一个条件应用到您的环境,请按照以下步骤操作:
- 至少一个网络接口使用 DHCP 或 SLAAC。
- 您的网络不使用阻止恶意 DHCP 服务器的机制,如 DHCP 侦听。
通过 VPN 路由整个流量可防止主机访问本地网络资源。
先决条件
- 您可以使用 NetworkManager 1.40.16-18 或更高版本。
流程
- 决定您要使用的路由表。以下步骤使用表 75。默认情况下,RHEL 不使用表 1-254,您可以使用其中任何一个。
配置 VPN 连接配置文件,将 VPN 路由放在专用路由表中:
nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75
# nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为您在上一命令中使用的表设置低优先级值:
nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75"
# nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 优先级值可以是 1 到 32766 之间的任何值。值越低,优先级越高。
重新连接 VPN 连接:
nmcli connection down <vpn_connection_profile> nmcli connection up <vpn_connection_profile>
# nmcli connection down <vpn_connection_profile> # nmcli connection up <vpn_connection_profile>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在表 75 中显示 IPv4 路由:
ip route show table 75
# ip route show table 75 ... 192.0.2.0/24 via 192.0.2.254 dev vpn_device proto static metric 50 default dev vpn_device proto static scope link metric 50
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出确认到远程网络和默认网关路由到路由表 75,因此所有流量都通过隧道路由。如果您在 VPN 连接配置集中设置
ipv4.never-default true
,则不会创建默认路由,因此无法在此输出中可见。在表 75 中显示 IPv6 路由:
ip -6 route show table 75
# ip -6 route show table 75 ... 2001:db8:1::/64 dev vpn_device proto kernel metric 50 pref medium default dev vpn_device proto static metric 50 pref medium
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出确认到远程网络和默认网关路由到路由表 75,因此所有流量都通过隧道路由。如果您在 VPN 连接配置集中设置
ipv4.never-default true
,则不会创建默认路由,因此无法在此输出中可见。