Skip to content

اعمال محدودیت چطور کار می‌کند

فرق با پنل poller

بیشتر پنل‌ها هر چند ثانیه یک شمارندهٔ بایت را می‌خوانند و وقتی عدد از سهمیه گذشت مشتری را غیرفعال می‌کنند. بین دو خواندن مشتری با سرعت کامل ادامه می‌دهد. روی خط ۱۰۰ مگابیت حدود ۲۵ مگابایت اضافه؛ روی گیگابیت ۲۵۰ مگابایت. پلن ۱ گیگابایتی برای مشتری سریع بی‌صدا ۱٫۲۵ گیگابایت می‌شود.

W-UI محدودیت را داخل خودِ کرنل می‌گذارد، به‌صورت یک quota object در nftables روی آدرس مشتری:

quota q_c14 { over 1073741824 bytes used 402653184 bytes }

کرنل بسته‌ای را که از سقف رد شود دور می‌ریزد. پنل در مسیر داده نیست، پس اضافه‌مصرف یک بسته است نه یک بازهٔ poll، و با ۱۰ مگابیت یا ۱۰ گیگابیت همین می‌ماند.

پنل هنوز poll می‌کند — اما فقط برای خواندن مصرف برای رابط و تصمیم به حذف peer، هرگز برای اعمال سقف بایت.

Reconciler

دیتابیس منبع حقیقت است. وضعیت کرنل از آن مشتق و بازسازی می‌شود، نه اینکه با رسیدن رویدادها تغییر داده شود. هر دو ثانیه:

۱. جمع‌آوری — شمارنده‌های nftables اتمیک خوانده و صفر می‌شوند، بعد مصرف با یک نویسندهٔ سریال به دیتابیس می‌رود. ۲. ارزیابی — در SQL تصمیم گرفته می‌شود چه مشتری‌هایی الان از سهمیه یا تاریخ گذشته‌اند. ۳. اعمال — مجموعهٔ peer مطلوب و ruleset مطلوب به کرنل داده می‌شود.

پس پنل خودترمیم است: اگر ماشین ریبوت شود، کسی nftables را دستی flush کند، یا پنل وسط نوشتن کشته شود، تیک بعدی همه چیز را از دیتابیس می‌سازد. و ریستارت پنل کسی را نمی‌اندازد — درایور هرگز لینک یا peer درست را حذف یا دوباره نمی‌سازد.

یادداشت‌های طراحی

  • peerها diff می‌شوند، نه جایگزین. وایرگارد برای هر peer وضعیت نشست دارد؛ جایگزینی کل لیست در هر تیک handshakeهای زنده را می‌شکند و تانل از هر دو سر وصل به نظر می‌رسد بی‌آنکه ترافیکی ببرد. درایور فقط تغییرات را می‌فرستد.
  • محدودیت‌ها ترافیکِ به سمت خودِ سرور را هم می‌گیرد. بسته‌هایی که این‌جا تمام می‌شوند به forward hook نمی‌رسند؛ بدون قانون input، یک resolver روی همین سرور مجانی داده می‌برد و مشتری قطع‌شده هنوز به هر سرویس روی سرور می‌رسید.
  • drop سهمیه قبل از شمارنده است. وگرنه بایت‌های دورریخته به حساب مشتری‌ای می‌رفت که هرگز نگرفتشان.
  • سقف سرعت با mark کلاس‌بندی می‌شود، نه با filter. زنجیرهٔ nftables که به ازای هر مشتری هست بسته را با کلاس HTB مهر می‌زند؛ هزینهٔ کلاس‌بندی با افزایش مشتری ثابت می‌ماند.
  • خروجی، policy routing است. هر خروجی یک جدول مسیریابی mark شده است؛ mark خروجی پیش‌فرض روی هر چیز تطبیق‌نخورده می‌نشیند، DNS هم، و وقتی آن خروجی پایین است ترافیک مشتری‌ها دور ریخته می‌شود نه اینکه از آدرس خودِ سرور نشت کند.

چه چیزی از کرنل لازم است

nft_quota برای محدودیت دقیق، HTB (sch_htb) برای سقف سرعت، wireguard برای وایرگارد کرنلی؛ AmneziaWG وقتی ماژولش ساخته نشود به نسخهٔ userspace برمی‌گردد. نصاب هر کدام را تست می‌کند و می‌گوید؛ خط Enforcement در نمای کلی می‌گوید در کدام حالتی.

Released under the AGPL-3.0 License.