الگوریتم‌های رمزنگاری لایه انتقال از بسته‌های داده IP در برابر شنود و دستکاری محافظت می‌کنند. رمزهای مدرن با محاسبه مقدار بررسی یکپارچگی (ICV) اصالت هر بسته مجزا را ارزیابی می‌کنند. با این حال، تایید اصالت بسته‌ها به تنهایی نمی‌تواند پروتکل‌های بدون اتصال شبکه را در برابر حملات بازپخش حفظ کند.

بدون مدیریت دقیق توالی، مهاجم در مسیر میانی می‌تواند بسته‌های معتبر رمزگذاری‌شده را ضبط کرده و نسخه‌های تکراری را به سمت دروازه مقصد ارسال کند. این بسته‌های تکراری تاییدیه رمزنگاری را با موفقیت دریافت کرده، منابع پردازنده را مصرف می‌کنند و پایداری شبکه را بر هم می‌زنند. برای مقابله با این خطر، استاندارد IPsec ESP طبق سند RFC 4303 استفاده از شمارنده توالی و مکانیزم پنجره کشویی ضد بازپخش را الزامی ساخته است.

نقش شماره توالی در تونل‌های رمزنگاری شبکه

تونل‌های شبکه داده‌های لایه ۳ را در سرآیندهای بیرونی IP یا UDP بسته‌بندی می‌کنند. از آنجا که مسیریاب‌ها داده‌ها را از مسیرهای گوناگون عبور می‌دهند، بسته‌ها غالبا نامرتب به مقصد رسیده یا دچار تکرار موقت می‌شوند.

در یک پیوند امنیتی IPsec (Security Association یا SA)، فرستنده به هر بسته ESP ارسالی یک شماره توالی با ترتیب کاملا صعودی اختصاص می‌دهد. این شماره دو کارکرد اساسی دارد: ۱. تولید ورودی یکتا برای بردار مقداردهی اولیه (IV) و رمزهای تصادفی AEAD به منظور جلوگیری از افشای کلید. ۲. توانمندسازی دروازه گیرنده برای شناسایی بسته‌های تکراری و حذف داده‌های خارج از بازه پذیرش مجاز.

+-----------------------------------------------------------------------------+
|                     ساختار بسته‌بندی بسته IPSEC ESP (RFC 4303)              |
+-----------------------------------------------------------------------------+
| سرآیند IP خارجی | فیلد SPI (۳۲ بیت) | شماره توالی (۳۲ بیت) | داده‌های رمزشده |
+-----------------------------------------------------------------------------+

فرستنده در طول فعالیت یک پیوند SA هرگز مقدار شمارنده توالی را کاهش نمی‌دهد. به محض رسیدن شمارنده به سقف نهایی، پیش از ارسال داده‌های جدید، سیستم باید SA جدیدی را از طریق پروتکل IKEv2 ایجاد کند.

سازوکار پنجره کشویی ضد بازپخش IPsec ESP طبق RFC 4303

به دلیل طبیعت نامنظم شبکه‌های ارتباطی، گیرنده نمی‌تواند بسته‌ای را صرفا به دلیل داشتن شماره کوچک‌تر از بسته قبلی حذف کند. سند RFC 4303 الگوریتم پنجره کشویی مبتنی بر ماسک بیتی با عرض $W$ را تعریف می‌کند که معمولا میان ۳۲ تا ۱۰۲۴ بیت تنظیم می‌شود.

       <- حذف بسته‌های منقضی -> | <- پنجره کشویی جاری (عرض W) -> | <- بسته‌های آینده ->
  ... -------------------------+--------------------------------+-------------> فضای توالی
                               ^                                ^
                            (M - W + 1)                         M (بزرگ‌ترین بسته تاییدشده)

دروازه گیرنده دو متغیر اصلی را مدیریت می‌کند:

  • $M$: بزرگ‌ترین شماره توالی که با موفقیت تایید و دریافت شده است.
  • یک ماسک بیتی به طول $W$: وضعیت تایید $W - 1$ شماره پیش از $M$ را نمایش می‌دهد.

پیشروی پنجره و ردیابی وضعیت ماسک بیتی

