用 Rust 重写 kcptun,完全线上兼容 kcptun-go

sean2020 2026-07-30 11:12 1

🚀 kcptun-rs: 基于 Rust 重构的 KCP 加速隧道



这是一个使用 Rust 完整重构的 kcptun ( https://github.com/xtaci/kcptun) 兼容实现。不仅做到完全兼容原版 Go 协议与算法,同时在二进制体积控制与系统底层 IO 上优化。



🔗 项目地址: https://github.com/xsean2020/kcptun-rs




✨ 核心亮点



  1. 100% 协议与算法双向兼容( Drop-in Replacement )



  • 无缝替换:Rust 客户端 / 服务端可与现有的 Go 版本 kcptun 双向互通,无需修改已有拓扑或配置文件。

  • 全加密算法覆盖:完整支持原版包含的 14 种加密算法( AES, Blowfish, Twofish, Cast5, 3DES, Salsa20, SM4, XOR 等)以及 AES-GCM 。

  • 68 项 E2E 互通测试:通过严格的端到端集成测试,确保包含 SMUX 多路复用、Snappy 压缩在内的每一层协议报文与 Go 版本完全对齐。



  1. 极致的二进制体积控制



  • 超小身材:通过精细化剥离重型依赖、定制编译配置与优化静态链接,编译产物体积控制极其优秀,极度适合部署在路由器、OpenWrt 及各类资源受限的嵌入式设备中。



  1. 深入底层的零拷贝与批量 IO



  • SMUX 刷新逻辑重构:将 SMUX 刷新循环拆分为 4 阶段,大幅降低锁竞争与 CPU 轮询消耗。

  • 管道零拷贝与批量系统调用:KCP 输出管道做到全链路 Zero-Copy ,结合 sendmmsg / recvmmsg 批量网络 IO ,显著降低内核态/用户态切换开销。




🛠️ 跨语言完全兼容踩坑记录


在做到完全无缝兼容 Go 版的过程中,我也解决了一系列隐蔽的跨语言协议细节:



  1. Snappy 校验和差异:Go 与 Rust 生态中 Snappy 对 CRC32 / CRC32C 的默认处理存在细微差异(早期 Go 端会静默吃掉数据),经过逐层报文分析后实现了严格对齐。

  2. Twofish 算法逻辑对齐:修复了 256-bit 密钥下缺失第 5 层 S-box 的问题,确保密文输出与 Go x/crypto 算出的结果完全一致。

  3. Blowfish 密钥调度优化:修正了早期版本中在处理每块加密时重复调度密钥的问题。




欢迎有嵌入式加速需求、路由器部署场景或对 Rust 网络数据平面感兴趣的朋友前去体验、提 Issue 或点个 ⭐ Star !


👉 https://github.com/xsean2020/kcptun-rs

最新回复 (15)
  • Tsing2 07-30 11:20
    1
    在全民 AI 浮躁的时代,能沉下心来搞基础建设的课题,实属难得
  • kongkx 07-30 12:17
    2
    kcptun 不是已经 404 了吗
  • RobinHuuu 07-30 12:22
    3
    UDP 在翻墙上面用处真不大
  • HeyWeGo 07-30 12:31
    4
    年初的时候笔记本想下载 kcp 套着过墙来着,发现 404 了,真是及时雨。感谢
  • PyCode 07-30 13:41
    5
    可以分享下重写的开发过程吗?对这个感兴趣
  • sean2020 楼主 07-30 14:02
    6
    主要是 ai 移植,设置目标,核心在于验收,让 ai 不停 loop
  • dxatgp02 07-30 16:42
    7
    趁楼主没有拉库跑路马上 fork 一份,打游戏没有这感觉枪都在抖。
  • dxatgp02 07-30 17:08
    8
    cargo build -r
    启动报错
    Error: invalid value: integer `-1`, expected u64 at line 22 column 21
    linux-arm64 架构
    服务端还是 g ,客户端用 rs
  • sean2020 楼主 07-30 17:34
    9
    @dxatgp02 make linux
  • sean2020 楼主 07-30 17:35
    10
    @dxatgp02 等下晚点更新一下 linux 下有 bug, arm 和 macos 正常
  • sean2020 楼主 07-30 21:11
    11
    @dxatgp02 非常感谢你的反馈,上面问题已经修复, 为了方便上传了 vendor ,请重新执行 make vendor && make release 编译, 还有啥问题非常欢迎提出
  • capric 07-31 08:51
    12
    支持 windows 吗,建议用 mise.toml 替代 makefile ,跨平台支持更好
  • sean2020 楼主 07-31 09:29
    13
    @capric 理论上因该支持, 等下个版本我在到 windows 上试试, 目前感觉有些设计不合理在重构
  • dxatgp02 07-31 10:09
    14
    @sean2020 Error: invalid value: integer `-1`, expected u64 at line 22 column 21
    用了最新代码还是有问题,我看了一下代码,默认配置与配置文件一起时,是不是应该用配置文件的参数。但代码好像是依然用默认配置。
    cli.param_xxx.or(cfg.param_xxx);
  • sean2020 楼主 07-31 10:47
    15
    @dxatgp02 项目中 删除 vendor 和 .cargo 目录,执行 make release 因该可以了,我在 centos7 上测试编译通过了,这部分我后期优化一下, 当初想着把库保存下来防止依赖库找不到了,忘记考虑跨平台问题了 这个是之前交叉编译用了 musl ,它和 gnu 不兼容导致的
* 帖子来源V2EX
返回