Skip to content

صفحهٔ سابسکریپشن ​

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

چه چیزی رویش هست ​

  • چقدر از پلن مصرف شده، چقدر مانده، کی تمام می‌شود و مشتری آخرین بار کی آنلاین بوده.
  • مصرف هر کاربر روی هر تونل، در جدولی بازشونده: هر کاربر یک ردیف، هر تونل یک ستون، مصرف هر کاربر روی هر تونل، و جمع در انتهای هر ردیف و زیر هر ستون. هر عدد را کرنل روی آدرس تونل همان دستگاه می‌شمارد، پس جمع ردیف‌ها بایت به بایت با مصرف بالای صفحه یکی است. پلنی که چند نفر با هم گرفته‌اند و پولش را با هم می‌دهند، از روی همین جدول تسویه می‌شود. برای پلنی که دوره‌ی فعلی‌اش پیش از 2.6.6 شروع شده، جدول از لحظه‌ی به‌روزرسانی می‌شمارد و همین را می‌نویسد (تفکیک کاربرها از …)؛ عددهای پیش از آن تخمینی بودند و نگه داشته نشدند.
  • برای WireGuard و OpenVPN، برای هر دستگاه به ازای هر میزبان یک بلوک: متن کانفیگ، دکمه‌ی کپی، دانلود، و کد QR که وسط صفحه باز می‌شود.
  • برای کاربر L2TP/IPsec، PPTP، IKEv2 یا OpenConnect، ردیف همان اطلاعات ورود و راه‌اندازی است. مشتری فهرست دستگاه‌ها را باز می‌کند، که جستجوی بالایش به فارسی یا انگلیسی و با نام، برند یا مدل کار می‌کند؛ گوشی، کامپیوتر یا روترش را انتخاب می‌کند؛ و صفحه فیلدهای همان دستگاه را با اطلاعات ورود همان کاربر پرشده نشان می‌دهد. ردیف IKEv2 گواهی‌هایش را هم برای دانلود می‌دهد، و اگر Remote ID با آدرس سرور فرق داشته باشد، آن را هم نشان می‌دهد. ردیف OpenConnect آدرس سرور را کامل می‌دهد، چون رمز استتار بخشی از آن است. انتخاب اتصال دوم، یعنی L2TP بدون IPsec، فقط وقتی تونل آن را دارد ظاهر می‌شود. فایل‌های WireGuard و OpenVPN هم همین کارت راه‌اندازی را جداگانه زیر خودشان دارند.
  • خود لینک اشتراک به شکل کد QR، برای اپ‌هایی که اشتراک می‌خوانند.
  • کلید تغییر زبان (فارسی یا انگلیسی) و کلید تغییر تم.
  • لینک پشتیبانی، اعلان و عنوان پروفایل از تنظیمات ← سابسکریپشن.

اطلاعات ورود پوشیده است ​

اطلاعات ورود L2TP، PPTP، IKEv2 یا OpenConnect در خود دستگاه تایپ می‌شود، پس باید در صفحه باشد؛ و همین تنها چیزی است که یک غریبه برای استفاده از پلن مشتری لازم دارد. برای همین صفحه نام کاربری، رمز و کلید مشترک (PSK) را هیچ‌وقت در چیزی که می‌فرستد نمی‌گذارد. هر کدام به شکل •••••••• نشان داده می‌شود و دکمه‌ی کپی‌اش، وقتی زده شود، مقدار را می‌گیرد و مستقیم در کلیپ‌بورد می‌گذارد، بدون اینکه هرگز در صفحه نوشته شود. دستور روتری که اطلاعات ورود در آن است، مثل دستور میکروتیک، هم همین‌طور است: پوشیده نشان داده می‌شود و کامل کپی می‌شود.

این روش جلوی این‌ها را می‌گیرد:

  • هر چیزی که صفحه را می‌خواند فقط ماسک را پیدا می‌کند: اسکریپت یا رباتی که لینک را باز می‌کند، خزنده‌ی وب، پیش‌نمایش لینک، نسخه‌ی ذخیره‌شده، یا افزونه‌ای که صفحه‌ها را کپی یا خلاصه می‌کند. صفحه با no-store، no-referrer و noindex هم فرستاده می‌شود.
  • سایت دیگر نمی‌تواند مقداری بخواهد. درخواست باید POST از مبدأ خود صفحه باشد، که مرورگر با هدرهای Sec-Fetch-Site و Origin تأییدش می‌کند؛ باید هدری داشته باشد که هیچ سایت دیگری بدون preflight نمی‌تواند بفرستد، و پنل به preflight هرگز جواب نمی‌دهد؛ و باید نشانی را داشته باشد که به صفحه داده شده و بعد از ۳۰ دقیقه منقضی می‌شود. بعد از آن، صفحه را دوباره باز کنید.
  • بیرون کشیدن مقدارها با درخواست‌های پشت سر هم. سقف ۳۰ درخواست در دقیقه برای هر لینک و ۶۰ برای هر آدرس است، و هر مقداری که داده می‌شود با نام مشتری، دستگاه، نوع مقدار و آدرس در لاگ نوشته می‌شود.
  • خواندن آنها از خود لینک. چیزی که اپ، اسکریپت یا دانلود از لینک می‌گیرد (?view=raw، ?format=zip، دانلود تک‌فایل) همان متن است با ماسک به جای اطلاعات ورود، و می‌گوید لینک را در مرورگر باز کنید.

