معرفی پروژه نهان
پروژه نهان (Nahan) یک راهکار توزیع ترافیک و پروکسی معکوس بدون سرور (Serverless) در بستر کلودفلر است. در این ساختار بدون نیاز به تهیه سرور مجازی شخصی (VPS)، با استفاده از معماری لبه کلودفلر و پایگاه داده با کارایی بالای SQLite D1، ترافیک شبکهی کاربران به صورتی همگام و ایمن در بستر اینترنت هدایت میشود.
مراحل نصب گامبهگام مصور (Interactive Mockups)
بخش اول: ساخت پایگاه داده D1 کلودفلر
گام اول: منوی ناوبری و رفتن به بخش دیتابیس D1
در پنل کلودفلر، منوی کناری را باز کرده و ابتدا از شاخه Storage & databases گزینهی D1 SQLite Database را انتخاب کنید.
گام دوم: ایجاد و ساخت دیتابیس نو
در صفحه دیتابیس D1، بر روی دکمهی اختصاصی Create Database کلیک نمایید.
D1 Databases
...گام سوم: نامگذاری دیتابیس بر مبنای قوانین نام کاربری
در فیلد Name نام دیتابیس خود را با حروف کوچک انگلیسی وارد کرده و بر روی کلید آبی رنگ Create کلیک کنید.
بخش دوم: ساخت نرمافزار لبه (Worker)
گام اول: ساخت اپلیکیشن ورکر جدید
از منوی کناری به بخش Compute -> Workers & Pages رفته و روی دکمهی آبی رنگ Create application کلیک کنید.
Build & deploy serverless functions, sites, and full-stack applications.
گام دوم: انتخاب قالب پایه و دپلو اولیه
بر روی دکمهی قالب پیشفرض یعنی Start with Hello World! کلیک نمایید. در مرحله بعد نام ورکر را تعیین نموده و روی دکمه آبی رنگ Deploy کلیک کنید.
بخش سوم: اتصال (Bind) پایگاه داده به Worker
گام اول: ورود به بخش تنظیمات Bindings ورکر
پس از اتمام دپلو اولیه، در داشبورد ورکر خود وارد زبانه Settings و زیرمنوی Bindings شده، و بر روی کلید Add binding کلیک نمایید.
گام دوم: تعریف متغیر IOT_DB و پیوند دیتابیس D1
از منوی کشویی نوع بایندینگ را بر روی گزینه D1 database قرار داده و فیلدها را مطابق ماکاپ زیر پر کرده و روی دکمهی آبی رنگ Add Binding کلیک نمایید.
Add a D1 database binding
The name used to refer to this binding.
ورود اولیه به سیستم و امنیت
پس از جایگذاری کدهای اصلی در ادیتور آنلاین و دپلو کردن، برای ورود به پنل باید عبارت زیر را به انتهای آدرس دامنهی ورکر خود اضافه کنید:
کلمه عبور اولیه برای ورود به پنل، عبارت admin با حروف کوچک است که باید بلافاصله پس از اولین ورود موفقیتآمیز، جهت امنیت از تنظیمات پنل تغییر داده شود.
تب نقاط اتصال و اشتراک هوشمند
سربرگ نقاط اتصال حاوی اطلاعات اتصالات و آدرسهای ساباسکریپشن هر مشترک است. در نسخههای جدیدتر، قالبهای مجزای قدیمی آلفا، بتا و گاما حذف شده و همگی در **یک لینک اشتراک همگانی واحد (Universal Sync URL)** ادغام شدهاند.
این لینک ساب هوشمند، کلاینت متصل شده (نظیر Clash، Sing-Box، Shadowrocket و غیره) را از روی امضای مرورگر تشخیص داده و کدهای متناسب با هسته آن نرمافزار را صادر میکند.
تنظیمات پیشرفته و قابلیتهای کلاستر
در تب تنظیمات پیشرفته، متغیرهای متعددی جهت شخصیسازی رفتارهای لایه عبور شبکه طراحی شده است:
امکان تعریف دامنهی سایر ورکرهای کمکی جهت همگامسازی و همسانسازی خودکار تنظیمات از نود مادر.
تغییر شیوهی درج پورت، شناسه کاربر، نام دامنه یا پیشوندهای سفارشی در کلاینت نهایی.
افزایش سرعت هندشیک اولیه و پنهانسازی اطلاعات SNI ارسالی به مقصد کلودفلر.
قابلیت اتصال ربات اختصاصی جهت کنترل مصرف، جستجوی کاربران و مانیتورینگ پنل.
مدیریت کاربران و قطع خودکار
یکی از کاربردیترین قابلیتهای ارائهشده در نسخه ۲.۵.۴.۲، سیستم **توقف اتوماتیک حسابهای مصرفی و منقضیشده (Auto-Disable)** است.
زمانی که ترافیک کلی مصرفشده یک کاربر از سقف مجاز فراتر رود یا انقضای زمانی وی به اتمام برسد، پایگاه داده SQLite D1 بلافاصله وضعیت آن کاربر را به صورت خودکار به حالت غیرفعال تغییر میدهد تا از بار اضافی ترافیکی ورکر جلوگیری شود.
ابزار اختصاصی دریافت و مبهمسازی کدهای ورکر
در این بخش میتوانید آخرین نسخه فایل اصلی را از گیتهاب دریافت کنید، آن را مشاهده نموده و با متود رمزنگاری ماژولار و بایتشفتینگ پیشرفته UTF-8، مبهمسازی (Obfuscate) کنید. این ابزار قادر است کدهای هر ورکری را به صورت پویا با ساختار کلودفلر همگامسازی کند.
💡 مکانیزم فنی مبهمسازی ماژولار و بایتشفتینگ چطور کار میکند؟
این ابزار ابتدا به طور خودکار دستورات استاتیک `import` را در هر ورکری شناسایی و پیوندهای خروجی آنها (Bindings) را استخراج میکند. ایمپورتها به بالای ساختار لودر نهایی منتقل میشوند و پیوندها به عنوان پارامتر ورودی به بدنه رمزگشایی صادر میگردند. سورسکد با موتور بومی مرورگر (`TextEncoder`) به آرایهای از بایتهای خام UTF-8 تبدیل شده و پس از اعمال شیفت کلید تصادفی XOR، به صورت هگزادسیمال بستهبندی میشود. در نهایت گیتوی با کلاس استاندارد `TextDecoder` بایتها را بدون هیچگونه به هم ریختگی به کدهای اصلی بازمیگرداند و به کمک `new Function` اجرا میکند. همچنین، برای رفع تداخل با ساختار متغیرهای خارج از ماژول، ساختار `export default` در انتهای پردازش به انتهای بدنه اصلی الحاق (Append) میشود تا از وقوع ReferenceError جلوگیری شود.