VPN 控制通道与数据通道:检查正确的层次
隧道可能协商成功却什么都传不过去。要判断是哪一层出了问题:控制建立、数据保护,还是两者之外的路由与 DNS。
客户端显示已连接,服务器也能看到对端,应用却依然什么都访问不到。此时有用的问题不是该换哪种加密套件,而是哪一条通道失败了。OpenVPN 明确区分两个功能:负责协商并管理会话的控制通道,以及承载受保护流量的数据通道。IKEv2 通过 IKE 关联与 CHILD 关联表达类似的划分。请按顺序执行下面的检查,因为把数据路径的修复用在控制路径的故障上,只会白白浪费变更窗口。
先给通道命名,再开始排查
控制侧负责协商安全材料、认证对端并管理连接。数据侧则在所需状态就绪后承载被选中的流量。
两者的失败方式不同。控制故障通常让你完全拿不到可用的会话,或者反复循环重新协商。数据故障则留下看似正常、实则丢包、错路由,或用对端无法接受的参数保护起来的会话。你正在读的日志行会告诉你属于哪一种,所以要先看标签,再看错误文本。
检查控制交互
确认握手完成,且双方在传输方式、TLS 版本、认证方法上达成一致。OpenVPN 的日志会分别打印控制通道与数据通道两行,证书、TLS 版本或 tls-crypt 不匹配都会出现在控制行上。
如果控制交互失败,就检查可达端口、证书链及其有效期、系统时钟、客户端与服务器之间的套件重叠,以及任何 tls-auth 或 tls-crypt 密钥。过大的证书链也可能在路径 MTU 上失败,表现为超时而不是密码学错误。
控制故障要用控制参数来修。提高数据加密等级或放宽数据认证策略,不会让一次始终没走过证书交换的握手完成。
单独检查数据通道
会话建立后,确认协商出的数据加密与模式、密钥派生以及密钥更新行为。在 OpenVPN 中,数据通道那一行给出实际初始化的加密与密钥长度,可能与配置里的第一个套件不同。
然后检查会话究竟装入了什么。PUSH_REPLY 可以添加路由、DNS 服务器和 redirect-gateway 指令,其中任何一项都可能把流量送到应用无法使用的地方。对 IKEv2 而言,等价的问题是 CHILD 关联的选择器是否与实际流量中的地址一致。
tls-auth 与 tls-crypt 属于控制通道。它们为握手提供认证或加密,并不挑选应用数据所用的加密。如果你加上其中一个,期望数据路径随之改变,那么唯一改变的就是握手。
把名称对应到 IKEv2 与 OpenVPN
IKEv2 有一个 IKE 安全关联,以及一个或多个 CHILD 关联。IKE 关联承载控制交互;CHILD 关联承载受保护的流量及其选择器。两者按不同的时间表协商与更新密钥,因此一个健康时另一个可能并不健康。
ESP 内部并没有 TLS 式的控制通道。它的控制协议是 IKE,ESP 只是受保护的载荷。把 ESP 叫作数据通道是一种宽松的简称,读抓包时会让人困惑,因为抓包里 IKE 报文和 ESP 报文是两种不同的协议。
在笔记里把这个对应关系写清楚:OpenVPN 控制通道与 IKE SA 属于管理侧,OpenVPN 数据通道与 CHILD SA 属于流量侧;即使划分看起来相似,实现之间也不能互换。
别再改错的设置
沿着路径单向走:控制交互、数据保护、转发,最后是域名解析。在第一个失败环节停下,只修那一环。已连接、能 ping 通网关却没有应用流量的会话,是转发或选择器的问题,不是握手问题。
把每个环节的证据分别写进工单:控制日志行、协商出的数据参数、装入的路由,以及一次真实的请求。这样的结构可以阻止为了修复后来才出现、且并非它引起的路由问题而去削弱正常工作的身份检查,也能阻止把更换数据加密当成证书错误的修复方案卖出去。
OpenVPN 协议文档是控制与数据划分的参考资料;当厂商界面用别的词描述同样两项功能时,可以查它。