آنچه هیچ صفحه‌ای نمی‌تواند جلویش را بگیرد، بی‌پرده: افزونه‌ای که مشتری به آن اجازه‌ی خواندن و تغییر سایت را داده، داخل خود صفحه اجرا می‌شود و هر چه صفحه می‌بیند را همان لحظه می‌بیند؛ و هر چه در کلیپ‌بورد است، هر برنامه‌ای روی دستگاه می‌تواند بخواند. محافظت این است که تا مشتری دکمه‌ی کپی را نزند، چیزی آنجا نیست. این قولی درباره‌ی دستگاهی نیست که مشتری خودش آن را به برنامه‌ی دیگری سپرده.

فایل WireGuard یا OpenVPN خودش اطلاعات ورود است، با کلیدش یا نام کاربری داخلش، و مثل قبل برای اپ خودش نمایش داده و به شکل کد QR داده می‌شود.

قالب‌ها ​

تنظیمات ← سابسکریپشن ← قالب یکی از بیست‌ویک ظاهر را انتخاب می‌کند. پیش‌نمایش یک صفحه‌ی نمونه با قالب انتخاب‌شده را از طریق یک لینک یک‌بارمصرف باز می‌کند، تا پیش از مشتری‌ها آن را ببینید.

قالبظاهر
classicچیدمان کلاسیک پنل
auroraنور قرمز، آبی و فیروزه‌ای روی سرمه‌ای تیره
wavesموج‌های آرام گرادیانی زیر کارت شیشه‌ای
networkبوم متحرکی از نقطه‌های به‌هم‌وصل
minimalسفید، تخت، بدون تزئین
midnightسیاه خالص با درخشش قرمز
emberزغالی با آتشی گرم که از پایین می‌درخشد
oceanآب عمیق، سطح فیروزه‌ای آرام، کارت شیشه‌ای
forestخزه‌ی تیره با نور زمردی از میان برگ‌ها
sunsetبنفش تا کهربایی در آسمان، خورشیدی روی افق
neonسیاه با لبه‌های سرخابی و فیروزه‌ای درخشان
glassسفید مات روی زمینه‌ای رنگی و محو (روشن)
paperکرم گرم، تیترهای سریف، خط‌کشی (روشن)
terminalفسفر سبز روی سیاه، خط‌های اسکن، خط فرمان
carbonبافت کربن زیر فولاد براش‌خورده
royalسرمه‌ای و طلایی، لبه‌ی زراندود
sakuraسفید و صورتی شکوفه، گلبرگ‌هایی در حال ریزش (روشن)
frostآبی یخی و سفید (روشن)
graphiteسطح‌های خاکستری تخت، یک آبی، گوشه‌های گرد بزرگ
meshشبکه‌ی رنگارنگ آرام پشت شیشه‌ی تیره
retroسینث‌ویو: خورشید راه‌راه و شبکه‌ای که تا افق می‌رود

تا وقتی صفحه باز است، هر چند ثانیه خودش را تازه می‌کند: مصرف، حجم باقی‌مانده، نوار و حلقه‌ها، دانلود و آپلود، آخرین اتصال، و نقطه‌ی بالای صفحه. این نقطه وقتی دستگاهی handshake تازه دارد Online است، وقتی پلن فعال است ولی چیزی وصل نیست Idle، و وقتی پلن فعال نیست Off.

همه‌ی قالب‌ها همان محتوا و همان کنترل‌ها را دارند: کلید تم، زبان، و دکمه‌های دانلود و کپی. فقط ظاهر عوض می‌شود.

لینک ​

لینک به شکل https://host:port/subscribe/TOKEN است و مسیرش از تنظیمات ← سابسکریپشن ← مسیر URI می‌آید. توکن همان شناسه‌ی سابسکریپشن مشتری است. اگر آن را در فرم کلاینت عوض کنید، یا با کلید و لینک تازه روی ردیف مشتری تعویضش کنید، لینک قبلی همان لحظه از کار می‌افتد.

