尝试从手机连接自己的 IKEv2,然而无法连接。排查后发现是因为手机是 IPv6 的地址。
在 iPhone 上,无论是 CISCO AnyConnect 还是自带的 IKEv1,都可以 fallback 去 IPv4 连接,只有自带的 IKEv2 不可以。研究了一下服务器配置,加上 IPv6 支持后,却仍然无法连接。
最后发现是forceencaps=yes
这个设置导致的,删除后即可连接。
后来以这个关键词去搜索,发现 这篇博客
IP协议50(本地ESP隧道流量)不能通过大多数NAT路由器。通常,IKEv2将尝试检测NAT的存在并将切换到UDP封装的ESP。但是,IP协议50也可能不通过一些非NAT防火墙,这将不会被这种方式检测到。
从表面上看,启用forceencaps=yes似乎是一个好主意,不管NAT检测的结果如何,对所有隧道流量都使用UDP封装。
但是,Linux内核不会(当前)对IPv6 ESP实施UDP封装,因此如果您的VPN服务器发布IPv6地址,则在设置此选项时,IPv6客户端将无法连接。
因此我们不得不依靠NAT检测来适当地启用UDP封装。NAT后面的IPv4客户端将自动使用UDP; 没有NAT的IPv4客户端将使用IP协议50. IPv6客户端只能使用IP协议50
之后试着建立两个连接类型来区分 IPv4 和 IPv6 以便为 IPv4 启用forceencaps
,然而虽然通过把 IPv6 的连接配置放在 IPv4 的之前,可以顺利连上,却无法访问网络,所以还是把两个合在一起,然后都使用自动 NAT。
另外发现 StrongSwan 的 DNS 设置似乎不起作用,所以只能在ipsec.conf
中设置rightdns
。
ps. 如果要在 NAT 后使用 Windows 10 的自带 IKEv2,还需要以管理员身份打开 CMD 执行REG ADD HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f
并重启。