6.14. IPsec 配置故障排除
诊断 IPsec 配置失败可能具有挑战性,因为问题可能是由不匹配的设置、防火墙规则和内核级错误造成的。以下信息提供了解决 IPsec VPN 连接常见问题的系统方法。
6.14.1. 基本连接问题 复制链接链接已复制到粘贴板!
VPN 连接的问题通常是因为端点之间不匹配的配置而发生。
要确认已建立 IPsec 连接,请输入:
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=198.51.100.1/32
对于成功连接,命令会显示带有连接名称和详情的条目。如果输出为空,则不会建立隧道。
6.14.3. 不匹配的配置 复制链接链接已复制到粘贴板!
如果端点没有配置匹配的互联网密钥交换(IKE)版本、算法、IP 地址范围或预共享密钥(PSK),则 VPN 连接会失败。如果识别不匹配,您必须匹配两个端点上的设置来解决这个问题。
- 远程 Peer Not Running IKE/IPsec
如果连接被拒绝,则会显示 ICMP 错误:
ipsec up vpn.example.com
# 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 Copied! Toggle word wrap Toggle overflow - 不匹配的 IKE 算法
在初始设置过程中,连接会失败并显示
NO_PROPOSAL_CHOSEN
通知:ipsec up vpn.example.com
# 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 Copied! Toggle word wrap Toggle overflow - Mismatched IPsec Algorithms
在初始交换后,连接会失败并显示
NO_PROPOSAL_CHOSEN
错误:ipsec up vpn.example.com
# 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 Copied! Toggle word wrap Toggle overflow - 不匹配的 IP 地址范围(IKEv2)
远程对等点响应
TS_UNACCEPTABLE
错误:ipsec up vpn.example.com
# 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 Copied! Toggle word wrap Toggle overflow - 不匹配的 IP 地址范围(IKEv1)
在快速模式下连接超时,并显示代表 peer 不接受提议的消息:
ipsec up vpn.example.com
# 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 Copied! Toggle word wrap Toggle overflow - Mismatched PSK (IKEv2)
peer 拒绝与
AUTHENTICATION_FAILED
错误的连接:ipsec up vpn.example.com
# 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 Copied! Toggle word wrap Toggle overflow - Mismatched PSK (IKEv1)
哈希有效负载不匹配,使 IKE 消息不可读取,并导致
INVALID_HASH_INFORMATION
错误:ipsec up vpn.example.com
# ipsec 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
6.14.4. MTU 问题 复制链接链接已复制到粘贴板!
加密和封装过程会增加数据包的大小。如果数据包超过网络的最大传输单元(MTU),这通常是 1500 字节,则数据包会被碎片化。这可能会导致在丢失片段时导致连接失败,且无法重新编译原始数据包。一个常见的症状是,小数据包(例如 ping)可以正常工作,但大型数据包(如 SSH 会话)在登录后冻结。
要解决这个问题,请通过将 mtu=1400
选项添加到配置文件来降低隧道的 MTU。
6.14.5. NAT 冲突 复制链接链接已复制到粘贴板!
如果 IPsec 主机也作为 NAT 路由器运行,则可能会错误地将 NAT 应用到用于 IPsec 隧道的数据包。例如,如果在应用 IPsec 加密前,如果数据包的源 IP 地址被伪装规则转换,则数据包的源不再与 IPsec 策略匹配,并且 Libreswan 通过网络发送未加密的。
要解决这个问题,请添加一条防火墙规则,该规则不包括 NAT 中 IPsec 子网之间的流量。应在 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
# 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
6.14.6. 内核级 IPsec 问题 复制链接链接已复制到粘贴板!
一个常见问题是 VPN 隧道被成功建立,但没有流量通过它。在这种情况下,您可以检查内核的 IPsec 状态,以检查隧道策略和加密密钥是否已正确安装。
这个过程涉及检查两个组件:
- 安全策略数据库(SPD):指示内核要加密的流量的规则。
- 安全关联数据库(SAD):指示内核如何加密该流量的密钥。
首先,检查 SPD 中是否存在正确的策略:
ip xfrm policy
# 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
输出应包含与您的 leftsubnet
和 rightsubnet
参数匹配的策略,以及 in 和 out 方向。如果没有为流量看到策略,Libreswan 无法创建内核规则,并且不会加密流量。
如果策略存在,检查它是否在 SAD 中有对应的键集合:
ip xfrm state
# 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...
这个命令显示私钥。不要共享此输出,因为攻击者可以使用它来解密您的 VPN 流量。
如果策略存在,但没有具有相同 reqid
的对应状态,这通常意味着互联网密钥交换(IKE)协商失败。这两个 VPN 端点无法同意一组密钥。
如需更详细的诊断,请将 -s
选项与其中一个命令一起使用。这个选项添加流量计数器,这有助于识别内核是否按特定规则处理数据包。
6.14.7. 内核 IPsec 子系统错误 复制链接链接已复制到粘贴板!
在个别情况下,内核的 IPsec 子系统中的漏洞可能会导致它丢失与互联网密钥交换(IKE)用户空间守护进程的同步。这种不同步可能会导致在协商的安全关联和内核中 IPsec 策略的实际强制间出现差异,从而可能会破坏安全网络通信。要检查内核级别的错误,显示转换(XFRM)统计信息:
cat /proc/net/xfrm_stat
# cat /proc/net/xfrm_stat
如果输出中的任何计数器(如 XfrmInError
)显示非零值,这表示内核子系统存在问题。在这种情况下,创建一个支持问题单,并将命令的输出与对应的 IKE 日志附加。
6.14.8. 显示 Libreswan 日志 复制链接链接已复制到粘贴板!
Libreswan 将事件记录到日志中。要显示 ipsec
服务的日志,请输入:
journalctl -xeu ipsec
# journalctl -xeu ipsec
如果默认日志记录级别没有提供足够详情,请通过在 /etc/ipsec.conf
文件中的 config setup
部分中添加以下设置来启用全面的调试日志:
plutodebug=all logfile=/var/log/pluto.log
plutodebug=all
logfile=/var/log/pluto.log
由于调试日志记录可以生成许多条目,因此将消息重定向到专用日志文件可防止 journald
和 systemd
服务对消息进行速率限制。