وقتی سرویس سابسکریپشن روی پورت جداگانه‌ای است، لینک همان پورت و scheme را دارد و فقط همان پورت جواب می‌دهد. پورت پنل دیگر اشتراک نمی‌دهد، مثل پنل کلاسیک؛ تا اپ مشتری هیچ‌وقت به پورت خود پنل وصل نشود.

نام دامنه، اگر پر شده باشد، تنها هاستی است که سرویس به آن جواب می‌دهد و هر نام دیگری خطای 404 می‌گیرد؛ لینک هم با همین هاست ساخته می‌شود. اگر خالی بماند، سرویس روی هر نام و IP جواب می‌دهد. پروکسی معکوس URI مسیر، وقتی سرویس از پشت پراکسی در دسترس است، برای ساختن لینک بر هر دو مقدم است.

همیشه به‌روز ​

برای لینک چیزی ذخیره نمی‌شود. هر بار که لینک باز می‌شود، کانفیگ‌ها همان لحظه از روی رکوردها ساخته می‌شوند. هر چه در پنل عوض شده باشد، مثل اندپوینت یا پورت، DNS، میزبانی که اضافه شده، دستگاهی که نامش عوض شده، نام کاربری یا رمز OpenVPN، یا مشتری‌ای که به سرور دیگری رفته، در دریافت بعدی هست. پاسخ با Cache-Control: no-store فرستاده می‌شود تا هیچ واسطه‌ای نسخه‌ی قدیمی نگه ندارد.

صفحه‌ی مشتری تا وقتی باز است خودش را به‌روز نگه می‌دارد. یک stream به پنل باز نگه می‌دارد. همان لحظه که چیزی در پنل عوض شود، چه از راه API و چه به دلیل اینکه هماهنگ‌ساز پلنی را تمام یا شروع کرده، پنل در آن stream می‌نویسد و صفحه عددهایش و اثر انگشت فایل‌هایی را که از آنها ساخته شده می‌پرسد. همین که اثر انگشت فرق کند، صفحه خودش را دوباره بار می‌کند. هر سه ثانیه هم خودش می‌پرسد، برای شبکه‌ای که stream را باز نگه نمی‌دارد. پس تغییر نام دستگاه، جابه‌جایی آدرس، اضافه شدن سرور یا تغییر نام کاربری ظرف چند ثانیه جلوی چشم مشتری است، بدون هیچ لمسی.

مصرف و نقطه‌ی آنلاین بدون بارگذاری دوباره به‌روز می‌شوند. اپ با فاصله‌ای که به آن گفته شده اشتراک را دوباره می‌گیرد (Profile-Update-Interval، که پیش‌فرض آن ۱ ساعت است و در تنظیمات ← سابسکریپشن تعیین می‌شود)؛ پس هر تغییری ظرف یک ساعت به همه‌ی اپ‌ها می‌رسد، بی‌آنکه فایل تازه‌ای برای کسی فرستاده شود.

فرمت‌ها ​

همان توکن به اپ‌ها هم سرویس می‌دهد. جواب لینک بستگی دارد به اینکه چه کسی آن را می‌خواهد:

درخواست‌کنندهچیزی که می‌گیرد
مرورگرصفحه‌ی مشتری.
اپ پروکسی (v2rayNG، Hiddify، Streisand، NekoBox و مانند آن‌ها)لینک‌ها به شکل base64: wireguard:// برای WireGuard، و لینک‌های Xray نود 3x-ui یا پاسارگاد.
هر چیز دیگر، یا ?format=confاگر مشتری یک فایل دارد، همان فایل. اگر چند فایل دارد، یک zip با یک فایل برای هر دستگاه؛ چون هر فایل کانفیگ فقط یک تونل را نگه می‌دارد و چند کانفیگ پشت سر هم در یک متن، فایلی است که هیچ اپی وارد نمی‌کند.
?format=zipهمیشه همه‌ی فایل‌ها در یک zip: فایل‌های WireGuard و OpenVPN، راهنمای L2TP، PPTP، IKEv2 و OpenConnect، و برای IKEv2 گواهی مرجع تونل و گواهی دستگاه.
?format=base64فایل به شکل base64؛ اگر چند فایل باشد، لینک‌ها.
?format=linksلینک‌ها، همان‌طور که اپ پروکسی می‌گیرد.

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

نام هر فایل WireGuard و AmneziaWG همان‌طور ساخته می‌شود که اپ‌ها نام تونل را می‌پذیرند: حروف لاتین، عدد و _ = + . -، حداکثر پانزده نویسه. فایل مشتری‌ای که نامش فارسی است به نام تونل نام‌گذاری می‌شود، و مشتری‌ای که روی چند تونل است یا چند دستگاه دارد، برای هر فایل نام جدا می‌گیرد تا وارد کردن فایل دوم با پیام «این تونل از قبل هست» رد نشود.

Released under the AGPL-3.0 License.