هنگام ورود بسته ESP با شماره $S$، ماژول ضد بازپخش پیش از اجرای عملیات سنگین رمزگشایی، وضعیت $S$ را با مرزهای پنجره می‌سنجد:

  • حالت نخست ($S > M$): بسته از تمام داده‌های دریافتی قبلی جدیدتر است. سیستم مقدار ICV را بررسی می‌کند. در صورت تایید، پنجره با شیفت ماسک به اندازه $(S - M)$ خانه به چپ حرکت کرده، مقدار $M = S$ ثبت شده و بیت مربوطه فعال می‌شود.
  • حالت دوم ($M - W + 1 \le S \le M$): بسته در محدوده پنجره جاری قرار دارد. گیرنده بیت متناظر با فاصله $(M - S)$ را بررسی می‌کند. اگر این بیت فعال باشد، بسته تکراری تلقی شده و بلافاصله دور ریخته می‌شود. در صورت غیرفعال بودن، بسته بررسی اعتبارسنجی شده و بیت آن به ۱ تغییر می‌یابد.
  • حالت سوم ($S < M - W + 1$): بسته در سمت چپ پنجره قرار دارد. گیرنده بدون رمزگشایی بسته را منهدم کرده و شمارنده خطای بازپخش را افزایش می‌دهد.

منطق حذف بسته‌های منقضی و تکراری ESP

فیلتر کردن ترافیک پیش از رمزگشایی مزیت پردازشی قابل توجهی دارد. با ارزیابی تازگی توالی پیش از محاسبات سنگین ریاضی، دروازه بسته‌های بازپخش غیرمجاز را با حداقل بار پردازشی مهار می‌کند.

حملات سیل‌آسا برای از کار انداختن دروازه مقصد در همان درگاه ورودی خنثی می‌شوند. در عین حال، بسته‌های سالمی که به دلیل نوسانات گذرگاه شبکه با تاخیر می‌رسند، تا زمانی که تاخیر آنها از عمق $W$ تجاوز نکند، پردازش خواهند شد.

چالش اتمام فضای شماره توالی ۳۲ بیتی در پهنای باند بالا

مشخصات اولیه پروتکل (RFC 2401) تنها ۳۲ بیت برای فیلد توالی ESP در نظر گرفته بود. این ظرفیت معادل $2^{32} - 1 \approx 4.29 \times 10^9$ بسته است. در اتصالات پرسرعت امروزی، این سقف در زمان بسیار کوتاهی سرریز می‌شود:

پهنای باند پیوند اندازه میانگین بسته نرخ ارسال بسته‌ها زمان تا اتمام شمارنده ۳۲ بیتی
۱ گیگابیت بر ثانیه ۱۴۰۰ بایت ۸۹.۲ هزار بسته/ثانیه ۱۳.۳ ساعت
۱۰ گیگابیت بر ثانیه ۱۴۰۰ بایت ۸۹۲.۸ هزار بسته/ثانیه ۸۰.۰ دقیقه
۴۰ گیگابیت بر ثانیه ۱۴۰۰ بایت ۳.۵۷ میلیون بسته/ثانیه ۲۰.۰ دقیقه
۱۰۰ گیگابیت بر ثانیه ۱۴۰۰ بایت ۸.۹۲ میلیون بسته/ثانیه ۸.۰ دقیقه
۱۰۰ گیگابیت بر ثانیه ۶۴ بایت ۱۴۸.۸ میلیون بسته/ثانیه ۲۸.۸ ثانیه

اگر پیوندی بدون پشتیبانی از توالی گسترش‌یافته به سقف ظرفیت برسد، تبادل داده متوقف شده تا مذاکره مجدد از طریق IKEv2 انجام گیرد. این تکرار مداوم فشار پردازشی بالایی تحمیل کرده و موجب قطع لحظه‌ای داده‌ها می‌شود.

شماره‌های توالی گسترش‌یافته ESN: حفظ یکپارچگی ۶۴ بیتی

اسناد RFC 4303 و RFC 4304 شماره‌های توالی گسترش‌یافته (ESN) را معرفی کردند تا ظرفیت را به ۶۴ بیت ($2^{64} - 1 \approx 1.84 \times 10^{19}$ بسته) ارتقا دهند. در خطوط ۱۰۰ گیگابیتی حتی با ریزترین بسته‌ها، شمارنده ۶۴ بیتی تا قرن‌ها بدون نیاز به بازتولید کلید به کار خود ادامه می‌دهد.

نکته ارزشمند این است که ساختار بسته فیزیکی دست‌نخورده باقی می‌ماند و کماکان فقط ۳۲ بیت مرتبه پایین ($Seq_{low}$) در سرآیند ESP جابه‌جا می‌شود.

