6.14. IPsec 配置故障排除


诊断 IPsec 配置失败可能具有挑战性,因为问题可能是由不匹配的设置、防火墙规则和内核级错误造成的。以下信息提供了一种解决 IPsec VPN 连接常见问题的系统方法。

6.14.1. 基本连接问题

VPN 连接的问题通常是因为端点之间不匹配的配置而发生的。

要确认 IPsec 连接是否已建立,请输入:

# 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=198.51.100.1/32
Copy to Clipboard Toggle word wrap

对于成功的连接,命令会显示一个带有连接名称和详情的条目。如果输出为空,则隧道没有建立。

6.14.3. 不匹配的配置

如果端点不是使用匹配的互联网密钥交换(IKE)版本、算法、IP 地址范围或预共享密钥(PSK)配置的,则 VPN 连接会失败。如果发现不匹配,您必须使两个端点上的设置保持一致,以便解决这个问题。

远程对等点没有运行 IKE/IPsec

如果连接被拒绝,会显示一个 ICMP 错误:

# ipsec 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 Toggle word wrap
不匹配的 IKE 算法

在初始设置过程中,连接会失败并显示 NO_PROPOSAL_CHOSEN 通知:

# ipsec 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 Toggle word wrap
不匹配的 IPsec 算法

在初始交换后,连接会失败并显示 NO_PROPOSAL_CHOSEN 错误:

# ipsec 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 Toggle word wrap
不匹配的 IP 地址范围(IKEv2)

远程对等点响应一个 TS_UNACCEPTABLE 错误:

# ipsec 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 Toggle word wrap
不匹配的 IP 地址范围(IKEv1)

在快速模式下连接超时,并显示一条表示对等点不接受提议的消息:

# ipsec 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 Toggle word wrap
不匹配的 PSK (IKEv2)

对等点拒绝连接,并显示一个 AUTHENTICATION_FAILED 错误:

# ipsec 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 Toggle word wrap
不匹配的 PSK (IKEv1)

哈希有效负载不匹配,使 IKE 消息不可读,并导致一个 INVALID_HASH_INFORMATION 错误:

# ipsec up vpn.example.com
...
002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILED
Copy to Clipboard Toggle word wrap

6.14.4. MTU 问题

加密和封装过程增加了数据包的大小。如果数据包超过网络的最大传输单元(MTU)(通常为 1500 字节),则数据包会被碎片化。这可能导致间歇性连接失败,其中分片会丢失,且原始数据包无法被重新组装。一个常见的症状是,小数据包(例如 ping)可以正常工作,但大型数据包(如 SSH 会话)在登录后冻结。

要解决这个问题,通过在配置文件中添加 mtu=1400 选项来降低隧道的 MTU。

6.14.5. NAT 冲突

如果 IPsec 主机也充当 NAT 路由,则可能会错误地将 NAT 应用到用于 IPsec 隧道的数据包。例如,如果在应用 IPsec 加密前,数据包的源 IP 地址被伪装规则转换,则数据包的源不再与 IPsec 策略匹配,并且 Libreswan 在网络上以不加密的方式发送它。

要解决这个问题,请添加一条防火墙规则,该规则将 IPsec 子网间的流量从 NAT 中排除。应在 POSTROUTING 链的开头插入此规则,以确保它在常规 NAT 规则之前被处理。

例 6.1. 使用 nftables 框架的解决方案

以下示例使用 nftables 设置一个基本的 NAT 环境,该环境将 192.0.2.0/24 和 198.51.100.0/24 子网之间的流量从地址转换中排除:

# nft add table ip nat
# nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
# nft add rule ip nat postrouting ip saddr 192.0.2.0/24 ip daddr 198.51.100.0/24 return
Copy to Clipboard Toggle word wrap

6.14.6. 内核级 IPsec 问题

一个常见问题是 VPN 隧道似乎成功建立,但没有流量通过它。在这种情况下,您可以检查内核的 IPsec 状态,以检查隧道策略和加密密钥是否被正确安装。

这个过程涉及检查两个组件:

  • 安全策略数据库(SPD):指示内核要加密哪些流量的规则。
  • 安全关联数据库(SAD):指示内核如何加密该流量的密钥。

首先,检查 SPD 中是否存在正确的策略:

# ip xfrm policy
src 192.0.2.1/32 dst 10.0.0.0/8
	dir out priority 666 ptype main
	tmpl src 198.51.100.13 dst 203.0.113.22
		proto esp reqid 16417 mode tunnel
Copy to Clipboard Toggle word wrap

输出应包含与 in 和 out 方向匹配的 leftsubnetrightsubnet 参数的策略。如果没有看到流量的策略,Libreswan 无法创建内核规则,并且流量未加密。

如果策略存在,检查它是否在 SAD 中有相应的密钥集合:

# ip xfrm state
src 203.0.113.22 dst 198.51.100.13
	proto esp spi 0xa78b3fdb reqid 16417 mode tunnel
	auth-trunc hmac(sha1) 0x3763cd3b... 96
	enc cbc(aes) 0xd9dba399...
Copy to Clipboard Toggle word wrap
警告

这个命令显示私有加密密钥。不要共享此输出,因为攻击者可以使用它来解密您的 VPN 流量。

如果策略存在,但没有看到具有相同 reqid 的对应状态,这通常意味着互联网密钥交换(IKE)协商失败。两个 VPN 端点无法就一组密钥达成一致。

如需更详细的诊断,请将 -s 选项与其中一个命令一起使用。这个选项添加流量计数器,这帮助识别内核是否通过特定规则处理数据包。

6.14.7. 内核 IPsec 子系统错误

在个别情况下,内核的 IPsec 子系统中的漏洞可能导致它丢失与互联网密钥交换(IKE)用户空间守护进程的同步。这种不同步可能会导致在协商的安全关联与内核中 IPsec 策略的实际强制间出现差异,从而可能会中断安全网络通信。要检查内核级别的错误,请显示转换(XFRM)统计信息:

# cat /proc/net/xfrm_stat
Copy to Clipboard Toggle word wrap

如果输出中的任何计数器(如 XfrmInError )显示一个非零值,则这表示内核子系统存在问题。在这种情况下,开一个 支持问题单,并附加上命令的输出以及相应的 IKE 日志。

6.14.8. 显示 Libreswan 日志

Libreswan 将事件记录到日志中。要显示 ipsec 服务的日志,请输入:

# journalctl -xeu ipsec
Copy to Clipboard Toggle word wrap

如果默认日志记录级别没有提供足够的详情,请通过在 /etc/ipsec.conf 文件中的 config setup 部分中添加以下设置来启用全面的调试日志记录:

plutodebug=all
logfile=/var/log/pluto.log
Copy to Clipboard Toggle word wrap

由于调试日志记录可以产生许多条目,因此将消息重定向到专用的日志文件可防止 journaldsystemd 服务对消息进行速率限制。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat