OpenVPN 数据通道卸载 (DCO) 在处理加密的 OpenVPN 数据时,能够通过减少每个数据包的上下文切换次数,带来巨大的性能提升。DCO 将大部分数据处理工作保留在内核中,避免了加密和数据包处理在内核与用户空间之间反复切换,从而提高了每个数据包的整体处理效率。同时,它还有可能利用内核中的硬件加密卸载支持。此外,DCO 还增加了对多线程加密的支持,进一步提升了性能。
Netgate 与 OpenVPN 合作开发了对 OpenVPN 数据通道卸载 (DCO) 的支持,并将其集成到 FreeBSD 和 pfSense® Plus 22.05 及后续版本中。
DCO 并不是对协议的更改,而是端点处理加密数据方式的改变。因此,即使只有一个端点具备 DCO 能力,也能产生效果。仅在一个端点上使用 DCO 时,性能改进仍然很明显;如果两个端点都支持 DCO,效果会更加明显。
DCO 应用限制
虽然在开发期间进行了大量测试,但仍然存在不稳定的可能性。部分 OpenVPN 功能和使用方法与 DCO 不兼容。在 FreeBSD / pfSense 上使用 OpenVPN DCO 存在以下限制:
- 加密仅限 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 对等隧道(一台服务器与一个客户端)且隧道网络为 /30 或更小子网时,与 DCO 不兼容。OpenVPN 中此模式的代码存在问题,可能导致连接失败和不稳定。
某些功能与 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 创建一个新隧道,以最大限度地降低现有客户端出现问题的可能性。
觉得内容不错?我要