OpenVPN 数据通道卸载 (DCO) 在处理加密的OpenVPN数据时通过减少每个数据包发生的上下文切换量来实现巨大的性能提升。DCO通过将大部分数据处理任务保留在内核中而不是在内核和用户空间之间反复切换来进行加密和数据包处理来实现这一点。这使得每个数据包的整体处理更加高效,同时还可能利用内核中的硬件加密卸载支持。DCO 还增加了对多线程加密的支持,从而获得更多的性能提升。
Netgate与OpenVPN合作开发了对OpenVPN数据通道卸载 (DCO) 的支持并将其集成到 FreeBSD 和 pfSense ® Plus 22.05及后续版本。
DCO不是对协议的更改,而是端点处理加密数据方式的更改。因此,即使只有一个端点能够进行DCO,DCO也是可以产生效果的。仅在一个端点上使用DCO 时,性能改进仍然很明显,如果两个端点上都支持DCO,那么效果会更加明显。
DCO应用限制
虽然在开发期间进行了很多测试,但仍然存在不稳定的可能性。一些OpenVPN功能和使用方法与DCO不兼容。OpenVPN DCO在FreeBSD/pfSense上使用存在以下一些限制:
- 加密仅限AES-256-GCM。未来将支持其他AEAD 密码,如 ChaCha20-Poly1305。
- DCO支持需要基于 TLS 的隧道,如SSL/TLS、SSL/TLS+User Auth或User Auth。
- DCO支持仅存在于仍在开发中的 OpenVPN 2.6.0 中。
- DCO还不能在OpenVPN ( iroute) 中使用内部路由。这意味着虽然远程访问的实例有效,每个服务器单个客户端的站点到站点设置有效,但它还不能在需要 LAN 到 LAN 路由的单个服务器上使用多个站点到站点客户端。
- /30对等隧道(一台服务器与一个客户端)使用一个或更小的隧道网络与DCO 不兼容。OpenVPN中此模式的代码存在问题,可能导致连接失败和不稳定。
- 某些功能与 DCO 不兼容或与 DCO 无关。这些选项包括:
- 显式退出通知
- 不活动超时
- UDP 快速 I/O
- 发送/接收缓冲区大小
- 未正确跟踪对端数据使用情况。在解决此问题之前,OpenVPN 状态页面上的对端数据使用情况不会反映对等点之间传输的实际数据量。
DCO和路由
DCO目前不支持来自单个服务器上多个站点到站点客户端的特定于客户端的覆盖(即 iroute)的内部路由,但它支持通常会被非 DCO OpenVPN忽略的内核路由目标。
在覆盖中分配客户端静态地址后,然后在OpenVPN 自定义选项中设置自定义路由,并定义完整的目的地,甚至设置 FRR 并通过 BGP 交换路由。
DCO和硬件加密加速
为获得最佳性能,请确保存在并启用硬件加密加速器。QAT可以为AES-256-GCM 提供最高性能。如果硬件支持QAT,请启用QAT。
如果硬件不支持QAT但支持AES-NI,请确保加载AES-NI内核模块以获得AES-256-GCM 的最佳性能。尽管OpenSSL可以在不加载模块的情况下使用AES-NI,但在该状态下性能很差,甚至比禁用DCO时还要慢。
虽然pfSense Plus的后续版本将支持带有OpenVPN DCO的ChaCha20-Poly1305,但 AES-NI和QAT目前都不能加速ChaCha20-Poly1305。一些较新的QAT硬件可能能够加速 ChaCha20-Poly1305,当前的 QAT 驱动程序还不包括对该加密算法的支持。
使用 OpenVPN DCO
DCO支持是每个隧道的选项,默认情况下不会为新的或升级的隧道自动启用。现有隧道将继续像过去一样发挥作用。
在OpenVPN服务器和客户端实例上选中DCO选项,就可以为新的和现有的隧道启用 DCO。当前的最佳做法是使用DCO创建一个新隧道,以最大限度地减少现有客户端出现问题的可能性。
相关文章: