هنگام ارزیابی پروتکلهای تونل امن شبکه، مهندسان معمولا بر استحکام الگوریتمهای رمزنگاری و اصالت دادهها تمرکز میکنند. روشهای مدرن مانند ChaCha20-Poly1305 (استاندارد RFC 8439) تضمین میکنند که ناظران ناشناس نتوانند محتوای بستهها را رمزگشایی کرده یا اطلاعات جعلی بسازند. با این وجود، رمزنگاری به تنهایی نمیتواند یکی از خطرات بنیادین شبکههای مبتنی بر پروتکل اینترنت را برطرف کند: حملات بازپخش بسته (Replay Attack).
نفوذگری که در حال شنود ترافیک شبکه است نیازی به شکستن کلیدهای رمزنگاری ندارد. با ضبط بستههای معتبر UDP رمزگذاریشده و ارسال مجدد آنها در زمانی دیگر، مهاجم میتواند یک نشست کاری را دچار اختلال کند، تراکنشهای مالی را تکرار نماید یا خطاهایی در ماشینهای حالت برنامهها پدید آورد. علاوه بر این، در رمزهای جریانی مانند ChaCha20، استفاده مجدد از یک بردار مقدار اولیه (Nonce) برای دو بسته متفاوت تحت یک کلید یکسان خطایی فاجعهبار است؛ زیرا با یک عملیات ساده جبری، کلید جریانی زیرین آشکار میگردد.
برای مهار کامل خطرات بازپخش و حفظ سرعت بالا در شبکههای دارای نوسان تاخیر، پروتکل وایرگارد از معماری ویژهای بر پایه سند RFC 6479 بهره میبرد. تلفیق شمارندههای ارسالی ۶۴ بیتی با پنجره لغزان مبتنی بر بیتمپ، ایمنی کامل در برابر تکرار دادهها را بدون افت بسته در شرایط جابجایی ترتیب تضمین میکند.
+-----------------------------------------------------------------------------+
| سازوکار پنجره لغزان بیتمپ RFC 6479 در وایرگارد |
| |
| محدوده غیرمجاز (خیلی قدیمی) پنجره فعال بیتمپ (۲۰۴۸ بیت) |
| ◄───────────────────────────┤──────────────────────────────────────────► |
| شمارنده < (T - 2048) │ از (T - 2048) تا T │ |
| │ │ |
| ... [بسته k] [بسته k+1] ... │ [بیت ۰] [بیت ۱] ... [بیت i] ... [بیت ۲۰۴۷]│ |
| │ │ │ │ │ │ |
| │ قدیمیترین │ بسته دریافت شده │ │ |
| │ در پنجره │ (بررسی و ثبت وضعیت)│ │ |
| └────────────┴───────────┬───────────┴──────┘ |
| │ |
| ▼ |
| اگر بیت == ۱: حذف (بسته تکراری) |
| اگر بیت == ۰: پذیرش و ثبت بیت = ۱|
| اگر شمارنده > T: حرکت پنجره |
+-----------------------------------------------------------------------------+
خطر استفاده مجدد از نانس و شمارنده ۶۴ بیتی
ساختار رمزنگاری احراز هویت شده ChaCha20-Poly1305 به سه مؤلفه نیاز دارد: یک کلید متقارن ۲۵۶ بیتی، متن پیام و یک مقدار نانس منحصربهفرد. وایرگارد در بستههای انتقالی خود از یک عدد صحیح ۶۴ بیتی به عنوان نانس برای ChaCha20 استفاده میکند که همراه با برچسب تایید ۱۶ بایتی Poly1305 ارسال میشود.
یکتا بودن نانس در علم رمزنگاری اهمیتی حیاتی دارد. چنانچه فرستنده دو پیام متفاوت را با یک جفت کلید و نانس یکسان رمزگذاری کند:
$$C_1 = P_1 \oplus Keystream(K, N)$$ $$C_2 = P_2 \oplus Keystream(K, N)$$
شنودکننده با محاسبه حاصل جمع منطقی XOR دو متن رمزشده، جریان کلید را کاملا حذف میکند:
$$C_1 \oplus C_2 = P_1 \oplus P_2$$
این رابطه امکان تحلیل آماری دادهها و جعل برچسبهای Poly1305 را فراهم میسازد. برای جلوگیری از این رخداد، فرستنده در وایرگارد برای هر بسته ارسالی مقدار شمارنده ۶۴ بیتی را دقیقا یک واحد افزایش میدهد و با شروع هر نشست مقدار آن را از صفر آغاز میکند.
فضای عددی شمارنده ۶۴ بیتی شامل بیش از ۱۸ کوینتیلیون بسته است که اتمام آن در شرایط عادی غیرممکن به شمار میرود. حتی در ترافیک پیوسته با پهنای باند ۱۰۰ گیگابیت بر ثانیه، چندین دهه طول میکشد تا این بازه پر شود. با این وجود، پروتکل وایرگارد به طور منظم هر چند دقیقه یکبار کلیدهای موقت را بازسازی کرده و شمارنده را از نو آغاز میکند.
پدیده جابجایی ترتیب بستهها در شبکههای واقعی
اگرچه فرستنده بستهها را به ترتیب افزایشی منظم ($0, 1, 2, 3, \dots$) ارسال میکند، زیرساخت اینترنت بستههای UDP را به صورت کاملا مستقل جابجا مینماید. در شبکههای عملیاتی، عوامل متعددی بر مسیر بستهها اثر میگذارند:
- مسیریابی چندمسیره (ECMP): سوئیچهای مراکز داده ترافیک را در طول مسیرهای فیبر نوری با تاخیرهای گوناگون پخش میکنند.
- کارتهای شبکه چندصفی: توزیع پردازش میان هستههای پردازنده باعث ایجاد تفاوتهای زمانی اندک در پردازش بستهها میشود.
- نوسان تاخیر در اتصالات بیسیم: جابجایی میان دکلهای نسل پنجم یا بافرهای وایفای موجب تغییرات زمانی ناگهانی میگردند.
در نتیجه، بستهها غالبا نامنظم به مقصد میرسند:
$$\text{ترتیب ارسال:} \quad [1, 2, 3, 4, 5, 6]$$ $$\text{ترتیب دریافت:} \quad [1, 3, 2, 5, 4, 6]$$
اگر گیرنده قانونی سختگیرانه وضع میکرد (یعنی فقط بستههایی با شماره بزرگتر از آخرین شماره دریافت شده را میپذیرفت)، بسته شماره ۲ پس از رسیدن بسته ۳ بیهوده حذف میشد. دور انداختن بستههای سالم به دلیل تاخیرهای میلیثانیهای عملکرد ترافیک داخلی TCP را با افتی شدید مواجه میکند.
از دست رفتن بستهها در پروتکل TCP باعث ارسال تاییدهای تکراری، آغاز بازفرستادن سریع و کاهش پنجره تراکم به نصف میشود. بنابراین سازوکار ضد بازپخش باید بستههای جابجا شده را تشخیص داده و فقط بستههای کپی شده نفوذگران را رد کند.
+-----------------------------------------------------------------------------+
| جدول تصمیمگیری برای بستههای ورودی |
+--------------------------+----------------------------+---------------------+
| شماره بسته ورودی ($C$) | موقعیت نسبت به پنجره فعال | اقدام هسته |
+--------------------------+----------------------------+---------------------+
| $C > T_{\text{بالا}}$ | فراتر از بالاترین شماره | پیشروی مرز پنجره |
| | | نشانهگذاری بیت در جدول |
+--------------------------+----------------------------+---------------------+
| $T_{\text{بالا}} - W \le$| درون بازه زمانی پنجره فعال | اگر بیت == ۰: پذیرش |
| $C \le T_{\text{بالا}}$ | جاری | اگر بیت == ۱: رد |
+--------------------------+----------------------------+---------------------+
| $C < T_{\text{بالا}} - W$| عقبتر از کف پنجره لغزان | حذف بیدرنگ |
| | | (بسته منقضی/تکراری) |
+--------------------------+----------------------------+---------------------+
الگوریتم RFC 6479: پنجره لغزان بیتی بدون جابجایی در حافظه
برای فائق آمدن بر این چالش، استانداردهای اولیه IPsec (سند RFC 4303) پنجره لغزان مبتنی بر بیتمپهای ۳۲ یا ۶۴ بیتی را معرفی کردند. با رسیدن بستهای با شماره بزرگتر، سیستم کل دادههای بیتمپ را در حافظه رم به سمت چپ جابجا میکرد.
در پهنای باندهای گیگابیتی با میلیونها بسته در ثانیه، جابجایی مداوم یک آرایه بزرگ (مثلا ۲۰۴۸ بیت) در رم باعث اتلاف توان پردازشی و تخلیه حافظه کش پردازنده میشود. وایرگارد رویکرد نوآورانه مطرح شده در سند RFC 6479 را به کار بسته است.
مدل ریاضی و آدرسدهی چرخشی
الگوریتم RFC 6479 به جای تغییر فیزیکی دادهها در رم، از یک آرایه حلقوی ثابت شامل کلمات پردازنده بهره میبرد. در وایرگارد پهنای پنجره برابر ۲۰۴۸ بیت است که توسط ۳۲ عدد صحیح ۶۴ بیتی بدون علامت پیادهسازی میشود ($32 \times 64 = 2048$):
#define COUNTER_WINDOW_SIZE 2048
#define COUNTER_BITS_PER_WORD 64
#define COUNTER_WORDS (COUNTER_WINDOW_SIZE / COUNTER_BITS_PER_WORD) // 32 کلمه
struct noise_replay_counter {
u64 counter;
unsigned long backtrack[COUNTER_WORDS];
spinlock_t lock;
};
هنگام رسیدن بستهای با شماره $C$، موقعیت کلمه مربوطه از طریق باقیمانده تقسیم تعیین میشود:
$$\text{شاخص کلمه} = \left(\frac{C}{64}\right) \pmod{32}$$ $$\text{مکان بیت} = C \pmod{64}$$
چون طول آرایه توانی از عدد دو است، عملیات باقیمانده به یک دستور منطقی AND بسیار پرسرعت تبدیل میشود:
unsigned long word_index = (counter / 64) & (COUNTER_WORDS - 1);
unsigned long bit_mask = 1UL << (counter & (COUNTER_BITS_PER_WORD - 1));
پویایی جابجایی پنجره
با ورود بسته جدید، هسته سیستم آن را در یکی از سه حالت پردازش میکند:
۱. درون پنجره فعال ($T - W < C \le T$): بیت مشخص شده ارزیابی میشود. اگر مقدار آن ۱ باشد، بسته تکراری تلقی شده و بلافاصله کنار گذاشته میشود. اگر مقدار آن ۰ باشد، بسته تایید شده و مقدار بیت به ۱ تغییر مییابد. ۲. فراتر از بالاترین سقف ($C > T$): بسته جدیدترین شماره ثبت شده را دارد. پنجره باید پیش برود. سیستم کلمات میانی میان نقطه اوج قدیم و جدید را با عدد ۰ پر میکند، اشارهگر سقف را بروزرسانی کرده ($T = C$) و بیت مربوطه را تنظیم مینماید. ۳. عقبتر از محدوده پنجره ($C \le T - W$): بسته بیش از ۲۰۴۸ گام از آخرین رکورد عقب افتاده است. سیستم بدون اتلاف توان برای رمزگشایی، آن را بیدرنگ دور میریزد.
این معماری پیچیدگی محاسباتی ثابت $O(1)$ را میسر کرده و کارایی حافظه کش پردازنده را به طور کامل حفظ میکند.
چینش آرایه چرخشی در حافظه رم (۳۲ کلمه ۶۴ بیتی):
کلمه ۰ کلمه ۱ کلمه ۲ کلمه ۳۱
[۶۴ بیت] [۶۴ بیت] [۶۴ بیت] ... [۶۴ بیت]
▲
│
└── اشارهگر چرخشی بدون نیاز به جابجایی فیزیکی بایتها حرکت میکند
پردازش موازی و همگامسازی سبک در پردازندههای چندهستهای
در محیطهای سروری پرتردد، گشودن رمز میلیونها بسته UDP روی یک هسته پردازشی موجب ایجاد گلوگاه میشود. در هسته لینوکس، وایرگارد بار رمزنگاری را با صفهای موازی padata روی تمام هستههای موجود تقسیم میکند.
روند مدیریت بستهها بدین صورت اجرا میشود:
۱. دریافت دادهها: درایور کارت شبکه بستهها را در صف دریافت میگذارد. ۲. رمزگشایی موازی: وایرگارد وظیفه احراز هویت Poly1305 و رمزگشایی ChaCha20 را به طور همزمان به هستههای در دسترس میسپارد. ۳. ثبت ضد بازپخش متوالی: از آنجا که پایان رمزگشایی در هستههای گوناگون ممکن است همزمان نباشد، گام بررسی پنجره لغزان در بخش پایانی به صورت متوالی و با قفلهای اتمی بسیار سبک ثبت میگردد.
تفکیک بار سنگین رمزگشایی و اجرای متوالی ثبت موقعیت بسته، ظرفیت انتقال دادهها را به بالاترین سطح ممکن ارتقا میدهد.
تعادل میان پهنای پنجره و کیفیت ارتباطات
انتخاب ظرفیت ۲۰۴۸ بیت نتیجه موازنهای دقیق میان مصرف رم و تابآوری در برابر نوسانات اینترنت است:
- پنجرههای کوچک (مانند ۶۴ بیت) به ازای تاخیرهای کوتاه چند فریمی موجب حذف اشتباهی بستههای معتبر میشوند.
- پنجرههای بیش از اندازه بزرگ (مانند ۶۵۵۳۶ بیت) مصرف حافظه به ازای هر کاربر را بالا برده و راندمان کش پردازنده را در سرورهایی با هزاران کاربر فعال کاهش میدهند.
ظرفیت ۲۰۴۸ بیتی در ابعاد بسته استاندارد ۱۴۲۰ بایتی حدود ۲.۹ مگابایت داده در حال پرواز را پوشش میدهد که برای رفع نامنظمیهای شبکههای بینالمللی کاملا بسنده است.
در طراحی VPNRice، پروتکل اختصاصی RiceGuard این اصول فنی را به کار بسته و در هماهنگی با تنظیمات معماری تونل های UDP، از بازپخش بستهها و افت کیفیت شبکه جلوگیری مینماید.
برای بهرهمندی از اتصالی مطمئن و متوازن روی سیستمهای رومیزی و همراه، به بخش دریافت VPNRice.