+-----------------------------------------------------------------------------+
|                معماری شماره‌های توالی گسترش‌یافته (ESN RFC 4303)             |
+-----------------------------------------------------------------------------+
| ارسال روی کابل شبکه:    [ فیلد SPI ۳۲ بیت ] [ ۳۲ بیت مرتبه پایین توالی ]   |
| نگهداری در حافظه داخلی: [ ۳۲ بیت مرتبه بالای توالی ]                        |
| ارزیابی در مقدار ICV:   [ ۳۲ بیت بالای ضمنی ] + [ کل فریم بسته ESP ]        |
+-----------------------------------------------------------------------------+

بازسازی بیت‌های مرتبه بالا از طریق شمارنده ضمنی

از آنجا که تنها $Seq_{low}$ در شبکه منتقل می‌شود، گیرنده ۳۲ بیت بالایی ($Seq_{high}$) را با بررسی وضعیت پنجره نتیجه‌گیری می‌کند:

۱. اگر $Seq_{low} \ge M_{low}$ باشد، بسته متعلق به چرخه جاری است و مقدار $Seq_{high} = M_{high}$ در نظر گرفته می‌شود. ۲. اگر $Seq_{low} < M_{low}$ بوده و در بازه پنجره بگنجد، گیرنده بسته را به چرخه $M_{high}$ منتسب می‌کند. ۳. وقتی $M_{low}$ به آستانه سرریز $2^{32} - 1$ نزدیک می‌شود، سیستم تشخیص می‌دهد که آیا بسته متعلق به چرخه جدید $M_{high} + 1$ است یا داده‌ای با تاخیر از چرخه پیشین $M_{high}$.

برای مسدودسازی تلاش‌های فریبکارانه، مقدار ICV تمام شماره ۶۴ بیتی را تایید می‌کند. با هرگونه دستکاری در این مرزها، اعتبارسنجی شکست خورده و بسته فورا حذف می‌گردد.

مسیریابی چندصفی کارت شبکه و جابه‌جایی بسته‌ها در پردازنده‌های چند‌هسته‌ای

سرورهای مدرن بار ترافیک دریافتی را به کمک ویژگی Receive Side Scaling (RSS) میان هسته‌های مختلف پردازنده توزیع می‌کنند. در ترافیک‌های عادی، RSS روی پنج مشخصه بسته عمل هشینگ را اجرا می‌کند. اما در ترافیک رمزشده IPsec ESP، پورت‌های لایه انتقال در بسته پنهان شده‌اند.

در نتیجه، سخت‌افزار کارت شبکه بسته‌های ESP را فقط بر اساس IP مبدا، IP مقصد و فیلد ۳۲ بیتی SPI توزیع می‌کند.

[ جریان بسته‌های ESP ] ---> [ هش سخت‌افزاری کارت شبکه (IP + SPI) ]
                                    |
                    +---------------+---------------+
                    v                               v
             [ هسته پردازنده ۰ ]             [ هسته پردازنده ۱ ]
             (پردازش رمزگشایی)               (پردازش رمزگشایی)
                    \                               /
                     +-------------> <-------------+
                                    |
                       [ ورود نامرتب بسته‌ها به صف ]
                                    v
                     [ بررسی پنجره ضد بازپخش IPsec ]

رقابت قفل‌ها و افت بسته‌ها با پنجره‌های استاندارد

زمانی که چند هسته پردازنده بسته‌های یک پیوند SA پرسرعت را بررسی می‌کنند، نوسانات جزئی در زمان پردازش سبب جابه‌جایی ترتیبی داده‌ها می‌شود. یک بسته در هسته ۱ ممکن است صدها شماره جلوتر از بسته هسته ۰ به موتور ضد بازپخش برسد.

اگر عرض پنجره $W$ در مقدار سنتی ۳۲ یا ۶۴ بسته باقی مانده باشد، این تقدم و تاخر به افت شدید بسته‌ها می‌انجامد:

  • هسته ۱ متغیر $۱۲۰ ،M$ پله به جلو می‌راند.
  • هسته ۰ بسته‌ای با شماره $S < M - W + 1$ را به مقصد تحویل می‌دهد.
  • سیستم گیرنده به اشتباه بسته سالم را کهنه تصور کرده و آن را حذف می‌کند.

