# ⚡ هایپردیاناس (HyperDNS) — گیتوی گیمینگ و اسمارت دیاناس مستقل HyperRAIN
> [!NOTE]
> ### نسخهٔ ۲.۲.۰ — کلاینت ACME توکار، لیست سفید بهصورت پیشفرض، نسخهٔ ۲ از REST API و کنسول تعاملی
> در نسخهٔ ۲.۲.۰ **گواهیهای SSL توسط خود سرویس صادر میشوند**: کلاینت داخلی ACME (مطابق با RFC ۸۵۵۵) بهطور کامل جایگزین اسکریپتهای certbot و acme.sh شده است — فرایند صدور و تمدید روزانه **در حین اجرای سرویس** انجام میپذیرد و گواهیهای تمدیدشده بدون نیاز به راهاندازی مجدد در لیسنرهای فعال جایگزین (Hot-Swap) میشوند. **لیست سفید (Whitelist) دسترسی کلاینتها بهصورت پیشفرض فعال است**: درخواستهای ارسالی از منابع ناشناس توسط DNS رد میشوند (همراه با خطای RFC ۸۹۱۴ Extended DNS Error تا کلاینت *دلیل مسدودی* را دریافت کند). نسخهٔ جدید **REST API v2** در کنار v1 (که حامل هدرهای `Deprecation` و `Sunset` است) ارائه شده و کنسول ترمینال اکنون امکان متوقفسازی، راهاندازی مجدد و حذف کامل سرویس را در اختیار میگذارد. فهرست کامل موارد در [CHANGELOG.md](docs/CHANGELOG.md) مشاهده کنید.
🚀 نصب •
🔒 امنیت •
🌟 ویژگیها •
🎮 بازیها و سرویسها (۱۷۱+) •
🖥️ داشبورد •
🔌 REST API •
🏛️ معماری •
🛡️ امنیت •
☕ حمایت •
English
---
## 📚 مستندات
| سند | موضوع |
| ---: | --- |
| **[README.md](README.md)** | مستندات اصلی پروژه به زبان انگلیسی. |
| **[docs/SECURITY.md](docs/SECURITY.md)** | مدل تهدیدات امنیتی، جزئیات رمزنگاری، چکلیست سختسازی و تطبیق با RFCها. **پیش از اتصال سرور به اینترنت عمومی حتماً مطالعه شود.** |
| **[docs/API.md](docs/API.md)** | مرجع کامل REST API v1 (قدیمی) و v2، با نمونهکد برای Python، Node.js و cURL. |
| **[docs/PRESET_CATALOG.md](docs/PRESET_CATALOG.md)** | کاتالوگ جامع بیش از ۱۷۱ بازی، پلتفرم و سرویس، تفکیکشده بر اساس دستهبندی. |
| **[docs/CHANGELOG.md](docs/CHANGELOG.md)** | تاریخچهٔ کامل انتشار نسخهها و باگهای رفعشده. |
| **[docs/TUTORIAL.fa.md](docs/TUTORIAL.fa.md)** | آموزش گامبهگام و کامل: از خرید سرور تا اضافهکردن کلاینت و دامنهٔ کاستوم برای پورتال مشترکین. **بهترین نقطهٔ شروع.** |
---
## 📖 معرفی و مرور کلی
**HyperDNS** یک سرور هوشمند اسمارت دیاناس (SmartDNS) فوقسریع در قالب یک تکباینری مستقل و موتور پراکسی شفاف SNI (Transparent SNI Proxy) است که به داشبورد مدیریتی تحت وب با تم سایبرپانک و گیمینگ، REST API برای توسعهدهندگان، و رابط خط فرمان تعاملی در ترمینال (`hdns`) مجهز شده است.
این نرمافزار هر سرور مجازی ابری (حتی ارزانترین سرورهای ۳ دلاری با ۱ هسته پردازنده و ۱ گیگابایت رم) را به یک **گیتوی اختصاصی ضد تحریم (دور زدن ارور ۴۰۳)** و **کاهشدهندهٔ پینگ گیمینگ** برای انواع دستگاهها از جمله **رایانههای شخصی (PC)، پلیاستیشن ۴ و ۵، ایکسباکس سری X/S، نینتندو سوییچ، اندروید، iOS و روترها (میکروتیک و...)** تبدیل میکند:
- **بدون نیاز به نرمافزار سمت کلاینت (Zero Client Software):** کاربران برای اتصال، تنها کافی است آدرس IP سرور دیاناس را در تنظیمات شبکهٔ کنسول، گوشی یا روتر خود وارد کنند.
- **بدون اورهد VPN (Zero VPN Overhead):** ترافیک UDP بازیها (شامل چت صوتی، فیزیک بازی و تیکریت سرور) مستقیماً به سرورهای رسمی بازی متصل میشود؛ بدون رمزنگاری مضاعف و بدون قطعهقطعه شدن پکتها ناشی از محدودیتهای MTU (بدون Packet Fragmentation).
- **ثبت و همگامسازی خودکار آیپی با یک کلیک (1-Click Self-Healing Registration):** کاربران اینترنت با آیپی داینامیک موبایل و خانگی میتوانند با کلیک روی پیوند اختصاصی خود (`/ip/{token}`) آدرس مجاز خود را در کسری از ثانیه بهروزرسانی کنند.
---
## 🖥️ حداقل مشخصات سرور
HyperDNS یک فایل باینری استاتیک و بدون وابستگی به زبان Go است. هیچ سرور پایگاه داده، رانتایم خارجی یا ایمیج کانتینری در لایههای زیرین آن وجود ندارد — بنابراین تنها متغیر تعیینکننده این است که به چه تعداد مشترک سرویس میدهید و آیا ترافیک دانلود آنها را رله میکنید یا خیر.
| ردهٔ راهاندازی | هسته پردازنده (vCPU) | حافظه رم (RAM) | ظرفیت و کاربرد واقعی |
| :---: | :---: | :---: | :--- |
| **پایه (Floor)** — اجرای اولیه و مصرف شخصی | ۱ هسته | ۱ گیگابایت | ۱ تا ۳ دستگاه، پالیسیها فعال، دانلودها در حالت مستقیم. این کمترین مشخصاتی است که دیمن روی آن اجرا میشود. |
| **پیشنهادی (Recommended)** — ارائهدهندگان خرد | ۲ هسته | ۲ گیگابایت | تا حدود ۱۰ مشترک با پلنهای فقط گیمینگ، به همراه فعال بودن همزمان DoT + DoH + پورتال مشترکین. |
| **حرفهای و آسوده (Comfortable)** — کلاینتهای متعدد | ۴ هسته | ۴ گیگابایت | بیش از ۲۰ مشترک، فعال بودن `enable_downloads`، اجرای بنچمارک در حین سرویسدهی فعال. |
تاریخچهٔ واقعی و صادقانهٔ پشت این ارقام: در **نسخهٔ ۱.۲.۰**، یک سرور ۱ هسته و ۱ گیگابایت رم با **تنها ۳ کاربر مصرف ۱۰۰٪ پردازنده** داشت — علاوه بر این، آن نگارش با نشت حافظهٔ شدیدی همراه بود که با گذشت زمان لگ و پینگ را تشدید میکرد. نسخهٔ ۲.۲.۰ دارای موتوری کاملاً متفاوت است: مسیرهای جستوجو و تطبیق قوانین، خواندنهای حافظهای در حد نانوثانیه و بدون تخصیص حافظهٔ جدید (Allocation-Free) هستند (اندازهگیریشده و اثباتشده — بخش [معماری فنی](#-ساختار-فنی-و-معماری-داخلی) را ببینید)، حافظهٔ کش بهصورت چندبخشی (Sharded) با سقف مشخص پیادهسازی شده، اتصالات رله دیگر بافر اختصاصی جدید نمیگیرند و دستههای نشت حافظهٔ گذشته بهکل ریشهکن شدهاند. یک سرور ۱ هسته و ۱ گیگابایت رم اکنون برای مصارف شخصی کاملاً *روان و قابل اتکاست* — اما اگر قصد فروش اشتراک دارید، حتماً پلن ۲ هستهای تهیه کنید: مدیریت محدودیت نرخ (Rate Limiting)، تولید کدهای خطای EDE و توزیع رلهها همگی در مسیر کوئریها پردازنده مصرف میکنند و سرور میزبان ریزالور نباید همان گلوگاهی باشد که پینگ بازی را خراب میکند.
همچنین موارد زیر الزامی هستند: یک **دامنه** که رکورد A آن به سرور شما اشاره کند (استفاده از HTTPS اجباری است؛ خود دیمن گواهی مربوطه را صادر میکند) و در دسترس بودن این پورتها: پورت 53 روی پروتکلهای UDP+TCP، پورت 80 روی TCP (فقط برای اعتبارسنجی ACME HTTP-01 هنگام صدور گواهی)، پورت پنل مدیریت، و بهصورت اختیاری پورت 853 برای DoT و پورت 8443 برای DoH.
---
## 🚀 نصب سریع و راهاندازی
### روش ۱: نصب تکخطی خودکار روی لینوکس (پیشنهادی)
دستور زیر را با دسترسی کاربر `root` روی اوبونتو 20.04+، دبیان 11+، یا AlmaLinux/Rocky 8+ اجرا کنید:
```bash
curl -fsSL https://raw.githubusercontent.com/IzumiRain/HyperDNS/v2.2.0-beta.1/scripts/install.sh | sudo bash
```
> **ورود به پنل در صفحهای کاملاً مستقل انجام میشود:** آدرس `/
/login` یک سند ورود خودکفا را ارائه میدهد (مسیر قدیمی `/dash/login` به این آدرس هدایت میشود). فیلد ورود دومرحلهای تنها زمانی نمایش داده میشود که رمز عبور اولیه تأیید شده باشد و صرفاً کد اعتبارسنجی ارسال نشده یا اشتباه باشد — بنابراین در صورت اشتباه بودن رمز اصلی، فیلد 2FA هرگز نشان داده نمیشود.
>
> **تغییر آیپی توسط مشترکین با رمز ثبت امن (Secret):** آدرس `/sub/` پورتال فقطخواندنی است؛ جابهجایی آیپی تنها از طریق ارسال درخواست `POST /ip/` به همراه **رمز ثبت حساب** (که در پنل مدیریت ادمین نمایش داده شده و قابل تولید مجدد است) صورت میگیرد. به این ترتیب لینک فاششدهٔ پورتال به تنهایی هرگز باعث تغییر یا سرقت دسترسی نمیشود. همچنین حسابهای معلق، منقضی یا بدون سهمیه امکان ثبت آیپی ندارند و آیپیهایی که قبلاً توسط اکانت دیگری ثبت شدهاند با خطای 409 مواجه میشوند بدون آنکه هیچیک از حسابها مسدود گردد — زیرا آدرسهای مشترک CGNAT در شبکههای موبایل متداول هستند.
>
> **نصب پاک و ایمن در هر بار اجرا:** نصاب هرگز بهصورت «درجا و ناایمن» اقدام به آپگرید نمیکند؛ اگر نسخهٔ قبلی شناسایی شود، ابتدا دادههای موجود در مسیری به صورت `/root/hyperdns-preinstall-.tar.gz` آرشیو شده (همراه با چاپ هش SHA-256 که تنها نسخهٔ امن اطلاعات گذشته است) و سپس با یک نصب کاملاً تمیز **جایگزین** میشود؛ تمامی مراحل از ابتدا پیکربندی میگردند — پیکربندی تازه، اعتبارنامههای تازه و گواهیهای تازه. در حالت اجرای تعاملی، تایپ عبارت `FRESH` برای تأیید پاکسازی الزامی است؛ در اجرای خودکار از طریق پایپ (`curl | bash`) تا زمانی که متغیر `HYPERDNS_FRESH=1` تنظیم نشده باشد، از پاکسازی خودداری میگردد. اگر از **HyperDNS نسخهٔ 1.x** مهاجرت میکنید، ابتدا اسکریپت `bash migrate-from-v1.sh` را از پکیج آفلاین اجرا کنید — این اسکریپت تمام آثار نگارش قدیمی (سرویسها، یونیتها، دراپاین ریزالور، لینکهای خط فرمان، تسکهای cron و پردازشها) را کاملاً پاک کرده، دادههای قدیمی را در پوشهٔ `/root` بکاپ گرفته و کنترل را به نصاب جدید میسپارد.
>
> **تنظیم دامنه برای پنل اجباری است:** نصاب از شما دامنهای درخواست میکند که رکورد A آن به آیپی سرور اشاره کرده باشد؛ سپس خود دیمن گواهی Let's Encrypt را **مستقیماً صادر میکند** — کلاینت ACME توکار (RFC 8555) چالش HTTP-01 را روی لیسنر پورت ۸۰ خود سرور پاسخ میدهد، بنابراین هیچ نیازی به certbot، acme.sh یا متوقف کردن سرویس نیست. پنل مدیریت فقط از طریق HTTPS روی دامنه در دسترس است و گواهیهای نامعتبر Self-Signed را رد میکند. برای نصبهای خودکار غیرتعاملی میتوانید از دستور روبرو استفاده کنید: `HYPERDNS_DOMAIN=dns.example.com HYPERDNS_EMAIL=you@example.com bash install.sh`. در صورت بروز خطا در صدور گواهی، نصاب علت دقیق را اعلام کرده (عدم تطابق رکورد A، مسدود بودن پورت ۸۰ یا محدودیت نرخ) و بدون چاپ بنر موفقیت خارج میشود؛ بنر پایانی نصاب تنها پس از راستیآزمایی کامل ارتباط امن HTTPS با داشبورد، استایلها و اسکریپتها چاپ میگردد. تمدید گواهیها نیز بهصورت روزانه و کاملاً خودکار در پسزمینه انجام میشود.
### روش ۲: اجرای باینری آماده
```bash
# روی لینوکس:
chmod +x ./bin/hyperdns_linux_amd64
sudo ./bin/hyperdns_linux_amd64 -server -web-port 8080
# روی ویندوز (از طریق PowerShell یا cmd در پوشهٔ مربوطه):
.\bin\hyperdns.exe -server -web-port 8080
```
### روش ۳: کامپایل از سورس
```bash
git clone https://github.com/IzumiRain/HyperDNS.git
cd "HyperDNS"
go build -ldflags="-s -w" -o bin/hyperdns ./cmd/hyperdns
./bin/hyperdns -server
```
### روش ۴: داکر (Docker / Docker Compose)
```bash
git clone https://github.com/IzumiRain/HyperDNS.git
cd "HyperDNS"
mkdir -p data certs
docker compose up -d
```
پیش از اولین اجرای کانتینر، دایرکتوریهای `data/` و `certs/` را ایجاد کنید. تمام دادههایی که باید در بازسازیهای کانتینر باقی بمانند درون پوشهٔ `data/` قرار دارند — یعنی `data.db`، `master.key` و `config.json` — و کانتینر به هر سه مسیر بهطور صریح ارجاع میدهد، بنابراین با آپدیت ایمیج هیچگاه اطلاعات پایگاه داده از بین نخواهد رفت. وجود فایل `config.json` اختیاری است: میتوانید یک فایل اولیه در آن قرار دهید یا اجازه دهید دیمن در اجرای اول پیکربندی پیشفرض را بسازد.
کانتینر به صورت عمدی و هدفمند با حالت `network_mode: host` اجرا میشود. وجود یک پرش NAT روی تکتک دیتاگرامهای UDP تأخیر مضاعفی به کوئریهایی که بازی را آغاز میکنند تحمیل میکند؛ علاوه بر این دیمن باید آیپی واقعی کلاینت را دریافت کند — سیستم شناسایی مشترک، محدودیت نرخ بر اساس منبع و لیست سفید دسترسی همگی به آیپی وابسته هستند. در صورتی که داکر از پراکسی پیشفرض Bridge استفاده کند، تمام درخواستها با آیپی پل داخلی وارد میشوند؛ در نتیجه ترافیک سنگین یک کاربر باعث اعمال محدودیت بر کل شبکه شده و تمام مشترکین یک کاربر واحد به نظر خواهند رسید.
---
## 🌟 ویژگیهای کلیدی
### 🎮 ۱. پالیسیهای هوشمند دستهبندیشده (پشتیبانی از بیش از ۱۷۱ بازی و سرویس)
- **شوترهای تاکتیکال و گیمینگ:** Valorant, CS2, Call of Duty (Warzone / Mobile / BO6), The Finals, Escape from Tarkov, Delta Force: Hawk Ops, HellDivers 2, PUBG, Apex Legends, Rainbow Six Siege, Rust, Squad, DayZ, ArmA, Dead by Daylight.
- **انیمه، گاچا و MMORPGها:** Genshin Impact, Honkai: Star Rail, Zenless Zone Zero, Wuthering Waves, Arknights: Endfield, Lost Ark, Throne & Liberty, Path of Exile 1 & 2, Warframe, Elden Ring, Black Desert, Final Fantasy XIV.
- **ورزشی، مبارزهای و مسابقهای:** EA Sports FC 25, eFootball, Street Fighter 6, Mortal Kombat 1, Tekken 8, 2XKO, Assetto Corsa, Euro Truck Simulator 2, Forza Horizon 5, F1 24.
- **پلتفرمها، ضد تقلبها و کلود گیمینگ:** Faceit AC, Riot Vanguard, EasyAntiCheat (EAC), BattlEye, Ricochet, GeForce NOW, Boosteroid, Xbox Cloud Gaming, Razer Synapse, Logitech G Hub, Corsair iCUE.
- **رسانه و شبکههای اجتماعی:** ویس و گیتوی Discord (رلهٔ رمزنگاریشدهٔ TCP ضد فیلتر)، Spotify, Twitch, Kick.
- **سرویسهای گوگل (نسخهٔ ۲.۲.۰):** جستوجو (Search)، جیمیل (Gmail)، درایو (Drive)، یوتیوب (YouTube) — با استثنا کردن هدفمند زونهای CDN اشتراکی و هدایت مستقیم CDNهای دریافت آپدیت.
- **دستیارها و پلتفرمهای هوش مصنوعی (نسخهٔ ۲.۲.۰):** Copilot, Perplexity, Grok, DeepSeek, Mistral, OpenRouter و موارد بیشتر.
- **شبکههای اجتماعی و پیامرسانها (نسخهٔ ۲.۲.۰):** X (توییتر سابق)، Instagram, Facebook, WhatsApp, Telegram, Reddit.
- **دور زدن تحریم توسعهدهندگان (۴۰۳):** Docker Hub, Gradle, Android Developers, NPM, PyPI, OpenAI, Anthropic, Claude, Hugging Face, Cursor, Copilot, Kaggle.
### 🛡️ ۲. رلهٔ پراکسی شفاف SNI (Transparent SNI Proxy)
- رلهٔ ترافیک در لایه ۴ روی TCP بدون خاتمه دادن به نشست SSL (بدون SSL Termination): ارتباط TLS بهصورت سرتاسری بین کاربر و سرور اصلی باقی میماند و HyperDNS هرگز کلیدهای رمزنگاری آن را در اختیار ندارد.
- قطعهقطعهسازی بستهٔ ClientHello در TLS برای دور زدن فیلترینگ عمیق بستهها (Anti-DPI)، فعال بهصورت پیشفرض (`enable_fragmentation`، با قابلیت تنظیم اندازهٔ قطعات و تأخیر بین ارسال آنها).
- استخر بافر ۳۲ کیلوبایتی با `sync.Pool` تا هیچ اتصالی حافظهٔ اضافی به خود اختصاص ندهد — دادهها در فضای کاربری کپی میشوند و هر جهت اتصال دارای مهلت بیفعالیتی (Inactivity Deadline) است که با عبور هر بسته تمدید میشود؛ بنابراین اتصالات نیمهباز (Half-Open) بلافاصله پاکسازی شده و منابع سرور قفل نمیمانند.
- ظرفیت پذیرش حداکثر ۴۰۹۶ اتصال رلهٔ همزمان؛ اتصالات فراتر از این سقف مستقیماً رد میشوند و در صف انتظار نمیمانند تا هجوم ترافیک منجر به اشغال کامل حافظه نشود.
### 👤 ۳. مدیریت مشترکین و همگامسازی آیپی با یک کلیک
- **دو آدرس مجزا، برای دو وظیفهٔ مشخص:** آدرس `/sub/{token}` **پورتال اختصاصی** مشترک است — نمایی فقطخواندنی (Read-Only) از پلن، حجم باقیمانده و آیپی شناساییشده، که در اختیار گذاشتن آن کاملاً امن است زیرا افشای این لینک نمیتواند آیپی ثبتشده را جابهجا کند. آدرس `/ip/{token}` برای **API ثبت آیپی** به کار میرود: ارسال درخواست `POST` به همراه رمز ثبت ۹۶ بیتی حساب (بدون نیاز به ارسال فیلد `ip` تا آیپی خود متقاضی ست شود — فرایند ۱ کلیکی)؛ یک درخواست سادهٔ `GET` به این مسیر نیز صفحهٔ راهنمای دوزبانه را برای بوکمارکهای قدیمی نمایش میدهد.
- **انتقال رمز ثبت خارج از باند (Out-of-band):** رمز ثبت فقط در پنل کلاینتِ اپراتور نمایش داده میشود (و با الگوریتم AES-256-GCM در کنار توکن ذخیره میگردد) و همانجا قابل بازتولید است. به همین علت افشای لینک پورتال هیچ خطری از نظر سرقت اشتراک به همراه ندارد.
- **دروازههای اعتبارسنجی ثبت آیپی:** حسابهای معلق، منقضیشده یا بدون سهمیه رد میشوند (با توضیحی مشخص که در پورتال قابل ترجمه است)؛ اگر آدرسی قبلاً به اشتراک *دیگری* متصل شده باشد، با خطای `409` پاسخ داده میشود **بدون آنکه هیچکدام از دو حساب غیرفعال شوند** — زیرا آیپیهای اشتراکی CGNAT در اپراتورهای موبایل پدیدهای کاملاً طبیعی هستند.
- **پورت اختصاصی پورتال (اختیاری):** با تعیین یک پورت در Settings → *Subscription Portal*، دیمن یک شنوندهٔ دوم فقط برای مسیرهای عمومی مشترکین باز میکند — در این پورت، مسیرهای ادمین، REST API، DoH و پنل SPA پاسخ ۴۰۴ خالی برمیگردانند. دقت کنید که این پورت باید در فایروال سرور نیز باز شود (`ufw allow /tcp`)؛ پنل توانایی باز کردن پورت فایروال را ندارد و این موضوع را صراحتاً اعلام میکند. دسترسی از بیرون تنها موردی است که خود کارت پورتال توانایی سنجش مستقیم آن را ندارد.
- **شناسههای پایدار RFC 9562 v4 UUID:** تولید شناسهٔ یکتای نسخهٔ ۴ برای تمام کلاینتها (استانداردی که جایگزین RFC 4122 شده است).
- **مدتزمان پلنها و محدودیت ترافیک:** انقضای روزانه، ماهانه، سالانه و مادامالعمر به همراه بررسی و اعمال لحظهای سهمیه.
- **کارتهای تلگرام به زبان فارسی:** ساخت پیام آماده با فرمت زیبا جهت ارسال به کاربر حاوی لینک پورتال، رمز ثبت، آدرس DNS و URL فراخوانی API.
- **لیست سفید بهصورت پیشفرض (نسخهٔ ۲.۲.۰):** درخواستهای ارسالشده از منابع ناشناس توسط DNS **رد میشوند** (با خطای توسعهیافتهٔ RFC 8914 Extended DNS Error با کد *Prohibited* برای کوئریهای دارای OPT، تا کاربر دلیل رد شدن را بداند) بهجای آنکه ترافیک رایگان دریافت نمایند. نصبهای تازه با لیست سفید فعال عرضه میشوند؛ در نصبهای ارتقایافته نیز یک مهاجرت تکباره در اولین بوت اعمال میگردد. در صورت تمایل به عمومی بودن سرور، مدیر میتواند کلید داشبورد را آگاهانه تغییر دهد.
- **فروش اشتراک مستلزم `access.allow_all: false` است** (که اکنون پیشفرض است). تا زمانی که این گزینه `true` باشد، دیمن به هر درخواستی تحت عنوان کاربر ناشناس `Public` سرویس میدهد، بدون آنکه پلنی اعمال شود — و **باطل کردن اشتراکها عملاً بیاثر خواهد بود**: زیرا انقضا یا مسدودسازی، آیپی را از ایندکس ریزالور حذف میکند، اما در حالت `allow_all` آیپی ناشناس همچنان بهعنوان `Public` سرویس میگیرد که هیچ پلنی برای انقضا یا اتمام سهمیه ندارد. پیش از فروش اشتراک، حتماً از خاموش بودن آن مطمئن شوید.
### 🔐 ۴. دیاناس رمزنگاریشده با استفادهٔ مجدد از اتصالات
- **پروتکل UDP/TCP معمولی روی پورت ۵۳، پروتکل DNS-over-TLS روی پورت ۸۵۳ و DNS-over-HTTPS روی پورت اختصاصی خود (پیشفرض ۸۴۴۳، قابل تنظیم)** — همگی در قالب یک دیمن و یک پردازش واحد. لیسنر DoH فقط به `/dns-query` و مسیرهای عمومی پورتال پاسخ میدهد؛ مسیرهای ادمین هرگز از طریق آن قابل دسترسی نیستند (نسخهٔ ۲.۲.۰).
- **اتصال بیکار DoT تا ۶۰ ثانیه نگه داشته میشود** (۳۰ ثانیه روی TCP معمولی) و هیچ سقفی برای تعداد کوئری روی یک اتصال وجود ندارد. هزینهٔ باز کردن یک اتصال جدید DoT یک هندشیک کامل TLS است؛ پیش از این، گوشیهایی که از Private DNS اندروید استفاده میکردند با هر چند ثانیه یک درخواست، مجدداً یک هندشیک کامل برقرار میکردند — که روی دیتای موبایل دهها میلیثانیه به تأخیر آغاز بازی اضافه میکرد.
- **اعلام مدتزمان نگهداری اتصال به کلاینت** (`edns-tcp-keepalive` مطابق با RFC 7828)، تا نیازی به حدس زدن نباشد. حدس طولانی منجر به ارسال کوئری در سوکتی میشود که سرور آن را بسته است؛ حدس کوتاه هم باعث دور ریختن هندشیکی میشود که قابلیت استفادهٔ مجدد داشت.
- **سقف تعداد اتصالات همزمان** (۵۱۲ اتصال TCP، ۱۰۲۴ اتصال DoT، ۵۱۲ اتصال HTTPS) به همراه تایماوتهای خواندن هدر و بیکاری در شنوندهٔ HTTPS، تا اتصال مجدد به ابزاری برای اشغال منابع سرور تبدیل نشود.
### 📜 ۵. گواهیهای SSL صادرشده توسط خود دیمن (نسخهٔ ۲.۲.۰)
- **کلاینت ACME توکار (RFC 8555) کاملاً جایگزین certbot و acme.sh شده است.** صدور و تمدید روزانه **در حین اجرای سرویس** انجام میپذیرد — پاسخ به چالش HTTP-01 از لیسنر پورت ۸۰ که در حال اجراست مدیریت میشود، بنابراین نیازی به نصب پکیج اضافه یا توقف سرویس نیست. گواهیهای تمدیدشده بدون نیاز به ریاستارت بهصورت آنی (Hot-Swap) جایگزین میشوند.
- **سه سطح گواهی، برای سه نام دامنهٔ مجزا:** پنل مدیریت، پورتال اشتراک، و ترنسپورتهای DoT/DoH هر کدام از گواهی اختصاصی استفاده میکنند که پیش از اعمال، با نام دامنهٔ مربوطه اعتبارسنجی میشود — نام اشتباه فوراً رد میشود و اعمال نمیگردد.
- **ترنسپورتهای DoH/DoT میتوانند گواهی اختصاصی داشته باشند** (دامنهٔ اختصاصی DoH/DoT، برای مثال جهت استفاده در Private DNS اندروید)، که بلافاصله پس از صدور، بهصورت زنده جایگزین میگردد در حالی که سایر بخشها از گواهی پنل استفاده میکنند.
### 📥 ۶. ترافیک دانلودهای حجیم بهطور پیشفرض از مسیر پراکسی عبور نمیکند
هر پریست بازی، دسترسی به کل یک ناشر را باز میکند: فروشگاه، ورود به حساب، مچمیکینگ، متادیتای آپدیتها — و سرورهای مخزن (Depot) که فایلهای اصلی چندگیگابایتی را حمل میکنند. این بخش دانلودها تنها بخشی از یک DNS گیمینگ است که حجم آن به جای کیلوبایت با گیگابایت سنجیده میشود، و رله کردن آنها تقریباً هیچگاه مطلوب شما نیست. به همین دلیل HyperDNS آنها را در دستهای مجزا تحت عنوان **دانلود بازی و اپلیکیشن (Game & App Downloads)** با کلید (`enable_downloads`) تفکیک کرده و این دسته بهصورت پیشفرض **خاموش** است.
با خاموش بودن این قابلیت، دامنههایی مانند `steamcontent.com`، `download.epicgames.com`، `dl.playstation.net`، `cdn.blizzard.com`، `dlassets.xboxlive.com`، `cdn.gog.com` و سایر موارد به آدرسهای **واقعی و مستقیم** خودشان resolve میشوند. استیم به درستی باز میشود، پوسترها بارگذاری میگردند، بازی آنلاین متصل میشود — اما خودِ ترافیک دانلود روی اینترنت مستقیم کاربر با حداکثر سرعت انجام میگیرد. لاگ کوئری این پاسخها را با برچسب `DIRECT · Game & App Downloads` مشخص میکند تا بتوانید جریان ترافیک را دقیقاً مشاهده کنید.
برای فعالسازی میتوانید از بخش **Policy Presets → Bandwidth & Traffic Policy** در داشبورد اقدام کنید یا درخواست زیر را ارسال نمایید:
```http
POST /api/v1/policies {"key":"enable_downloads","enabled":true}
```
#### ⚠️ پیش از فعالسازی
خلاصهٔ ماجرا: **ترافیک خروجی بهصورت گیگابایتی محاسبه میشود، سهمیهٔ کاربر تفاوتی میان «دانلود» و «بازی» قائل نمیشود، و دانلود از طریق پراکسی تقریباً همیشه کندتر از دانلود مستقیم است.** ده مشترکی که یک بازی ۱۰۰ گیگابایتی نصب میکنند، تنها با همین یک کلید ۲ ترابایت ترافیک پولی برای شما تولید میکنند؛ و مشترکی روی پلن حجمی میتواند کل سهمیهٔ خود را در یک شب صرف دانلود کند و بعد دیگر نتواند بازی کند — وضعیتی که از دید کاربر شبیه به «خرابی سرور» است تا «اتمام پلن». این کلید را **فقط** برای همان یک کاربردی که وجود دارد روشن کنید: مشتریای که خط اینترنت او **اصلاً** به CDN دسترسی ندارد (مسدودی کامل، نه افت سرعت). نشانهٔ آن: دانلود روی ۰ بایت بر ثانیه متوقف میشود بدون اینکه خطایی نمایش داده شود، در حالی که صفحهٔ استور بهدرستی باز میشود.
دو مکانیک دیگر هم باید بدانید: پراکسی SNI حداکثر ۴۰۹۶ اتصال همزمان را میپذیرد، در حالی که یک کلاینت دانلود برای هر نصب دهها اتصال موازی باز میکند — این سقف بسیار سریعتر از گیمپلی پر میشود و آنچه پس از آن رد میشود، اتصالات بعدی است، از جمله مسابقهٔ شخص دیگری. پس از تغییر کلید، کش را پاک کنید (`POST /api/v1/cache/flush`)؛ در غیر این صورت پاسخهای کششده تا پایان TTL مسیر قبلی خود را حفظ میکنند و به نظر میرسد تغییری اعمال نشده است.
#### دامنهٔ اثر: کلید سراسری در مقابل پلن اختصاصی مشترک
این دسته مانند هر سیاست دیگری در پلن مشترک عمل میکند و کلید سراسری سرور به عنوان سقف آن تعیینکننده است:
| وضعیت کلید سراسری `enable_downloads` | آیا در پلن مشترک درج شده است؟ | نتیجهٔ نهایی |
| :---: | :---: | :--- |
| **خاموش (off)** | — | **مستقیم (Direct)**. هزینهٔ پهنای باند با اپراتور سرور است، بنابراین خاموش بودن کلید سراسری اولویت دارد حتی اگر در پلن کاربر فروخته شده باشد. |
| **روشن (on)** | خیر (درج نشده) | **مستقیم (Direct)** برای آن حساب، و **از طریق پراکسی (Proxied)** برای حسابهایی که این گزینه را در پلن دارند. |
| **روشن (on)** | بله (درج شده) | **از طریق پراکسی (Proxied)**. |
| **روشن (on)** | پلن خالی است (پلن شامل همه چیز) | **از طریق پراکسی (Proxied)**. |
دو نکتهٔ بسیار مهم:
- **امکان رله کردن بازیای که خاموش کردهاید وجود ندارد.** این دسته صرفاً ترافیک دانلود را از بازیهایی که قبلاً فعال شدهاند *کسر* میکند. اگر `enable_steam` خاموش باشد، دانلودهای استیم در هر صورت مستقیم خواهد بود.
- **برای عبور دادن یک دامنهٔ خاص بدون فعالسازی کل این دسته**، آن را به لیست **Custom Proxied** اضافه کنید. این کار وتوی دانلود را برای آن نام و زیردامنههایش لغو میکند و ارزانترین روش برای نجات کاربری است که روی یک CDN مسدودشده گیر کرده است. البته لیست **Custom Blocked** همچنان بر هر دو اولویت دارد.
---
## 🔒 سختسازی پیش از اولین استفاده
چهار تنظیم مشخص میکنند که این نصب یک ریزالور اختصاصی و امن است یا یک ریزالور باز. مقادیر پیشفرض برای یک سرور شخصی در شبکهٔ خانگی تنظیم شدهاند — و از نسخهٔ ۲.۲.۰ ریزالور **بهصورت بسته (لیست سفید فعال)** عرضه میشود. جدول زیر مواردی را که پیش از استفاده دیگران باید بررسی شوند مشخص میکند:
| تنظیم | مقدار پیشفرض اولیه | مقدار پیشنهادی | دلیل و اهمیت فنی |
| :---: | :---: | :---: | :--- |
| `access.allow_all` | از نسخهٔ ۲.۲.۰ بهصورت پیشفرض `false` است (لیست سفید) | برای فروش یا اشتراکگذاری `false` بماند؛ مقدار `true` فقط برای استفادهٔ شخصی روی همه دستگاههاست | تا زمانی که این مقدار `true` باشد، دیمن به تمام آیپیها پاسخ میدهد؛ بنابراین غیرفعالسازی یا انقضای یک حساب فقط مانع از *شناسایی* آن میشود — و پس از آن همان آدرس تحت عنوان کاربر ناشناس `Public` سرویس دریافت میکند. محدودیتهای ترافیک روی حسابهای شناختهشده کار میکنند، اما **لغو دسترسی مشترکین تا زمان خاموش بودن این گزینه عملاً غیرممکن است**. نصبهای جدید با لیست سفید فعال عرضه میشوند و نصبهای ارتقایافته در اولین بوت بهطور خودکار همگام میگردند. |
| `security.api_bind` | `127.0.0.1` | دست نزنید، مگر آنکه ربات شما روی سرور دیگری باشد | مقدار `127.0.0.1` تضمین میکند که REST API تنها از داخل خود سرور در دسترس باشد و هر فراخوانی از راه دور خطای `403` دریافت کند، حتی با کلید معتبر. قرار دادن مقدار `0.0.0.0` پنل مدیریت را روی کل اینترنت قرار میدهد که تنها مانع آن کلید API خواهد بود. در صورت نیاز به اتصال راه دور، استفاده از SSH Tunnel بر تغییر این مقدار اولویت دارد. |
| رمز عبور مدیر (Admin Password) | بهصورت تصادفی تولید شده و **فقط یک بار** در خروجی نصب چاپ میشود | رمز اختصاصی خودتان، با حداقل ۱۰ کاراکتر | رمز به صورت تأییدکنندهٔ PBKDF2-HMAC-SHA256 (با ۶۰۰٬۰۰۰ دور تکرار) نگهداری میشود و هیچگاه متن خام آن ذخیره نمیگردد؛ بنابراین حتی با داشتن `master.key` نیز از درون `data.db` قابل استخراج نیست. این یعنی رمز فراموششده «بازیابی» ندارد و باید بازنشانی گردد. تغییر رمز باعث باطل شدن تمام نشستهای فعال داشبورد میشود. |
| `master.key` | در اولین اجرای سرویس تولید میگردد | حتماً از آن نسخهٔ پشتیبان خارج از سرور تهیه کنید | این کلید تمامی رکوردهای محرمانه مشترکین را رمزگشایی میکند. گم شدن آن یعنی غیرقابل خواندن رکوردهای کاربران؛ لو رفتن آن یعنی افشای اطلاعات. این کلید هرگز نباید وارد مخزن گیت شود (در `.gitignore` مسدود شده است). |
نصبهایی که دارای رمز عبور از دورههای پیش از اعمال سیاست استحکام رمز هستند همچنان کار میکنند — فرایند اعتبارسنجی ورود سیاست را تحمیل نمیکند تا کسی پس از ارتقا از سرور خود بیرون نماند — اما سیستم به آن برچسب هشدار میزند و داشبورد درخواست تعویض رمز میدهد. رمزهای جدید باید حداقل ۱۰ کاراکتر بوده و از دو رده نویسه استفاده کنند، یا حداقل ۱۶ کاراکتر باشند، یا از یک خط غیر-ASCII استفاده کنند؛ یک عبارت فارسی طولانی به تنهایی این شرط را برآورده میسازد.
دو نکتهای که این نسخه نیازی به پیکربندی آنها ندارد: لاگ کوئریهای DNS هرگز بر روی دیسک نوشته نمیشوند (تلهمتری صرفاً در حافظه رم و روی استریم SSE قرار دارد)، و رلهٔ SNI هیچگاه نشستهای TLS را رمزگشایی نمیکند، بنابراین کلیدی از ترافیک عبوری را ذخیره نمینماید.
### 🕶 پنل مخفی (از نسخهٔ ۲.۱)
داشبورد مدیریت دیگر روی مسیر ریشهٔ هاست قرار ندارد. در اولین راهاندازی، دیمن یک **مسیر تصادفی ۱۶ نویسهای در مبنای هگز** تولید کرده و تمامی مسیرهای مدیریتی را ذیل آن قرار میدهد — `//dash/…` برای صفحات پنل و `//api/…` برای وبسرویسها — و آدرس دقیق ورود را **تنها یک بار** در لاگ چاپ میکند. دامنهٔ ریشه صرفاً یک صفحهٔ لندینگ خالی با تم Matrix نمایش میدهد؛ آدرسهای قدیمی پنل نیز همان خطای ۴۰۴ عمومی را نمایش میدهند که هر مسیر نامعتبری دریافت میکند، بدون هیچگونه ریدایرکتی که سرنخی از مسیر ادمین آشکار کند. این مسیر هرچند یک مکانیاب است نه کلید امنیتی، اما با آن مانند اطلاعات محرمانه رفتار کنید: در صورت افشا، از بخش Settings → *Hidden Admin Path* آن را بازتولید کنید (با این کار تمام نشستها و بوکمارکها منقضی میشوند) و هرگز آن را در اسناد عمومی منتشر نکنید.
سختسازیهای تکمیلی اختیاری در بخش تنظیمات:
- **احراز هویت دومرحلهای (2FA)** — بر پایهٔ پروتکل RFC 6238 TOTP. از بخش تنظیمات → *Two-Factor Authentication* ثبتنام کنید: کلید سکرت فقط یک بار نمایش داده میشود، با وارد کردن یک کد اعتبارسنجی تأیید میگردد و از آن پس ورود به پنل (و هرگونه تغییر رمز یا کلید API) نیازمند کد لحظهای خواهد بود. غیرفعالسازی نیز نیازمند تأیید نهایی با هر دو فاکتور است.
- **پروتکل LDAP** — احراز هویت اپراتورها با Active Directory یا OpenLDAP (از طریق پروتکل امن `ldaps://` اعتبارسنجیشده با مخزن گواهیهای سیستم، جریان bind/search/bind و تایماوت ۵ ثانیه). حالتها: فقط محلی، فقط LDAP، یا LDAP همراه با جایگزین (Fallback) محلی.
- **پنجرهٔ زمان بیکاری نشست (Session Idle Window)** — ابطال نشست داشبورد پس از N دقیقه عدم فعالیت (از ۵ تا ۱۴۴۰ دقیقه، پیشفرض ۱۵ دقیقه). بلافاصله پس از ذخیره اعمال میشود؛ سقف مطلق ۲۴ ساعته نیز دستنخورده باقی میماند.
- **قفل ورود در برابر حملات Brute-Force** — ثبت ۳ ورود ناموفق از یک آدرس، آن را به مدت ۱۰ دقیقه مسدود میسازد. رفع قفل بدون نیاز به ریاستارت از گزینهٔ `[13]` در منوی TUI یا ارسال درخواست `POST /api/auth/unlock` (با نشست فعال یا کلید API، بههمراه کد TOTP در صورت فعال بودن 2FA) امکانپذیر است.
- **شخصیسازی پورتال مشترکین** — صفحات اختصاصی کاربران (`/sub/`، `/ip/` و شنوندهٔ اختصاصی در صورت تعریف پورت) بر اساس طراحی سیستم عمومی میمانند؛ بخش تنظیمات عنوان صفحه، دامنه و پورت نمایشدادهشده در لینکها و فایل CSS سفارشی را مدیریت میکند (کدهای استایل پیش از ارسال به مرورگر کاربر کاملاً پاکسازی میشوند: مسدودسازی دستورات `@import`، پیوندهای خارجی `url()` و اسکریپتها).
برای بررسی مدل کامل تهدیدات، فهرست دقیق فیلدهای رمزنگاریشده و فرایند گزارش آسیبپذیریها، سند **[SECURITY.md](docs/SECURITY.md)** را مطالعه کنید.
---
## 🖥️ کنترلر تعاملی ترمینال (TUI — `hdns`)
برای مشاهدهٔ تلهمتری زنده، ساخت مشترک جدید و اجرای تستهای عیبیابی از طریق SSH بدون نیاز به باز کردن مرورگر:
```bash
./hyperdns
# یا در صورت نصب در مسیر سیستم:
hdns
```
این رابط یک **منوی شمارهدار** است و نه یک واسط کاربری متنی تمامصفحه: ابتدا بنر سرویس شامل آیپی عمومی سرور، آدرس داشبورد و آدرس bind وبسرویس را چاپ کرده و سپس منتظر دریافت شماره و فشردن کلید Enter میماند. با هر بار انتخاب، صفحه از نو بازخوانی میشود؛ بنابراین تغییراتی که همزمان در داشبورد ایجاد شده باشد در دور بعدی بهطور صحیح منعکس میگردد.
| گزینه | عملیات | | گزینه | عملیات |
| :---: | :--- | :---: | :---: | :--- |
| `1` | وضعیت سرویس و تلهمتری زنده | | `9` | بنچمارک آپاستریمهای DNS |
| `2` | ابزارهای عیبیابی (Diagnostics) | | `10` | پاکسازی کامل کش DNS |
| `3` | راهاندازی مجدد سرویس (Restart) | | `11` | تغییر پورت پنل مدیریت داشبورد |
| `4` | متوقفسازی سرویس (Stop) | | `12` | مشاهده / چرخش کلید Master API |
| `5` | راهاندازی سرویس (پس از توقف) | | `13` | پاکسازی قفلهای ورود (Lockouts) |
| `6` | فهرست حسابهای مشترکین | | `14` | تغییر اعتبارنامههای مدیر |
| `7` | افزودن مشترک جدید | | `15` | بازنشانی اضطراری حساب مدیر |
| `8` | حذف حساب مشترک | | `16` | حذف کامل HyperDNS از سرور |
| `0`, `q` یا `exit` | خروج از منو (سرویس به کار خود ادامه میدهد) | | Ctrl+C | خروج فوری در هر اعلان ورودی |
گزینههای `3` تا `5` و `16` مستقیماً به **مدیریت چرخهٔ حیات سرویس** متصل هستند: کنسول یک پردازش کلاینت مستقل است و حتی در زمان خاموش بودن دیمن نیز اجرا میشود؛ بنابراین دقیقاً همان ابزاری است که اپراتور هنگام متوقف شدن سرویس برای راهاندازی مجدد به آن نیاز دارد. حذف کامل نیازمند تایپ تأییدیهٔ `UNINSTALL` است. گزینهٔ `13` اندپوینت احرازشدهٔ رفع قفل را روی لوپبک صدا میزند تا اپراتوری که دسترسی خود را قفل کرده بدون نیاز به ریاستارت قفل را باز کند. گزینهٔ `12` کلید اصلی API را بهصورت شفاف روی صفحه نمایش میدهد — با آن صفحه مانند خود کلید محرمانه رفتار کنید؛ چرخش کلید دسترسی کلید قبلی را بدون مهلت زمانی فوراً مسدود میسازد.
پالیسیهای بازیها **از این منو تنظیم نمیشوند** — فعالسازی آنها از طریق داشبورد یا REST API صورت میگیرد.
---
## 🌐 داشبورد مدیریت تحت وب
داشبورد روی مسیر ریشهٔ هاست قرار ندارد. در اولین راهاندازی، دیمن **آدرس ورود مخفی** خود را در لاگ چاپ میکند:
```text
https://
//login
```
این آدرس تنها مسیری است که شما را به صفحهٔ ورود هدایت میکند. آن را بوکمارک کنید؛ این مسیر یک رشتهٔ تصادفی ۱۶ نویسهای است که تنها یک بار چاپ میشود. برای بازیابی بعدی آن: بنر اولیهٔ TUI آدرس داشبورد را نشان میدهد، دستور `hdns status` وضعیت لیسنرها و گواهیها را بدون باز کردن دیتابیس گزارش میکند و پیام لاگ حاوی آدرس در هر بار راهاندازی دیمن مجدداً چاپ میشود.
- **صفحهٔ ورود کاملاً مستقل است (`//login`):** هیچیک از داراییهای سنگین پنل را بارگذاری نمیکند، بنابراین سورس پکیج داشبورد پیش از احراز هویت قابل خواندن نیست. فیلد اعتبارسنجی دومرحلهای تنها در صورت صحت رمز عبور و نامعتبر بودن کد ظاهر میشود — رمز اشتباه هرگز آن را نشان نمیدهد.
- **اعتبارنامههای ورود:** نام کاربری پیشفرض `admin` است. نصاب خودکار یک رمز عبور تصادفی تولید کرده و **تنها یک بار** در خروجی نصب چاپ میکند؛ در صورت اجرای مستقیم باینری بدون فایل پیکربندی، رمز تصادفی در لاگ اولیه چاپ میشود. هیچ رمز پیشفرض مشترکی وجود ندارد.
- **مدیریت کاربران و لیست سفید:** افزودن و ویرایش کلاینتها، تعیین آیپی مجاز، تنظیم محدودیتهای ترافیکی، مشاهده و بازتولید **رمز ثبت آیپی** و دریافت کارت آمادهٔ فارسی برای تلگرام.
- **پالیسیهای گیمینگ:** سوییچهای ۱ کلیکی برای فعالسازی تکتک دستههای بازی، بههمراه دامنههای سفارشی پراکسیشده یا مسدودشده، توکنهای DoH و رکوردهای استاتیک DNS.
- **استریم زندهٔ ترافیک:** نمایش لحظهای کوئریهای DNS بر بستر استریم Server-Sent Events (SSE).
- **تنظیمات و گواهی SSL:** مدیریت پورتال مشترکین (عنوان، دامنه، پورت)، ورود دومرحلهای، احراز هویت LDAP، پنجرهٔ زمان بیکاری نشست، مسیر مخفی مدیریت، وضعیت گواهیهای SSL و گیتوی REST API (کلید اصلی، وضعیت انتشار عمومی و نمونهکدهای آماده).
---
## 🔌 وبسرویس برنامهنویسان (Developer REST API)
HyperDNS یک REST API استاندارد جهت اتصال رباتها و سیستمهای فروش ارائه میدهد که در دو نسخه در دسترس است:
- **نسخهٔ v2** (قرارداد جدید و مدرن، `/api/v2/…`): نامگذاری فیلدهای متقارن (`display_name` و `allowed_ips` — نام فیلدها در ایجاد و ویرایش یکسان است)، لیستهای صفحهبندیشده بر اساس کرسر (`{items, next_cursor}` با سقف محدود)، پاسخ خطای استاندارد RFC 9457 `application/problem+json`، متدهای اختصاصی `POST /clients/{id}/actions/{action}` برای اعمال تغییرات وضعیت، و **دیکود سختگیرانه (Strict Decoding)** — ارسال فیلد ناشناخته منجر به خطای 400 میشود نه نادیده گرفتن بیصدای اشتباهات تایپی.
- **نسخهٔ v1** (فعال اما منسوخشده / Deprecated): تمام مسیرهای نسخهٔ ۱ حامل هدرهای `Deprecation` و `Sunset` به همراه هدر `Link: successor-version` با اشاره به نسخهٔ ۲ هستند. کلید اصلی Master API (یا نشست فعال داشبورد) دسترسی به هر دو نسخه را فراهم میکند؛ این کلید **روی تمام مسیرهای مدیریتی داشبورد رد میشود** (تفکیک سطح دسترسی در v2.2.0) مگر مسیر اضطراری رفع قفل.
- **مستندات تعاملی Swagger:** در آدرس `//api/v1/docs` — کافی است روی دکمهٔ **Authorize** کلیک کرده، کلید Master API را از تنظیمات جایگذاری کنید تا تمامی اندپوینتها مستقیماً از داخل مرورگر قابل اجرا و تست باشند. باز کردن خود صفحه نیازی به ارسال کلید ندارد.
- **ارائهٔ کاملاً داخلی و آفلاین:** فایلهای محیط Swagger UI از مسیر `web/swagger/` (تحت مجوز Apache-2.0) درون خود باینری تعبیه (Embed) شده و از همان سرور سرو میشوند؛ بنابراین این صفحه حتی در شبکههایی که دسترسی به CDNهای عمومی ندارند به درستی کار میکند و عبارت «۱۰۰٪ مستقل و آفلاین» دربارهٔ تمام اجزای آن صادق است.
- **مستندات جامع API:** برای جزئیات فنی و مثالهای کامل، سند [API.md](docs/API.md) را مطالعه کنید.
---
## 🏛️ ساختار فنی و معماری داخلی
هر کوئری ورودی از چهار لایهٔ متوالی عبور میکند:
۱. **کنترل دسترسی (Access Control)** — متد `IsIPAllowed(clientIP)` صرفاً یک خواندن از حافظهٔ Map تحت محافظت قفل خواندن/نوشتن `sync.RWMutex` است. چهار ایندکس داخلی (`idMap`, `ipMap`, `tokenMap`, `uuidMap`) هنگام تغییرات از دیتابیس BoltDB بازسازی میشوند و هنگام ثبت آیپی جدید کاربر، تنها همان یک رکورد بهروزرسانی میگردد؛ بنابراین فراخوانی عمومی اندپوینت `/ip/{token}` هیچگاه باعث اسکن کامل دیتابیس نمیشود. در صورتی که گزینهٔ `access.allow_all: true` باشد، آدرسی که در ایندکس نباشد به جای رد شدن تحت عنوان `Public` ناشناس سرویس میگیرد — هشدار بخش [سختسازی امنیتی](#-سختسازی-پیش-از-اولین-استفاده) را ببینید.
۲. **حافظهٔ موقت (Cache)** — یک ساختار LRU با ۶۴ شارد مجزا بر پایهٔ کلید سهگانهٔ Name+Type+Class. در صورت یافت شدن (Hit)، یک *کپی* از پیام ذخیرهشده بازگردانده میشود، زیرا تابع فراخوان باید شناسهٔ تراکنش (Transaction ID) را بازنویسی کرده و زمانهای TTL را کاهش دهد.
۳. **تطبیق قوانین (Policy Match)** — یک نگاشت تطبیق دقیق به همراه شاخص الگوهای عمومی (Wildcard) بر پایهٔ قاعدهٔ «طولانیترین پسوند برنده است» روی بیش از ۱۷۱ پریست و قوانین سفارشی کلاینتها یا قوانین سراسری ادمین. بر این اساس میتوان برای مثال `cdn.example.com` را مستقل از `*.example.com` مسیردهی کرد.
۴. **اقدام (Action)** — در حالت `proxy`، پاسخ DNS به آیپی همین سرور جعل (Spoof) میشود تا پراکسی شفاف SNI اتصال را به دست بگیرد؛ در حالت `direct`، بین آپاستریمهای تنظیمشده مسابقه گذاشته شده و پاسخ اصلی دستنخورده به کلاینت تحویل میگردد؛ در حالت `block`، دامنه سینکهول (مسدود) میشود.
نتایج بنچمارک اندازهگیریشده روی پردازندهٔ **نسل ۱۳ اینتل Core i5-13420H (۱۲ ترد)، روی سیستمعامل windows/amd64** با دستور `go test -bench` و `-count 3`:
| Operation | Serial | 12 threads | Allocations |
| :--- | :---: | :---: | :---: |
| جستوجوی مشترک (`IsIPAllowed`، حالت Hit) | 16.8–17.6 ns | 30.1–32.1 ns | 0 |
| جستوجوی مشترک بر اساس شناسهٔ UUID | 15.6–15.8 ns | — | 0 |
| تطبیق قانون، حالت تطبیق دقیق (Exact Hit) | 52.3–52.6 ns | 72.1–72.3 ns | 0 |
| تطبیق قانون، حالت الگو (Wildcard Hit) | 95.7–115.1 ns | — | 0 |
| تطبیق قانون، با ۶۰۰ قانون سفارشی ادمین | 132.8–142.8 ns | — | 0 |
| برخورد با کش (Cache Hit) | 258–302 ns | 127–133 ns | 6 / 296 B |
| عدم برخورد با کش (Cache Miss) | 69.6–77.4 ns | — | 1 / 48 B |
**تحلیل معنای این اعداد:** این اعداد هزینههای پردازشی درونبرنامهای برای هر تک لایه هستند و نه تأخیر نهایی و سرتاسری کوئری در شبکه — بستر شبکه، کرنل سیستمعامل و (در صورت Cache Miss) تأخیر سرورهای آپاستریم زمان اصلی را تعیین میکنند. ایندکس مشترکین تحت محافظت یک قفل اشتراکی Reader-Writer است و با افزایش تعداد هستهها مقیاسپذیری خطی ندارد: عدد پردازش موازی در هر جستوجو *بیشتر* از حالت تکرشته است که رفتار طبیعی قفلهای مشترک خواندن است و در نرخ کوئریهای DNS مشکلی ایجاد نمیکند. در نقطهٔ مقابل، کش به دلیل چندبخشی بودن (Sharding) با افزایش تردها عملکرد بهتری نشان میدهد. یک Cache Hit **بدون تخصیص حافظه نیست** — آن ۶ تخصیص حافظه مربوط به کپی دفاعی پیام برای جلوگیری از تداخل است. ارقام نانوثانیهای تکرشته در این رده از پردازندهها ممکن است در اجراهای مختلف دهها درصد نوسان داشته باشند، بنابراین بازهها را به عنوان روند در نظر بگیرید؛ ادعای اصلی پروژه الگوی رفتار است (تطبیق قوانین بدون تخصیص حافظه و بدون وابستگی هزینه به تعداد مشترکین یا قوانین)، نه دقت ریاضی رقم سوم اعشار.
**پایگاه داده و ذخیرهسازی:** یک فایل مستقل BoltDB. فیلدهای حساس — شامل نام مشترک، فهرست آیپیها، توکن اشتراک، کلید REST API و مسیرهای TLS — با کلید ۳۲ بایتی در `master.key` تحت الگوریتم AES-256-GCM مهروموم شدهاند؛ توکنها نیز حامل یک اثر انگشت کلیددار (Blind Index) هستند تا جستوجوی آدرس `/ip/{token}` با یک مرحله مقایسه انجام شود. رمز مدیر هرگز ذخیره نمیشود و صرفاً تأییدکنندهٔ PBKDF2-HMAC-SHA256 (با ۶۰۰٬۰۰۰ دور) نگهداری میگردد. شمارندههای ترافیک در حافظه رم تجمیع شده و هر ۳۰ ثانیه یک بار در قالب یک تراکنش واحد روی دیسک ثبت میشوند، زیرا در BoltDB هر تراکنش به منزلهٔ یک فراخوانی سیستمی fsync است.
---
## 🏆 کارنامهٔ کیفی (Quality Scorecard)
امتیازات زیر بر اساس ارزیابی فنی و انطباق با دستورالعملهای گوگل و ممیزیهای امنیتی Mantis ثبت شدهاند؛ هر ادعا مستقیماً به یک مرجع قابل راستیآزمایی متصل است — جدول بنچمارک فوق، تستهای رگرسیون مشخص در [SECURITY.md](docs/SECURITY.md) و آزمون نفوذ خارجی با سناریوی مهاجم واقعی:
| بعد کیفی | امتیاز | مبنای ارزیابی و شواهد فنی |
| :---: | :---: | :--- |
| 🔐 **امنیت (Security)** | **۹۳ / ۱۰۰** | سه دور ممیزی کامل امنیتی با سازوکار Mantis بههمراه آزمون راستیآزمایی اصلاحات — **بیش از ۵۰ یافتهٔ امنیتی که تکتک آنها با آزمون رگرسیون اختصاصی بسته شدهاند** (محدودسازی دسترسی master-key، یکبارمصرف بودن توکنهای TOTP، ایزولاسیون LDAP، محدودسازی DoH، جلوگیری از تداخل پورتها و نصاب ایمن). آزمون شبیهسازی مهاجم خارجی مشابه مدل T3MP3ST روی سرور فعال تمامی سازوکارهای دفاعی را استوار نشان داد و تنها یک مورد با درجه ریسک LOW گزارش شد که در همان مرحله برطرف گردید. تست همزمانی (Race Detector): تست روی تمامی ۲۰ پکیج با نتیجهٔ صفر race. موارد کسر امتیاز: باقی ماندن امکان تبدیل به ریزالور باز با یک سوییچ (عدم منع به عنوان تصمیم مستند)، عدم وجود لایهٔ WAF یا فیلتر حملات حجمی DDoS (وظیفهٔ ارائهدهندهٔ ابری)، مسیر ادمین به عنوان لایهٔ دفاع در عمق محسوب میشود. |
| ⚡ **کارایی (Performance)** | **۹۰ / ۱۰۰** | مسیرهای پرتردد همگی عملیاتهای نانوثانیهای بدون تخصیص حافظه هستند (جستوجوی کاربر ~۱۷ نانوثانیه، تطبیق دقیق قوانین ~۵۲ نانوثانیه، پاسخ کش ~۲۵۸ نانوثانیه — اثباتشده با بنچمارک)، کش دارای ۶۴ شارد مجزا، پشتیبانی کامل DoT از حفظ اتصالات بیکار (RFC 7828) بهجای تکرار هندشیک، بافرهای رله بر پایهٔ `sync.Pool` و کل پروژه یک فایل باینری بدون CGO است. موارد کسر امتیاز: ایندکس مشترکین پشت یک قفل مشترک RWMutex قرار دارد و با تعداد هستهها مقیاسپذیری ندارد، ارقام تأخیر سرتاسری روی بستر سیم منتشر نشده است، گزارشهای نسخهٔ ۱.۲.۰ (درگیری ۱۰۰٪ پردازنده و نشت حافظه) هرچند کاملاً برطرف شدهاند اما یادآوری آنها مانع از ثبت امتیاز ۹۵ شد. |
| 🔎 **سئو و وب (SEO)** | **۷۰ / ۱۰۰** | رویکردی کاملاً شفاف و آگاهانه: صفحهٔ لندینگ عمومی **بهصورت هدفمند** هدر `noindex, nofollow` ارسال میکند — صفحهٔ فرود یک ریزالور اختصاصی نباید در موتورهای جستوجو رتبه بگیرد، و پورتال مشترکین نیز هدر `Vary` بر اساس درخواست ارسال میکند تا هیچ کشی صفحهٔ یک مشترک را به دیگری تحویل ندهد. الزامات ساختاری گوگل کاملاً رعایت شده است: تگ واقعی ``، استفاده از تنها یک تگ ``، متاتگ viewport، ساختار معنایی HTML و طراحی واکنشگرای موبایلمحور. موارد کسر امتیاز: نداشتن sitemap، تگهای Open Graph و دادههای ساختاریافته، و نبود محتوای ایندکسپذیر — زیرا این سامانه یک وبسایت محتوایی نیست. |
| 🧹 **بهداشت کد (Code Hygiene)** | **۹۵ / ۱۰۰** | تأیید کامل استانداردهای gofmt و go vet روی تمامی ۲۰ پکیج، بررسی خودکار سینتکس فایلهای JS/Python/Shell، تست یکپارچگی نشانهگذاری با کدهای جاوااسکریپت جهت جلوگیری از ارجاع به المانهای ناموجود DOM، انضباط کامل در ثبت CHANGELOG و حفظ همخوانی بایتبهبایت در پکیج آفلاین. مورد کسر امتیاز: نگهداری یادداشتهای خصوصی برنامهریزی در پوشهٔ `.idea/` — این فایلها باید از مخزن عمومی حذف شوند. |
---
## 📐 انطباق با استانداردها و RFCهای بینالمللی
HyperDNS استانداردهای رسمی IETF زیر را به دقت پیادهسازی و رعایت میکند — جدول تفصیلی و توضیح کاربرد هر استاندارد در سند [SECURITY.md → استانداردها و تطبیق با RFCها](docs/SECURITY.md#-standards--rfc-compliance) در دسترس است:
هستهٔ پروتکل دیاناس [RFC 1035/2181] · دیاناس بر بستر پروتکل تیسیپی [RFC 7766] · دیاناس رمزنگاریشده DoT [RFC 7858] · دیاناس رمزنگاریشده DoH [RFC 8484] · کدهای خطای توسعهیافتهٔ دیاناس [RFC 8914، اعتبارسنجیشده بهصورت زنده] · مدیریت اتصالات فعال `edns-tcp-keepalive` [RFC 7828] · صدور خودکار گواهی ACME [RFC 8555] · رمزنگاری احراز هویت دومرحلهای TOTP [RFC 6238] · قواعد وب و استاندارد امنیتی HTTPS [RFC 9110] · فرمت خطای استاندارد problem+json [RFC 9457] · اطلاعرسانی بازنشستگی وبسرویسها Deprecation [RFC 9745] و Sunset [RFC 8594] · استخراج نام دامنه در TLS SNI [RFC 6066] · شناسههای یکتای UUID v4 [RFC 9562].
---
## ☕ حمایت مالی
هایپردیاناس را یک نفر، رایگان و متنباز ساخته و نگه میدارد. اگر بازی یا کارت را باز کرد، یک قهوه مهمانم کن.
| روش | آدرس / لینک |
| :--- | :--- |
| 💳 **ریالی** | [coffeebede.com/amtherain](https://coffeebede.com/amtherain) |
| 💰 **USDT · TRC20** | `TKBHWNoeygcaCK8N78e7dQX5Yco3WTb6ZN` |
| 💰 **USDT · BEP20** | `0x0F982640a69D3B9FB944840D7DA8bECCfcF0bb9E` |
| 💰 **TON** | `UQAyLUyxew-eggwhxbzsAZZZ9ULM8MYOk-3IXFh7tNC33LNt` |
هر چهار روش با دکمهٔ کپی: **[izumirain.github.io](https://izumirain.github.io/)**
---
## 📜 مجوز
پروژهٔ HyperDNS تحت شرایط مجوز **AGPL-3.0** منتشر شده و در دسترس عموم قرار دارد.