用于 VPN 网关的加密卡:购买前要过的四道关
检测到一张 PCI 卡只是四步中的一步。在花钱买加速之前,先查清驱动、所需的加密操作以及 VPN 正在使用的后端。
旧的加密加速卡会出现在 PCI 清单里,于是人们默认 VPN 从此会加密得更快。要让它成立,必须依次过四道关:系统找到设备,有仍在维护的驱动来驱动它,某个接口暴露出 VPN 所需的那种操作,而 VPN 当前使用的后端确实去请求它。任何一道关失败,这张卡就仍处在隧道的实际路径之外。
检测是第一道关,而不是最后一道
检测只能证明总线看到了一个设备,以及内核对它是什么有个大致概念。驱动支持是下一道关,而且它与版本相关:某个模块在旧发行版里存在,在当前内核包里可能完全消失。除此之外,驱动还必须注册数据通道实际使用的那个具体算法和模式。一张加速 AES-CBC 的卡,对协商 AES-GCM 的配置毫无用处。
在评估中要把每一道关单独列出来,因为从外部看,第四道关的失败和第一道关的失败一模一样。
读内核的算法清单
先收集主机已经掌握的、关于该设备以及它注册过的算法的信息。
lspci -nn | grep -i -E "crypt|hifn|soekris"
grep -E "^(name|driver|priority)" /proc/crypto | head -40PCI 那一行给出任何驱动检索都需要的厂商与设备标识,而/proc/crypto 会列出已注册的实现及其驱动和优先级。优先级数值决定同一算法各实现之间的选择顺序,这与应用程序挑选其中一个并不是一回事。如果卡上的算法没有出现在那里,说明驱动从未注册它,用户空间的任何改动都不会调用它。记录标识符和实现名称,而不是给卡拍张截图。
VPN 必须选中那个实现
内核里可用只是一份菜单,并不保证 VPN 进程就从那里点单。要检查后端实际用的是什么。
openssl speed -evp aes-256-gcm
openssl engine -t -c测速命令跑的是库自己的路径,给出这台机器在当前配置下的基线;而引擎列表则显示 OpenSSL 究竟有没有任何可选提供者。自带加密库的用户空间 VPN 会完全绕开内核实现,所以已注册的驱动对它可能毫无意义。数据通道卸载又是第三种机制,它改变的是报文处理,而不是把密码请求派给扩展卡。在为了第四种机制买硬件之前,先确定这三种里哪一种描述的才是你的部署。
与你已有的 CPU 路径作比较
现代处理器内置 AES 指令,仍在维护的库无需额外硬件就能用上,而且避免了总线传输和多余的拷贝。旧的加速卡可能输给这条路径,却仍在报告漂亮的原始密码数字。要测量真实负载:相同流量、相同保护设置,基线对候选方案,并把 CPU 占用与应用吞吐一起记录。把更新与故障恢复的表现也纳入决策,因为无人维护的模块会在网关的整个生命周期里抬高维护风险。
购买的理由是受支持的链路,加上一项经过测量的收益。检测到一张卡,或者某个模块曾经被人编译过,都不足以让一台仍在维护的网关去依赖过时的硬件。