Firezone推出sanstun:Rust版WireGuard新实现

Sanstun: A sans-IO, parallel-friendly WireGuard implementation in Rust

我们正式推出sanstun,这是一个用Rust编写的sans-IO且支持并行处理的WireGuard用户态实现。在开发Firezone的过程中,我们发现原有的boringtun fork需要大量补丁,且难以维持API兼容性。sanstun彻底重构了设计,将IO与业务逻辑分离,并消除了内部缓冲带来的复杂性。其核心亮点在于支持并行加密的API设计:通过将记账操作与实际的加解密工作分离,开发者可以轻松将加密任务卸载到工作线程,理论上可实现45倍以上的性能提升。sanstun不仅让代码更易测试和组合,还充分利用了Rust的所有权规则,为构建高性能网络应用提供了更优选择。

将加密工作卸载到工作线程,可以让记账操作仅占加密总时间的2%,理论上实现超过45倍的性能提升。
  1. Twey

    一开始一切看起来都很棒,直到我读到:

    > 该设计还避免了诸如函数着色(function coloring)之类的问题,并且与 Rust 的所有权规则配合良好。

    异步(Async)并不是 I/O。它确实可以用于 I/O,但它本质上只是一种编写纯确定性状态机的方法,能让逻辑流保持连贯,而不是分散在一堆状态转换中。

    即使你选择手动将异步流编译成显式的状态机,你仍然得面对“函数着色”(即类型约束)问题:一个跨越多个状态转换的流(在此期间,其他不相关的状态部分可能通过其他转换被更新)现在必须被重写为一系列状态转换,并且无法从阻塞函数中调用。事实上,如果去掉 `async` 重写所有状态机,函数着色“问题”反而会变得更糟,因为多转换流与普通函数的差异会变得更加巨大。

  2. monocasa

    太棒了,我在 Rust 中设计协议实现时基本也是这么做的。

    这样可测试性更强,大部分代码可以在异步和阻塞 I/O 之间共享,而且更容易彻底禁止依赖项中的 unsafe(除了 std 和 core 之外),等等。

  3. temp0826

    Mullvad 也基于 boringtun 推出了自己的实现(叫 gotatun[0])

    [0] https://github.com/mullvad/gotatun

同日更多故事

2026-10-30