این خطای ارزیابی موجب ارسال درخواست‌های مکرر بازپخش TCP و کاهش چشمگیر پهنای باند موثر می‌گردد. مدیران شبکه می‌توانند نشانی‌های خروجی خود را با ابزار بررسی نشانی آی‌پی پایش کنند.

بهینه‌سازی نقشه بیتی چرخشی RFC 6479 برای تونل‌های پرترافیک

الگوریتم‌های قدیمی با ورود هر بسته جدید، کل آرایه ماسک بیتی را به صورت خطی جابه‌جا می‌کنند. برای پنجره‌های ۳۲ یا ۶۴ بیتی، این کار با یک دستور جابه‌جایی بیتی (bitmask <<= shift) انجام می‌شود.

اما برای رفع مشکل جابه‌جایی در سیستم‌های چند‌هسته‌ای، اندازه پنجره باید به ۱۰۲۴ یا ۴۰۹۶ بسته برسد. جابه‌جایی یک بلوک حافظه ۴۰۹۶ بیتی به ازای هر بسته ورودی، پهنای باند گذرگاه حافظه را فرسوده کرده و کارایی حافظه کش پردازنده را از بین می‌برد.

سند RFC 6479 با پیاده‌سازی بافر بیتی چرخشی بدون نیاز به جابه‌جایی، این مشکل را حل کرده است:

+-----------------------------------------------------------------------------+
|              ساختار بافر چرخشی ماسک ضد بازپخش طبق RFC 6479                  |
+-----------------------------------------------------------------------------+
| بلوک ۰ (۶۴ بیت)  | بلوک ۱ (۶۴ بیت)  | ... | بلوک N (۶۴ بیت)                 |
+-----------------------------------------------------------------------------+
         ^                                      ^
   شاخص: (Seq / 64) % تعداد_بلوک‌ها        اشاره‌گر موقعیت جاری

در راهکار RFC 6479:

  • نقشه بیتی به بلوک‌های ثابت ۳۲ یا ۶۴ بیتی تقسیم می‌شود.
  • شماره بسته از طریق محاسبه باقیمانده به خانه متناظر نگاشت می‌شود: index = (seq / 64) % total_banks.
  • با پیشرفت پنجره، تنها خانه‌هایی که اشاره‌گر از آنها عبور می‌کند بازنشانی شده و نیازی به کپی سراسری حافظه نیست.
  • ارزیابی موقعیت بسته در زمان ثابت $O(1)$ و بدون وابستگی به وسعت پنجره صورت می‌گیرد.

پیکربندی و ایمن‌سازی پنجره‌های ضد بازپخش در لینوکس XFRM و BSD

سیستم‌های عامل امروزی تنظیمات پیشرفته‌ای برای گسترش ابعاد پنجره و فعال‌سازی ESN ارائه می‌دهند.

در لینوکس، لایه XFRM از طریق ابزار iproute2 پیکربندی می‌شود. برای ایجاد یک پیوند SA با پنجره ۱۰۲۴ بسته‌ای چرخشی و پشتیبانی از ESN ۶۴ بیتی از این دستور استفاده می‌شود:

# ثبت وضعیت XFRM با پنجره بازپخش ۱۰۲۴ بسته‌ای و ویژگی ESN
ip xfrm state add src 198.51.100.1 dst 203.0.113.1 \
    proto esp spi 0x1a2b3c4d reqid 1 mode tunnel \
    replay-window 1024 flag esn \
    aead "rfc4106(gcm(aes))" 0x0123456789abcdef0123456789abcdef01234567 128

برای مشاهده آمار بسته‌های حذف‌شده در گره لینوکسی:

# بازبینی شمارنده‌های خطای بازپخش در وضعیت XFRM
ip -s xfrm state show spi 0x1a2b3c4d

خروجی این دستور عمق replay-window و شمارنده خطای replay را نشان می‌دهد. اگر این شمارنده زیر بار ترافیکی سنگین افزایش یابد، نشان‌دهنده ناکافی بودن عرض پنجره برای جبران تاخیر پردازنده‌ها است.

در سیستم‌های FreeBSD و OpenBSD، مقادیر کرنل از طریق sysctl تنظیم می‌شوند:

# تنظیم عمق پنجره پذیرش بسته‌های ESP در سیستم‌عامل‌های BSD
sysctl net.inet.ipsec.esp_replaywindow=1024

در نرم‌افزارهای مدیریتی مانند StrongSwan، قابلیت ESN در فاز دوم با افزودن برچسب esn به پیشنهادهای کاری فعال می‌گردد (esp=aes256gcm128-esn!).

راهکار RiceGuard برای حل جابه‌جایی بسته‌ها بدون افت امنیت

شبکه VPNRice شتاب‌دهنده اختصاصی RiceGuard را در تمامی سرورهای لبه خود به کار گرفته است. به‌جای مصالحه میان دقت فیلتر ضد بازپخش و سرعت پردازش موازی، RiceGuard از چرخه پردازشی سازگار با جابه‌جایی داده‌ها بهره می‌برد.

[ ترافیک کاربر ] -> [ هدایت هوشمند جریان RiceGuard ] -> [ هسته‌های پردازش موازی ]
                                |
                                v
            [ ماتریس پنجره ۴۰۹۶ بیتی RFC 6479 ] -> [ تحویل بدون افت داده‌ها ]

۱. تخصیص اختصاصی جریان به هسته‌ها: RiceGuard داده‌ها را پیش از بسته‌بندی شناسایی کرده و هر نشست TCP یا UDP را به هسته‌ای مشخص می‌سپارد تا ترتیب ورود بسته‌ها حفظ شود. ۲. ماتریس تطبیقی ۴۰۹۶ بیتی: در زمان بروز نوسانات در خطوط ترانزیت BGP، سیستم عمق ماسک را بر اساس الگوریتم RFC 6479 تا ۴۰۹۶ بسته بالا برده و مانع افت غیرواقعی داده‌ها می‌شود. ۳. هماهنگ‌سازی سخت‌افزاری ESN: لایه‌های پردازش داده وضعیت شمارنده ۶۴ بیتی را مستقیما روی تراشه‌های شتاب‌دهنده سخت‌افزاری به‌روز می‌کنند تا افت کارایی در سرعت‌های بالا رخ ندهد.

جهت بهره‌مندی از اتصالی پایدار با رمزنگاری پیشرفته روی دستگاه‌های همراه و رایانه‌ها، می‌توانید برنامه رسمی را دریافت کنید.

دریافت VPNRice.

مهندسان شبکه فعال در زیرساخت‌های بزرگ می‌توانند تحلیل فنی تشخیص سریع خرابی مسیر با BFD را مطالعه کرده و سازوکار پنجره‌های کشویی در WireGuard را بررسی کنند. علاوه بر این، بررسی راهنمای مدیریت ازدحام با الگوریتم TCP BBR توصیه می‌شود.

چک‌لیست پیاده‌سازی برای دروازه‌های پرسرعت IPsec

پیاده‌سازی مکانیزم محافظت در برابر بازپخش در زیرساخت‌های حساس نیازمند ارزیابی موارد زیر است:

  • اطمینان از فعال‌سازی ESN: بررسی کنید که پیکربندی سرویس IKEv2 حتما شامل گزینه ESN برای تمامی پیشنهادهای Child SA باشد تا از سرریز شمارنده ۳۲ بیتی پیشگیری گردد.
  • افزایش اندازه پنجره بازپخش: پهنای پنجره را از مقدار اولیه ۳۲/۶۴ به دست‌کم ۵۱۲ یا ۱۰۲۴ بسته روی درگاه‌های با سرعت ۱ گیگابیت بر ثانیه یا بیشتر افزایش دهید.
  • به‌کارگیری نقشه‌های بیتی RFC 6479: اطمینان حاصل کنید که سیستم‌عامل از بافر چرخشی بدون جابه‌جایی فیزیکی بیت‌ها برای کاهش بار پردازنده استفاده می‌کند.
  • تنظیم روش هشینگ کارت شبکه: صف‌های دریافت کارت شبکه را متوازن کرده یا از بسته‌بندی UDP خارجی (NAT-T RFC 3948) بهره بگیرید تا جریان‌های دوسویه روی صف‌های سخت‌افزاری به شکل یکنواخت توزیع شوند.
  • پایش پیوسته آماره‌های خطا: داده‌های متریک XfrmInReplayError در لینوکس یا netstat -s -p esp را جهت تفکیک افت‌های ناشی از تاخیر از نفوذهای مخرب زیر نظر بگیرید.
  • حفظ ارزیابی یکپارچگی: هرگز سیستم ضد بازپخش را به بهانه برطرف کردن مشکل جابه‌جایی به طور کامل غیرفعال نکنید (replay-window 0)، چرا که شبکه را در برابر حملات محروم‌سازی از سرویس آسیب‌پذیر می‌سازد.