معرفی sanstun؛ پیادهسازی جدید و امن پروتکل WireGuard در زبان Rust با معماری sans-IO — sanstun: A sans-IO, parallel-friendly WireGuard implementation in Rust
خلاصه
کتابخانه sanstun یک پیادهسازی جدید از ماشین حالت WireGuard در زبان Rust است که با بهرهگیری از معماری sans-IO و طراحی مناسب برای پردازش موازی، مدیریت بستهها را بهینهسازی میکند. این پروژه جایگزینی مدرن برای بورینگتون محسوب میشود که محدودیتهای مدیریت پکت و زمان را برطرف کرده است.
تیم Firezone از انتشار کتابخانه جدیدی به نام sanstun خبر داده است؛ یک پیادهسازی مبتنی بر معماری sans-IO از ماشین حالت پروتکل WireGuard در زبان Rust که برای کارایی بالا، امنیت و قابلیت اجرای موازی بهینه شده است.
معماری sans-IO چیست؟
مدل sans-IO به این معناست که سیستم به گونهای طراحی میشود که عملیات مربوط به I/O (ورودی/خروجی) و اثرات جانبی (Side-effects)، کاملاً از منطق کسبوکار و مدیریت وضعیت (State) جدا شوند. منظور از I/O در اینجا صرفاً فایل یا شبکه نیست، بلکه مواردی مانند زمان و تولید اعداد تصادفی را نیز در بر میگیرد.
مزایای اصلی این الگو شامل موارد زیر است:
- جداسازی کامل و نداشتن اثرات جانبی پنهان
- قابلیت ترکیبپذیری بسیار بالا و تستپذیری آسان
- جلوگیری از مشکلاتی نظیر Function Coloring
- سازگاری کامل با قوانین Ownership در زبان Rust
این الگو مختص زبان Rust نیست، اما ترکیب آن با سیستم نوعدادهای (Type System) این زبان به توسعهدهندگان کمک میکند تا خطاهای منطقی را در زمان کامپایل صید کنند.
پسزمینه و دلایل پیدایش sanstun
تیم سازنده در ابتدا از کتابخانه محبوب boringtun استفاده میکردند. با گذشت زمان و تکامل نیازهای محصول، آنها مجبور شدند بیش از ۷۰ درخواست تغییر (PR) و پچهای مختلف روی آن اعمال کنند. حفظ سازگاری ۱۰۰ درصدی با API اصلی پروژه قبلی دیگر توجیهپذیر نبود.
برخی از مشکلات ساختاری در کتابخانههای قبلی عبارتند از:
- مدیریت زمان: مدیریت زمان داخلی باعث دشواری در شبیهسازی سیستم میشد که با اضافه کردن پسوند
_atو دریافتInstantحل شد. - بافرینگ داخلی: بافر کردن خودکار بستهها نیاز به فراخوانیهای عجیب (مانند پکتهای با طول صفر) داشت و تخصیص حافظه (Allocation) اضافی تحمیل میکرد.
پس از بیش از دو سال کار روی این چالشها، تصمیم بر این شد که کتابخانه کاملاً جدید sanstun از صفر توسعه داده شود.
طراحی API و کنترلپذیری پروتکل
در sanstun، اجزای اصلی شامل توابعی برای مدیریت بستههای ورودی، خروجی، تایمرها و رویدادها هستند. رابط کاربری (Interface) و تونلها به صورت ساختارهای مجزا تعریف شدهاند.
تمام بستههای ورودی از طریق متد Interface::receive عبور میکنند. این متد تنها نقطه ورود برای تجزیه دادههای خام است که مکانیزم محدودسازی نرخ (Rate Limiting) را اعمال کرده و از حملات DoS مبتنی بر جعل IP جلوگیری میکند. این طراحی تضمین میکند که هیچ پیامی بدون عبور از فیلترهای امنیتی پردازش نشود.
رمزنگاری موازی (Parallel Crypto)
پروتکل WireGuard هیچگونه وضعیتی بین تونلهای مختلف به اشتراک نمیگذارد، بنابراین موازیسازی بین همتاهای مختلف کار سادهای است. با این حال، رمزنگاری درون یک تونل منفرد به دلیل استفاده از شمارندههای ترتیبی (Packet Counter) برای جلوگیری از حملات Replay معمولاً نیازمند همگامسازی (Synchronization) است.
کتابخانه sanstun برای حل این مشکل، حسابداری پکت را از عملیات رمزنگاری جدا میکند:
- متد
Tunnel::begin_encapsulateکارهای مربوط به شمارندهها و تایمر را انجام داده و یک شیء به نامPendingEncapsulateتحویل میدهد. - این شیء صفت
Sendرا پیادهسازی میکند و میتوان آن را به راحتی به نخ (Thread) دیگری منتقل کرد تا عملیات سنگین رمزنگاری با الگوریتم ChaCha20-Poly1305 روی آن انجام شود.
بنچمارکهای این کتابخانه نشان میدهند که بخشهای حسابداری زمان بسیار ناچیزی میبرند (حدود ۲ درصد برای پکتهای ۱۲۸۰ بایتی)، در حالی که بخش اصلی رمزنگاری میتواند به راحتی به نخهای کارگر (Worker Threads) سپرده شود تا توان عملیاتی سیستم به شکل چشمگیری افزایش یابد.
چرا این پروژه برای مهندسان اهمیت دارد؟
برای توسعهدهندگانی که در حال ساخت VPN، شبکههای مش (Mesh Networks) یا زیرساختهای امنیتی بر پایه WireGuard هستند، sanstun کنترل دقیقتری روی مدیریت حافظه، صفها و نخها فراهم میکند. همانطور که در بحثهای جامعه کاربری هکرنیوز نیز اشاره شده است (مانند پروژه مشابه gotatun از Mullvad)، داشتن کنترل کامل روی لایه رمزنگاری و اجتناب از بافرینگ پنهان، نیاز کلیدی پروژههای مقیاسپذیر شبکه است.
این مطلب بهصورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل