两台 iPhone 用同一个 IKEv2 身份?它们轮流连接
一个配置文件复制到两台设备后,网关只看到一个 peer,而不是两个。观察 peer 表如何填满又清空,然后为每台设备签发一个值。
两部手机、一个配置文件,以及一种在有人盯着网关之前显得超自然的现象。一台设备占着隧道,第二台连上,第一台就在几秒内丢掉它。第一台重新连上,第二台又断开。人们怪罪省电、Wi-Fi 漫游和运营商 NAT,而真正的原因藏在一个随其他内容一起被复制的文本字段里。IKEv2 用名字识别 peer,而两部手机提交的是同一个名字。
身份是服务器把你存进去的那把钥匙
在 IKEv2 交换中,每一方都会声明自己是谁:发起方发送本地标识符,响应方用自己的标识符回答,响应方还会按策略检查发起方声称的身份。网关按身份而不是按设备保存状态,因为设备不是它能看到的东西。因此,同一个标识符的两部手机会作为同一个 peer 到达,第二次交换只能覆盖第一次。只有两台都在使用时问题才会出现,所以单机测试永远复现不了。
这都不是客户端的缺陷。客户端只是原样发送了配置文件让它发送的内容。
从网关看碰撞是什么样
在两部手机都醒着并在使用时观察 peer 列表。碰撞只会显示一条地址随手机互换而变化的记录,活动会话计数永远到不了二。按需拆线看起来不一样,区分两者只需要一次观察,而不是一套理论。
| Observation | Shared identity | Idle teardown |
|---|---|---|
| Peer entries while both are awake | One, with a changing address | One per phone, or none |
| What triggers the drop | The other device connecting | Time without traffic |
| What restores it | The other device disconnecting | Any app needing the tunnel |
在事情发生时把两个事件连同时间戳记下来。与另一台手机连接同时发生的掉线指向标识符,而在最后一个数据包之后隔一个空闲周期才来的掉线指向定时器。
重复从哪来
导出一个能用的配置,只改服务器地址,就会得到第二个文件,而第一个文件的身份还在里面。这是通往该故障的常见路径,通常发生在匆忙接入一个小团队的时候。
字段名让人很容易忽略这一点。远程标识符命名的是手机期望的网关,复制它是正确的。本地标识符命名的是这台设备在网关前的身份,复制那个值才是整个问题。
为每台设备签发一个值
使用对手机唯一且在它整个生命周期内稳定的东西,例如库存清单里的设备标识符,或管理系统为每次注册生成的值。部门标签、共享服务账号名或用户邮箱地址,一旦这个人有了第二台设备,全都会撞车。
按设备生成载荷,而不是分发同一个文件。记下哪个值属于哪台手机,这样换机时不会恢复旧配置,把新手机直接送回同一次碰撞。
也要检查服务器一侧。把身份映射到固定隧道地址的网关,在两个不同标识符拿到同一地址时仍会碰撞,所以要确认地址池有余量,且分配没有被按用户钉死。
在两部手机都醒着时验证
先连第一台,访问一个私有资源,再连第二台,让两台都空闲一分钟。两个会话都应保持,peer 列表应显示两个身份。然后分别锁屏再解锁,确认空闲场景仍然正常。
如果只剩一个会话仍然每天掉一次而别的都没有连接,那身份就不再是嫌疑对象。该去查空闲定时器和服务器会话上限,而不是再改配置文件。