پروژه MasterDnsVPN یک راهکار مقاوم، کمسربار و پیشرفته برای دور زدن فیلترینگ و سانسور اینترنت است که ترافیک TCP و پروتکلهای مبتنی بر آن را بهصورت بستههای رمزنگاریشده درون کوئریهای DNS پنهان و منتقل میکند.
این سامانه بهطور خاص برای عبور از دیوارههای آتش (Firewalls) سختگیرانه و شرایطی طراحی شده است که روشهای سنتی VPN، یا حتی سرویسهای تونلینگ شناختهشده مانند DNSTT و SlipStream بهدلیل اختلالات گسترده، محدودیتهای شدید شبکهای و مسدودسازی رزولورهای DNS دیگر کارآمد نیستند.
هدف اصلی MasterDnsVPN، فراهم کردن تونلی امن، قابلاعتماد و انعطافپذیر است که سربار (Overhead) پروتکل را به حداقل رسانده و در شبکههای دارای تلفات بسته (Packet Loss) بالا یا محدودیتهای شدید MTU نیز عملکرد پایدار و قابل قبولی ارائه دهد.
❌ رفع مسئولیت: این پروژه فقط جنبه آموزشی و تحقیقاتی دارد، استفاده از آن ممکن است به ساختار شبکه آسیب بزند، همچنین استفاده از آن برای دور زدن قوانین کشورها ممنوع میباشد و ما هیچ مسئولیتی در مقابل این موضوعات نداریم.
توجه داشته باشید پروژه داره به زبان Go بازنویسی میشه و بزودی نسخه جدید با امکانات بیشتر و بهینه تر منتشر خواهد شد. لطفا برای حمایت از این پروژه و اطلاع از زمان انتشار نسخه جدید، کانال تلگرام ما رو دنبال کنید به پروژه هم استار بدید تا رایگان حمایت کنید. ممنون از همراهیتون ❤️
برای اطلاع از آخرین اخبار، آپدیتها و تغییرات این پروژه، لطفاً کانال تلگرام ما را دنبال کنید: Telegram Channel
شما به راحتی میتوانید با زدن روی دکمه ⭐ به صورت رایگان از این پروژه حمایت کنید.
در صورتی که علاقه مند به حمایت مالی هستید، میتوانید از طریق لینک زیر اقدام کنید:
TON: masterking32.ton
EVM-compatible blockchains: 0x517f07305D6ED781A089322B6cD93d1461bF8652
TRC20 chain: TLApdY8APWkFHHoxebxGY8JhMeChiETqFH
-
دور زدن سانسور شدید: 🛡️ طراحی اختصاصی برای افزایش احتمال عبور از فایروالها و سیاستهای محدودکنندهٔ شبکه که پروتکلهای VPN معمولی را مسدود میکنند.
-
توزیع بار و تعدد رزولورها (Load Balancing): ⚡ پشتیبانی از چندین DNS Resolver مختلف با استراتژیهای پیشرفتهٔ متعادلسازی بار بستهها (شامل: انتخاب تصادفی، نوبتگردشی یا Round-Robin، و انتخاب بهترین رزولور بر اساس کمترین میزان تلفات).
-
تکثیر پکت چندمسیره (Packet Duplication): 📡 قابلیت ارسال همزمان هر پکت از طریق چندین مسیر (رزولور و دامنهٔ مختلف). با این روش، هرکدام از پکتها که زودتر به مقصد برسد پردازش میشود و در صورت افتادن (Drop) یک پکت در یک مسیر، همان پکت از طریق رزولور دیگر بهسلامت میرسد. این تکنیک هرچند مصرف پهنایباند و منابع را افزایش میدهد، اما پایداری و اطمینان از ارسال را در شبکههای پر اختلال بهشدت بالا میبرد (این قابلیت قابل تنظیم بوده و امکان غیرفعالسازی آن نیز وجود دارد).
-
پروتکل ARQ سفارشی و بهینهسازی سربار: 🔄 پیادهسازی لایهٔ بازفرست و ترتیبدهی بستهها بر بستر UDP/DNS با استفاده از پروتکل اختصاصی ARQ بهجای استفاده از QUIC. این کار نهتنها وابستگی و سربارهای اضافی QUIC را در شبکههای بهشدت محدود حذف میکند، بلکه میزان MTU مورد نیاز را کاهش داده و با رزولورهایی که از EDNS پشتیبانی نمیکنند یا MTU کمتری دارند نیز کاملاً سازگار است. ساختار پکتها تا حد امکان ساده شده تا کمترین دیتای سربار سمت برنامه تولید شود.
-
امنیت قوی و رمزنگاری انعطافپذیر: 🔐 پشتیبانی از روشهای متنوع و قدرتمند رمزگذاری دیتا جهت حفظ امنیت کاربران، از جمله:
XOR،ChaCha20،AES-128-GCM،AES-192-GCMوAES-256-GCM. -
بررسی خودکار رزولورها و کاوش MTU: 🧰 در هنگام اجرای برنامه، سیستم بهصورت خودکار تمامی رزولورها را اسکن و بررسی میکند. این قابلیت کیفیت رزولورها را تست کرده، نتایج را به کاربر اطلاع میدهد و MTU بهینه را برای مسیرها تعیین میکند.
-
مولتیپلکس TCP: 🌐 امکان مولتیپلکس کردن (Multiplexing) چندین اتصال محلی TCP بر روی یک نشست (Session) واحد DNS برای مدیریت بهتر منابع.
-
فشردهسازی و تجمیع پکتهای کوچک: 🗜️ در صورت نیاز و تنظیم توسط کاربر، این ویژگی امکان ادغام پکتهای کوچک را تا اندازهٔ سقف MTU فراهم میکند. این کار باعث کاهش چشمگیر تعداد درخواستها (Requests) شده و فضای مفید بیشتری را برای اطلاعات اصلی اختصاص میدهد.
-
بهینهسازی اختصاصی SOCKS5: 🧦 در نسخههای جدید، بهینهسازیهای ویژهای برای پروتکل SOCKS5 صورت گرفته است. سیستم بهصورت خودکار فورواردینگ اطلاعات را بر مبنای ساکس انجام داده و شما را از نصب سرویسهای جانبی مانند X-UI، Dante و... بینیاز میکند. همچنین اگر پروتکل برنامه روی SOCKS5 تنظیم شود، بخش زیادی از سربارها و پکتهای اضافی مربوط به دست دادن (Handshake) ساکس حذف شده تا حجم درخواستها و ترافیک به حداقل برسد.
-
قابلیت انتقال انواع پروتکلهای TCP: 🚀 علاوه بر انتقال بهینه و اختصاصی SOCKS5، شما میتوانید ترافیک سایر سرویسها نظیر
VLESS،ShadowSocks،VMESSو سایر پروتکلهای مبتنی بر TCP را نیز از طریق این تونل فوروارد و منتقل کنید.
برای اینکه سرور شما بتواند درخواستهای DNS را بهطور مستقیم دریافت و پردازش کند، باید مدیریت (Delegation) یک زیردامنه را به سرور اختصاصی خودتان بسپارید. برای این کار، وارد پنل مدیریت DNS دامنهٔ خود (مانند Cloudflare، ArvanCloud و...) شوید و دقیقاً مطابق مراحل زیر دو رکورد ایجاد کنید:
ابتدا باید یک رکورد A بسازید تا یک زیردامنه را به آدرس IP عمومی (Public IP) سرورتان متصل کنید.
- نوع رکورد (Type):
A - نام (Name): یک نام کوتاه دلخواه (مثلاً
ns) - آدرس (IPv4 address): آدرس آیپی سرور شما (مثلاً
1.2.3.4)نتیجه:
ns.example.com -> 1.2.3.4
حالا باید یک رکورد NS (Name Server) ایجاد کنید. این رکورد به اینترنت میگوید که مسئول پاسخگویی به درخواستهای این زیردامنه، همان سروری است که در مرحلهٔ قبل معرفی کردید. کلاینت شما از این آدرس برای برقراری ارتباط با تونل استفاده خواهد کرد.
- نوع رکورد (Type):
NS - نام (Name): زیردامنهٔ اصلی تونل (مثلاً
v) - سرور نام (Target/Nameserver): آدرس رکورد A که در مرحله قبل ساختید (مثلاً
ns.example.com)نتیجه:
v.example.com -> ns.example.com
اگر از پنل کلودفلر استفاده میکنید، باید وضعیت پروکسی (Proxy status) برای رکورد A روی حالت DNS only (ابر خاکستری ☁️) تنظیم شده باشد. اگر پروکسی روشن (ابر نارنجی) باشد، کلودفلر ترافیک UDP پورت ۵۳ را مسدود کرده و تونل شما بههیچوجه کار نخواهد کرد!
در پروتکل DNS، طول کاراکترهای دامنه بخشی از حجم محدود هر پکت را اشغال میکند. هرچه نام دامنه و زیردامنههای شما کوتاهتر باشند (مثلاً v.ex.com بهجای tunnel.my-long-domain.com)، فضای خالی بیشتری برای انتقال دادههای مفید (Payload) کاربر باقی میماند که مستقیماً باعث افزایش پهنای باند، سرعت بالاتر و کاهش قطعیها میشود.
شما میتوانید این پروژه را به دو روش نصب و اجرا کنید. روش اول استفاده از فایلهای از پیش آمادهشده و اسکریپتهای نصب خودکار است (که بسیار سریعتر و راحتتر است) و روش دوم اجرای مستقیم از روی سورسکد میباشد.
اگر قصد دارید سرور را روی یک سیستم لینوکسی راهاندازی کنید، سادهترین راه استفاده از اسکریپت نصب خودکار است. کافی است دستور زیر را در ترمینال سرور وارد کنید:
bash <(curl -Ls https://raw.githubusercontent.com/masterking32/MasterDnsVPN/main/server_linux_install.sh)این دستور یک اسکریپت را از مخزن گیتهاب دانلود کرده و تمام مراحل نصب و تنظیم سرور را بهصورت خودکار انجام میدهد. پس از پایان نصب، سرور اجرا شده و یک کلید رمزنگاری (Encryption Key) در لاگ ترمینال به شما نمایش داده میشود. این کلید را حتماً کپی کنید (البته این کلید جهت اطمینان در فایلی به نام encrypt_key.txt در کنار فایل اجرایی سرور نیز ذخیره میشود)، زیرا برای اتصال کلاینت به آن نیاز خواهید داشت.
⚠️ نکتهٔ مهم ۱: پیش از اجرای این اسکریپت، باید مالکیت یک دامنه را در اختیار داشته باشید و رکوردهای DNS (بخش ۱) را بهدرستی در پنل خود تنظیم کرده باشید.
⚠️ نکتهٔ مهم ۲: این اسکریپت صرفاً سرور لینوکس را نصب میکند و شامل کلاینت نمیشود. برای اجرای کلاینت در سیستم شخصی خود، از روش «گام ۲.۲» استفاده کنید.
⚠️ نکتهٔ مهم ۳: از این دستور میتوانید برای آپدیت سرور نیز استفاده کنید. با انتشار نسخههای جدید، اجرای مجدد این اسکریپت باعث بهروزرسانی خودکار سرور شما خواهد شد.
برای راحتی شما، فایلهای اجرایی کلاینت (و سرور برای سایر سیستمعاملها) از قبل کامپایل شدهاند. کافی است نسخهٔ مناسب با سیستمعامل خود را دانلود کرده و فایل را از حالت فشرده خارج کنید.
💡 نکته: هر فایل ZIP کلاینت شامل فایل اجرایی،
client_config.tomlو فایلclient_resolvers.txt(لیست رزولورها) است.
| سیستمعامل (OS) | پردازنده (Architecture) | مناسب برای سیستمهای... | لینک دانلود مستقیم |
|---|---|---|---|
| ویندوز (Windows) 🪟 | AMD64 (64-bit) |
ویندوز ۱۰ و ۱۱ | دانلود نسخه ویندوز ⬇️ |
| مکاواس (macOS) 🍎 | ARM64 |
مکهای جدید (سری M1 / M2 / M3) | دانلود نسخه مک (Apple Silicon) ⬇️ |
| لینوکس (Linux) 🐧 | AMD64 (64-bit) |
توزیعهای جدید (اوبونتو ۲۲.۰۴+، دبیان ۱۲+) | دانلود نسخه لینوکس (جدید) ⬇️ |
| لینوکس (Legacy) 🐧 | AMD64 (64-bit) |
توزیعهای قدیمی (اوبونتو ۲۰.۰۴، دبیان ۱۱) | دانلود نسخه لینوکس (سازگاری بالا) ⬇️ |
| لینوکس (ARM) 🐧 | ARM64 |
سرورهای ARM، رزبریپای و بردهای مشابه | دانلود نسخه لینوکس (ARM) ⬇️ |
(کاربران ویندوز و مک، پس از استخراج فایل، میتوانند مستقیماً به بخش ۳ برای پیکربندی مراجعه کنند).
(در صورت عدم استفاده از اسکریپت نصب لینوکس)
| سیستمعامل (OS) | پردازنده (Architecture) | مناسب برای سیستمهای... | لینک دانلود مستقیم |
|---|---|---|---|
| ویندوز (Windows) 🪟 | AMD64 (64-bit) |
ویندوز سرور، ویندوز ۱۰ و ۱۱ | دانلود سرور ویندوز ⬇️ |
| لینوکس (Linux) 🐧 | AMD64 (64-bit) |
سرورهای اوبونتو ۲۲.۰۴+، دبیان ۱۲+ | دانلود سرور لینوکس (جدید) ⬇️ |
| لینوکس (Legacy) 🐧 | AMD64 (64-bit) |
سرورهای قدیمی (اوبونتو ۲۰.۰۴، دبیان ۱۱) | دانلود سرور لینوکس (سازگاری بالا) ⬇️ |
| لینوکس (ARM) 🐧 | ARM64 |
سرورهای ARM | دانلود سرور لینوکس (ARM) ⬇️ |
| مکاواس (macOS) 🍎 | ARM64 |
مکهای جدید (سری M1 / M2 / M3) | دانلود سرور مک (Apple Silicon) ⬇️ |
در لینوکس، پس از دانلود فایل ZIP، ابتدا باید ابزارهای استخراج و ویرایشگر متن را نصب کنید (در صورت عدم وجود):
sudo apt update
sudo apt install unzip nanoسپس فایل ZIP را استخراج کنید (نام فایل را بر اساس نسخهٔ دانلودی خود تغییر دهید):
# استخراج فایل کلاینت (یا سرور)
unzip MasterDnsVPN_Client_Linux_AMD64.zip
# مشاهده لیست فایلهای استخراج شده
lsدر سیستمعاملهای لینوکس و مک، برای اجرای برنامهها باید مجوز اجرا (Execute Permission) به فایل داده شود. نام فایل را بر اساس خروجی دستور ls وارد کنید:
chmod +x MasterDnsVPN_Client_Linux_AMD64اکنون فایل تنظیمات (client_config.toml یا server_config.toml) را با ویرایشگر nano باز کرده و اطلاعات خود را وارد کنید (توضیحات کانفیگ در بخش ۳ آمده است):
nano client_config.tomlنکته: در
nanoبرای ذخیره و خروج، کلیدهایCtrl + O، سپسEnterو در نهایتCtrl + Xرا فشار دهید.
پس از اعمال تغییرات، برنامه را با دستور زیر اجرا کنید:
./MasterDnsVPN_Client_Linux_AMD64
⚠️ توجه: اگر کاربر معمولی هستید، به این بخش نیازی ندارید. لطفاً از گام ۲.۲ استفاده کرده و مستقیماً به «بخش ۳: پیکربندی» بروید. این بخش مخصوص برنامهنویسانی است که قصد تغییر یا اجرای برنامه با پایتون را دارند.
برای اجرای سورسکد، باید پایتون نصب باشد. دستورات زیر را در ترمینال اجرا کنید:
# کلون کردن مخزن پروژه و نصب پیشنیازها
git clone https://github.com/masterking32/MasterDnsVPN.git
cd MasterDnsVPN
pip install -r requirements.txt
# کپی کردن فایلهای نمونه کانفیگ
cp server_config.toml.simple server_config.toml
cp client_config.toml.simple client_config.toml
cp client_resolvers.simple.txt client_resolvers.txt
# اجرای سرور یا کلاینت پس از ویرایش کانفیگ
python server.py
python client.pyاگر سرور را از طریق اسکریپت نصب سریع (گام ۲.۱) راهاندازی کردهاید، فقط کافیست فایل client_config.toml را در کلاینت ویرایش کنید. سه مقدار اصلی که باید حتماً تنظیم شوند عبارتند از:
- مقدار
ENCRYPTION_KEY: کلید رمزنگاری که پس از نصب سرور در ترمینال نمایش داده شده (و در فایلencrypt_key.txtسرور نیز ذخیره شده است) را اینجا قرار دهید. بدون این کلید اتصال برقرار نمیشود! - مقدار
DOMAINS: زیردامنهٔ تونل خود را دقیقاً وارد کنید (مثلاً["v.example.com"]). توجه: در حال حاضر فقط یک دامنه وارد کنید. پشتیبانی از چند دامنه در آپدیتهای بعدی تکمیل خواهد شد. - مقدار
client_resolvers.txt: فایل لیست رزولورها با فرمتهایIP،IP:PORT،CIDRوCIDR:PORT(مثلا8.8.8.8،8.8.8.8:5353،1.1.1.0/24یا1.1.1.0/24:99). خطوط خالی یا نامعتبر نادیده گرفته میشوند. اگر فایل وجود نداشته باشد یا هیچ ورودی معتبری نداشته باشد، کلاینت اجرا نمیشود.
💡 نکتهٔ طلایی: حتما در ادامه همین فایل برای بهبود سرعت و کیفیت و همچنین، افزایش سرعت اجرای برنامه بخش مربوط به توضیحات MTU را که به صورت گام به گام در بخش "درک بهتر از MTU و تنظیمات طلایی برای اجرای سریع" آمده است، مطالعه کنید. 💡
⚠️ نکتهٔ مهم ۱ (نوع رمزنگاری): اسکریپت نصب سریع، نوع رمزنگاری سرور را رویXORتنظیم میکند. اطمینان حاصل کنید که مقدارDATA_ENCRYPTION_METHODدر کلاینت نیز روی1تنظیم شده باشد تا با سرور همخوانی داشته باشد.
⚠️ نکتهٔ مهم ۲ (نحوهٔ اتصال): پروتکل پیشفرضSOCKS5است. پس از اجرای کلاینت، باید برنامههای خود (مثل مرورگر، تلگرام و...) را به پروکسی SOCKS5 با آدرس127.0.0.1و پورت تنظیمشده (پیشفرض:1080) متصل کنید. در حالت پیشفرض، نامکاربری و رمزعبور این پروکسیmaster_dns_vpnاست (قابل تغییر در کانفیگ).
⚠️ پشتیبانی: اگر به مشکلی برخوردید، لطفاً لاگ خطاها را ضمیمه کرده و مشکل خود را منحصراً در بخش Issues گیتهاب مطرح کنید و از ارسال پیام به توسعه در شبکههای اجتماعی یا ایمیل خودداری کنید. این کار به ما کمک میکند تا مشکلات را سریعتر شناسایی و رفع کنیم.
اگر از اسکریپت گام ۲.۱ استفاده نکردهاید و قصد دارید سرور را دستی کانفیگ کنید، باید فایل server_config.toml را ویرایش کنید. دقت کنید که مقادیر حیاتی مانند نوع رمزنگاری و دامنه باید دقیقاً در سرور و کلاینت یکسان باشند.
جدول زیر با فایل client_config.toml.simple و رفتار فعلی client.py هماهنگ است:
| پارامتر | مقدار پیشفرض | مقادیر قابل قبول | توضیحات |
|---|---|---|---|
PROTOCOL_TYPE |
"SOCKS5" |
"SOCKS5", "TCP" |
نوع تونل بین کلاینت و سرور. SOCKS5 حالت اصلی و بهینه برای مرورگر و برنامهها است. TCP برای تونل خام TCP استفاده میشود و معمولاً سربار بیشتری دارد. باید با تنظیم سرور یکی باشد. |
DOMAINS |
["v.domain.com"] |
لیست رشته | دامنه یا زیردامنهای که کلاینت روی آن query میفرستد. این مقدار باید دقیقاً با DOMAIN در سرور و رکورد NS شما هماهنگ باشد. |
DATA_ENCRYPTION_METHOD |
1 |
0 تا 5 |
الگوریتم رمزنگاری payload تونل. 0 خاموش، 1 XOR، 2 ChaCha20، 3 AES-128-GCM، 4 AES-192-GCM، 5 AES-256-GCM. باید با سرور یکی باشد. |
ENCRYPTION_KEY |
"" |
رشته | کلید مشترک بین کلاینت و سرور. بدون آن نشست ساخته نمیشود. |
BASE_ENCODE_DATA |
false |
true یا false |
اگر روشن باشد payload قبل از حمل در DNS به فرم base-safe تبدیل میشود. سازگاری را بالا میبرد ولی سربار و مصرف CPU را بیشتر میکند. |
LISTEN_IP |
"0.0.0.0" |
IP معتبر | آدرسی که پراکسی محلی کلاینت روی آن گوش میدهد. 127.0.0.1 فقط برای همان سیستم است، 0.0.0.0 برای کل شبکه محلی هم در دسترس میشود. |
LISTEN_PORT |
1080 |
پورت معتبر | پورتی که برنامههای محلی به پراکسی کلاینت وصل میشوند. |
SOCKS5_AUTH |
true |
true یا false |
احراز هویت پراکسی محلی SOCKS5 را روشن/خاموش میکند. این تنظیم فقط برای کاربران محلی این کلاینت است و ربطی به احراز هویت سمت سرور ندارد. |
SOCKS5_USER |
"master_dns_vpn" |
رشته | نام کاربری پراکسی محلی در صورت فعال بودن SOCKS5_AUTH. |
SOCKS5_PASS |
"master_dns_vpn" |
رشته | رمز عبور پراکسی محلی در صورت فعال بودن SOCKS5_AUTH. |
SOCKS_HANDSHAKE_TIMEOUT |
300.0 |
عدد اعشاری (ثانیه) | حداکثر زمانی که کلاینت برای کامل شدن فعالسازی یک stream محلی SOCKS صبر میکند. در شبکههای کند یا پرloss بهتر است کمی بزرگتر بماند تا stream سالم بیدلیل abort نشود. |
client_resolvers.txt (فایل) |
کنار فایل اجرایی/ZIP | IP، IP:PORT، CIDR، CIDR:PORT در هر خط |
منبع رزولورها است. خطوط خالی و نامعتبر رد میشوند. اگر فایل وجود نداشته باشد یا هیچ ورودی معتبری نداشته باشد، کلاینت بالا نمیآید. |
PACKET_DUPLICATION_COUNT |
2 |
عدد صحیح مثبت | هر query چند بار روی رزولورهای مختلف فرستاده شود. 1 یعنی بدون duplication. 2 نقطه شروع مناسب برای لینکهای ناپایدار است. مقادیر بالاتر پهنای باند و CPU را سریع بالا میبرند. |
STREAM_RESOLVER_FAILOVER_RESEND_THRESHOLD |
2 |
عدد صحیح مثبت | اگر یک stream به این تعداد STREAM_RESEND پشتسرهم بخورد، کلاینت resolver ترجیحی همان stream را به یک resolver سالم دیگر جابهجا میکند. این منطق فقط برای data-plane است تا reorder کمتر شود ولی stream روی resolver خراب گیر نکند. |
STREAM_RESOLVER_FAILOVER_COOLDOWN |
1.0 |
عدد اعشاری (ثانیه) | حداقل فاصله بین دو بار تعویض resolver ترجیحی یک stream. جلوی thrash شدن بین resolverها را میگیرد. |
MAX_PACKETS_PER_BATCH |
100 |
عدد صحیح مثبت | سقف بستهبندی control blockهای کوچک در یک عملیات DNS. مقدار واقعی در زمان اجرا علاوه بر این عدد، با MTU مذاکرهشده هم محدود میشود. 1 یعنی batching خاموش است. |
RESOLVER_BALANCING_STRATEGY |
2 |
1، 2، 3، 4 |
روش انتخاب resolver: 1 تصادفی، 2 نوبتگردشی، 3 کمترین loss، 4 کمترین latency. |
DNS_QUERY_TIMEOUT |
5.0 |
عدد اعشاری (ثانیه) | timeout پایه برای یک query DNS معمولی. اگر پاسخ در این بازه نرسد، در health accounting بهعنوان timeout ثبت میشود و مسیر retry/failover میتواند فعال شود. |
UPLOAD_COMPRESSION_TYPE |
0 |
0، 1، 2، 3 |
فشردهسازی payload کلاینت به سرور: 0 خاموش، 1 ZSTD، 2 LZ4، 3 ZLIB. بستههای خیلی کوچک معمولاً فشرده نمیشوند تا CPU کمتر مصرف شود. |
DOWNLOAD_COMPRESSION_TYPE |
0 |
0، 1، 2، 3 |
فشردهسازی payload سرور به کلاینت با همان enum بالا. در شروع نشست، کلاینت و سرور روی مقدار مجاز مشترک توافق میکنند. |
MIN_UPLOAD_MTU |
70 |
عدد صحیح (بایت) | حداقل MTU قابل قبول برای آپلود. رزولوری که کمتر از این مقدار تحمل کند از مدار خارج میشود. 0 یعنی این حداقل غیرفعال شود. |
MIN_DOWNLOAD_MTU |
150 |
عدد صحیح (بایت) | حداقل MTU قابل قبول برای دانلود. رزولورهای ضعیفتر از این حد کنار گذاشته میشوند. |
MAX_UPLOAD_MTU |
150 |
عدد صحیح (بایت) | سقف اولیهای که binary search آپلود از آن شروع میکند. بهتر است محافظهکارانه باشد تا startup طولانی نشود. |
MAX_DOWNLOAD_MTU |
200 |
عدد صحیح (بایت) | سقف اولیه تست MTU دانلود. اگر زیاد بزرگ باشد startup طولانیتر و ناپایداری بیشتر میشود. |
MTU_TEST_RETRIES |
2 |
عدد صحیح مثبت | تعداد تکرار هر تست MTU قبل از fail شدن آن probe. برای شبکههای ناپایدار زیاد کردنش دقت را بیشتر و زمان شروع را طولانیتر میکند. |
MTU_TEST_TIMEOUT |
2.0 |
عدد اعشاری (ثانیه) | timeout هر probe مربوط به MTU. اگر رزولورها کند هستند، این مقدار را کمی بالاتر ببرید. |
AUTO_SCALE_PROFILES |
true |
true یا false |
اگر روشن باشد، کلاینت بر اساس تعداد domain/resolverها، بعضی مقادیر startup و recheck را خودکار تنظیم میکند تا روی لیستهای کوچک و بزرگ رفتار متعادلتری داشته باشد. |
MTU_TEST_PARALLELISM |
6 |
عدد صحیح مثبت | تعداد زوجهای resolver-domain که همزمان در اسکن اولیه MTU تست میشوند. بالا بردن آن startup را سریعتر و فشار CPU/شبکه را بیشتر میکند. |
SAVE_MTU_SERVERS_TO_FILE |
false |
true یا false |
اگر فعال باشد، نتیجه رزولورهای موفق MTU در فایل ذخیره میشود. |
MTU_SERVERS_FILE_NAME |
"masterdnsvpn_success_test_{time}.txt" |
رشته | نام فایل خروجی نتایج MTU. اگر {time} وجود داشته باشد با timestamp جایگزین میشود. |
MTU_SERVERS_FILE_FORMAT |
"{IP} - UP: {UP_MTU} DOWN: {DOWN-MTU}" |
رشته | قالب هر خط خروجی رزولور موفق. placeholderهایی مثل {IP}، {UP_MTU}، {DOWN-MTU}، {DOMAIN} و {TIME} پشتیبانی میشوند. |
MTU_USING_SECTION_SEPARATOR_TEXT |
"---- Active MTU Testing Results ----" |
رشته | یک متن جداکننده که بعد از پایان تست اولیه MTU یکبار به فایل خروجی افزوده میشود. رشته خالی یعنی غیرفعال. |
MTU_REMOVED_SERVER_LOG_FORMAT |
"IP {IP} removed from list at {TIME} due to {CAUSE}" |
رشته | قالب خطی که وقتی یک resolver در زمان اجرا بهخاطر timeout یا fail شدن از مدار خارج میشود، در فایل MTU ثبت میشود. |
MTU_ADDED_SERVER_LOG_FORMAT |
"Server {IP} re-added at {TIME} (UP MTU: {UP_MTU}, DOWN MTU: {DOWN_MTU})" |
رشته | قالب خطی که وقتی یک resolver غیرفعال دوباره با موفقیت recheck شود، ثبت میشود. |
AUTO_DISABLE_TIMEOUT_SERVERS |
true |
true یا false |
اگر یک resolver-domain pair در پنجره زمانی تعیینشده ۱۰۰٪ timeout داشته باشد و هنوز resolver فعال دیگری وجود داشته باشد، موقتاً از مدار خارج میشود. |
AUTO_DISABLE_TIMEOUT_WINDOW_SECONDS |
120 |
عدد اعشاری/صحیح (ثانیه) | پنجره لغزان بررسی سلامت رزولورها برای timeoutهای زمان اجرا. |
AUTO_DISABLE_TIMEOUT_MIN_OBSERVATIONS |
3 |
عدد صحیح مثبت | حداقل تعداد نمونه لازم از timeout/success تا کلاینت مجاز به disable کردن یک resolver-domain شود. |
AUTO_DISABLE_CHECK_INTERVAL_SECONDS |
1.0 |
عدد اعشاری (ثانیه) | فاصله زمانی worker بررسی سلامت رزولورها. |
RECHECK_INACTIVE_SERVERS_ENABLED |
true |
true یا false |
اگر فعال باشد، رزولورهای غیرفعالشده یا ردشده در تست MTU در پسزمینه دوباره بررسی میشوند. |
RECHECK_INACTIVE_INTERVAL_SECONDS |
300 |
عدد اعشاری/صحیح (ثانیه) | فاصله بین دو چرخه کامل recheck رزولورهای غیرفعال. |
RECHECK_SERVER_INTERVAL_SECONDS |
3.0 |
عدد اعشاری (ثانیه) | فاصله بین تست دو resolver-domain pair در یک چرخه recheck. |
RECHECK_BATCH_SIZE |
5 |
عدد صحیح مثبت | حداکثر تعداد resolver-domain pair غیرفعال که در هر چرخه recheck تست میشوند. |
MAX_CONNECTION_ATTEMPTS |
10 |
عدد صحیح مثبت | تعداد تلاش برای ساخت session اولیه. در شبکههای بسیار بد اگر نشست ساخته نمیشود، این مقدار را میتوان بالاتر برد. |
ARQ_WINDOW_SIZE |
1000 |
عدد صحیح مثبت | اندازه پنجره data-plane ARQ. هرچه بیشتر باشد داده بیشتری میتواند همزمان در پرواز باشد ولی RAM بیشتری مصرف میشود. |
ARQ_INITIAL_RTO |
0.5 |
عدد اعشاری (ثانیه) | timeout اولیه بازفرست برای دادهها در ARQ. |
ARQ_MAX_RTO |
3.0 |
عدد اعشاری (ثانیه) | سقف backoff بازفرست برای دادهها در ARQ. |
ARQ_CONTROL_INITIAL_RTO |
0.5 |
عدد اعشاری (ثانیه) | timeout اولیه بازفرست برای control packetهای قابلاعتماد مثل SYN/FIN/RST و پیامهای control مربوط به SOCKS. |
ARQ_CONTROL_MAX_RTO |
3.0 |
عدد اعشاری (ثانیه) | سقف backoff برای control plane. |
ARQ_CONTROL_MAX_RETRIES |
80 |
عدد صحیح مثبت | حداکثر retry برای control packetهای قابلاعتماد قبل از abort شدن مسیر stream/session. |
NUM_RX_WORKERS |
2 |
عدد صحیح مثبت | تعداد workerهای دریافت و parse پاسخهای ورودی. |
NUM_DNS_WORKERS |
2 |
عدد صحیح مثبت | تعداد workerهای ارسال queryهای DNS. |
CPU_WORKER_THREADS |
0 |
-1، 0، عدد صحیح مثبت |
اندازه thread pool برای parse/codec/compression. 0 یعنی تشخیص خودکار بر اساس تعداد واقعی هستهها، -1 یعنی pool خاموش. |
RX_SEMAPHORE_LIMIT |
256 |
عدد صحیح مثبت | سقف تعداد پردازشهای RX همزمان. بالا بردن آن backpressure را کمتر و مصرف RAM را بیشتر میکند. |
MAX_CLOSED_STREAM_RECORDS |
2000 |
عدد صحیح مثبت | سقف رکورد streamهای بستهشده برای جلوگیری از پردازش close تکراری و raceهای cleanup دیررس. |
SOCKET_BUFFER_SIZE |
8388608 |
عدد صحیح (بایت) | اندازه بافر UDP socket سمت کلاینت. برای burst و packet loss بالا مفید است ولی RAM بیشتری میخواهد. |
LOG_LEVEL |
"INFO" |
"DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL" |
سطح جزئیات لاگ کلاینت. |
CONFIG_VERSION |
5.0 |
عدد | نسخه ساختار کانفیگ برای چک سازگاری با کد فعلی. |
جدول زیر با فایل server_config.toml.simple و رفتار فعلی server.py هماهنگ است:
| پارامتر | مقدار پیشفرض | مقادیر قابل قبول | توضیحات |
|---|---|---|---|
UDP_HOST |
"0.0.0.0" |
IP معتبر | آدرسی که سرور روی آن برای دریافت queryهای DNS گوش میدهد. |
UDP_PORT |
53 |
پورت معتبر | پورت DNS سرور. برای استفاده واقعی معمولاً باید ۵۳ باشد. |
DOMAIN |
["v.domain.com"] |
لیست رشته | دامنههایی که این سرور برای آنها authoritative است. باید با DOMAINS کلاینت و رکوردهای NS یکی باشد. |
PROTOCOL_TYPE |
"SOCKS5" |
"SOCKS5", "TCP" |
نوع forwarding سمت سرور. SOCKS5 مسیر اصلی و بهینه است، TCP برای تونل خام TCP استفاده میشود. باید با کلاینت یکسان باشد. |
USE_EXTERNAL_SOCKS5 |
false |
true یا false |
اگر false باشد سرور مستقیماً به مقصد وصل میشود. اگر true باشد سرور به یک SOCKS5 upstream خارجی روی FORWARD_IP:FORWARD_PORT chain میشود. |
FORWARD_IP |
"127.0.0.1" |
IP معتبر | آدرس upstream خارجی در حالت USE_EXTERNAL_SOCKS5=true یا مقصد forward در حالت TCP. |
FORWARD_PORT |
1080 |
پورت معتبر | پورت upstream خارجی یا مقصد forward. |
SOCKS5_AUTH |
false |
true یا false |
اگر روشن باشد، سرور برای SOCKS5 خارجی upstream از نام کاربری و رمز عبور استفاده میکند. |
SOCKS5_USER |
"admin" |
رشته | نام کاربری SOCKS5 خارجی. |
SOCKS5_PASS |
"123456" |
رشته | رمز عبور SOCKS5 خارجی. |
SOCKS_HANDSHAKE_TIMEOUT |
180.0 |
عدد اعشاری (ثانیه) | حداکثر زمان فعالسازی streamهای در حال connect یا handshake. اگر upstream یا resolverها کند هستند، این مقدار زودتر از موعد stream را kill نکند. |
MAX_CONCURRENT_SOCKS_CONNECTS |
16 |
عدد صحیح مثبت | سقف streamهایی که همزمان در فاز CONNECTING یا SOCKS_CONNECTING هستند. streamهای از قبل متصل را محدود نمیکند؛ فقط burst ساخت اتصال جدید را کنترل میکند. |
INVALID_COOKIE_ERROR_THRESHOLD |
10 |
عدد صحیح مثبت | اگر برای یک (session_id, expected_cookie, packet_cookie) در پنجره زمانی تعیینشده این تعداد mismatch ثبت شود، سرور ERROR_DROP میفرستد تا کلاینت session را restart کند. |
INVALID_COOKIE_WINDOW_SECONDS |
2.0 |
عدد اعشاری (ثانیه) | پنجره لغزان برای شمارش خطاهای invalid cookie. |
DATA_ENCRYPTION_METHOD |
1 |
0 تا 5 |
الگوریتم رمزنگاری payload. باید دقیقاً با کلاینت یکی باشد. |
SUPPORTED_UPLOAD_COMPRESSION_TYPES |
[0, 1, 2, 3] |
لیست اعداد 0..3 |
الگوریتمهای فشردهسازی مجاز برای دادهای که کلاینت به سرور میفرستد. مقادیر نامعتبر حذف میشوند و 0 همیشه fallback معتبر است. |
SUPPORTED_DOWNLOAD_COMPRESSION_TYPES |
[0, 1, 2, 3] |
لیست اعداد 0..3 |
الگوریتمهای فشردهسازی مجاز برای دادهای که سرور به کلاینت میفرستد. |
ARQ_WINDOW_SIZE |
1000 |
عدد صحیح مثبت | اندازه پنجره ARQ سمت سرور برای data-plane. |
ARQ_INITIAL_RTO |
0.5 |
عدد اعشاری (ثانیه) | timeout اولیه بازفرست برای دادهها در ARQ سمت سرور. |
ARQ_MAX_RTO |
3.0 |
عدد اعشاری (ثانیه) | سقف backoff بازفرست دادهها. |
ARQ_CONTROL_INITIAL_RTO |
0.5 |
عدد اعشاری (ثانیه) | timeout اولیه بازفرست برای control packetهای قابلاعتماد سمت سرور مثل SYN/FIN/RST و controlهای SOCKS. |
ARQ_CONTROL_MAX_RTO |
3.0 |
عدد اعشاری (ثانیه) | سقف backoff برای control plane. |
ARQ_CONTROL_MAX_RETRIES |
80 |
عدد صحیح مثبت | حداکثر retry برای control packetها قبل از abort شدن مسیر. |
SESSION_TIMEOUT |
300 |
عدد صحیح (ثانیه) | اگر یک session این مدت بیکار بماند، منقضی میشود و منابعش آزاد میشود. |
SESSION_CLEANUP_INTERVAL |
30 |
عدد صحیح (ثانیه) | فاصله loop پاکسازی sessionهای منقضی. |
MAX_SESSIONS |
255 |
عدد صحیح مثبت تا 255 |
سقف sessionهای فعال. محدودیت سخت پروتکل همین ۲۵۵ است. |
MAX_CONCURRENT_REQUESTS |
500 |
عدد صحیح مثبت | اندازه صف bounded درخواستهای DNS که منتظر workerها هستند. این مقدار دیگر «task بینهایت» نیست و مستقیماً روی فشار RAM و backpressure اثر دارد. |
DNS_REQUEST_WORKERS |
4 |
عدد صحیح مثبت | تعداد workerهای ثابت پردازش درخواست DNS. |
CPU_WORKER_THREADS |
0 |
-1، 0، عدد صحیح مثبت |
اندازه thread pool برای parse/codec/compression در سرور. 0 یعنی auto بر اساس تعداد واقعی هستهها. |
MAX_PACKETS_PER_BATCH |
1000 |
عدد صحیح مثبت | سقف user-level برای بستهبندی control blockهای کوچک در پاسخهای سرور. مقدار واقعی در زمان اجرا با MTU دانلود مذاکرهشده هم محدود میشود. |
SOCKET_BUFFER_SIZE |
8388608 |
عدد صحیح (بایت) | بافر UDP socket سمت سرور. در burst بالا و packet loss کمک میکند. |
LOG_LEVEL |
"INFO" |
"DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL" |
سطح جزئیات لاگ سرور. |
CONFIG_VERSION |
5.0 |
عدد | نسخه ساختار کانفیگ برای چک سازگاری با کد فعلی. |
کلمه MTU مخفف Maximum Transmission Unit است و به حداکثر اندازهٔ یک بستهٔ داده (پکت) اشاره دارد که میتواند در یک درخواست یا پاسخ شبکه منتقل شود. در شبکههای فیلترشده یا پر اختلال، اگر بستههای داده خیلی بزرگ باشند، احتمال از بین رفتن (Drop) آنها بهشدت بالا میرود. بنابراین، کاهش مقدار MTU میتواند پایداری ارتباط را تضمین کند. اما از طرفی، اگر MTU را خیلی پایین تنظیم کنید، اطلاعات به تکههای بسیار کوچکی تقسیم میشوند که باعث افزایش شدید سربار (Overhead) و در نتیجه افت سرعت خواهد شد.
در پروتکل DNS معمولاً محدودیتهای شدیدی وجود دارد:
- آپلود (DNS Query): محدودیت بسیار شدیدتر است. میانگین MTU مفید برای آپلود، بسته به طول نام دامنهٔ شما، معمولاً بین
۵۰تا۲۰۰بایت است. - دانلود (DNS Response): فضای بیشتری دارد. در حالت عادی بین
۱۰۰تا۴۵۰بایت و اگر ریزالور (Resolver) شما از EDNS پشتیبانی کند، میتواند بین۴۵۰تا۴۰۰۰بایت باشد.
در این پروژه، کلاینت بهصورت کاملاً هوشمند و با استفاده از الگوریتم جستجوی باینری (Binary Search)، حداکثر MTU قابل پشتیبانی برای تکتک ریزالورها را تست میکند و در نهایت، کمترین مقدار مشترک (Lowest Common Denominator) را برای کل ارتباط در نظر میگیرد تا ترافیک شما روی هیچ ریزالوری با خطا مواجه نشود.
تست شدن تکتک ریزالورها برای پیدا کردن MTU زمانبر است. با انجام مراحل زیر میتوانید بهترین مقادیر را پیدا کرده و سرعت اجرای برنامه را در اجراهای بعدی به شدت کاهش دهید:
پس از راهاندازی سرور، کلاینت را با تنظیمات پیشفرض اجرا کنید. در همان ثانیههای اول اجرا، کلاینت بر اساس طول دامنه و سربار رمزنگاری، حداکثر MTU تئوری را محاسبه کرده و پیامی مشابه زیر نمایش میدهد:
Domain: v.example.com -> MIN and MAX_UPLOAD_MTU = 133 | MIN and MAX_DOWNLOAD_MTU = 129
به محض دیدن این پیام، برنامه را ببندید! این اعداد سقف تئوری شما هستند.
فایل client_config.toml را باز کرده و مقدار MAX_UPLOAD_MTU را دقیقاً روی عدد پیشنهادی (مثلاً 133) تنظیم کنید. این کار باعث میشود برنامه در اجراهای بعدی، مقادیر بیفایده و بزرگتر از این عدد را تست نکند.
حالا تمام ریزالورهای DNS مورد نظر خود را در فایل کانفیگ وارد کنید و اجازه دهید کلاینت یکبار بهطور کامل اجرا شود. این فرآیند ممکن است کمی طول بکشد؛ صبور باشید تا سیستم تمام ریزالورها را تست کند. پس از پایان تست، جدولی از تمام ریزالورهای موفق و مقدار MTU آپلود و دانلودِ اختصاصیِ هرکدام به شما نمایش داده میشود.
با بررسی جدول، یک میانگین منطقی پیدا کنید. فرض کنید اکثر ریزالورهای شما آپلود 133 را با موفقیت پاس کردهاند، اما چند ریزالور ضعیف فقط آپلود 50 را قبول کردهاند.
از آنجایی که سیستم همیشه کمترین MTU را برای کل شبکه در نظر میگیرد، وجود آن چند ریزالور ضعیف باعث افت سرعت کل تونل شما میشود!
برای حل این مشکل، مقدار MIN_UPLOAD_MTU را در فایل کانفیگ روی همان 133 تنظیم کنید. با این کار، کلاینت ریزالورهای ضعیف را بهطور خودکار حذف کرده و از آنها استفاده نمیکند. همین منطق را برای MIN_DOWNLOAD_MTU نیز پیاده کنید.
💡 نکته: هرچه مقدار MIN را پایینتر بیاورید، تعداد ریزالورهای متصل بیشتر میشود اما سرعت و کیفیت کلی کاهش مییابد. و هرچه MIN بالاتر باشد، کیفیت عالی میشود اما ممکن است ریزالورهای کمتری از آن پشتیبانی کنند. شما باید تعادل را پیدا کنید.
اگر میخواهید کلاینت شما در اجراهای بعدی بدون معطلی و در یک چشمبههمزدن اجرا شود و زمان خود را صرف پیدا کردن MTU نکند، تکنیک زیر را به کار ببرید:
مقادیر MIN و MAX را در فایل کانفیگ دقیقاً برابر با هم تنظیم کنید!
مثلاً اگر در تستها متوجه شدید عدد 133 برای آپلود و 129 برای دانلود روی اکثر ریزالورهای شما بهخوبی کار میکند، کانفیگ را اینگونه تغییر دهید:
MIN_UPLOAD_MTU = 133
MAX_UPLOAD_MTU = 129
MIN_DOWNLOAD_MTU = 133
MAX_DOWNLOAD_MTU = 129چه اتفاقی میافتد؟ الگوریتم جستجوی باینریِ کلاینت متوجه میشود که کف و سقف جستجو یکی است؛ بنابراین جستجو را لغو کرده و فقط یکبار همان عدد را تست میکند. اگر ریزالور جواب داد، تایید میشود و اگر جواب نداد، بلافاصله حذف میشود. این ترفند سرعت اجرای برنامه را بالا میبرد!
⚠️ شرایط فوق اضطراری: در زمان اختلالات و فیلترینگ بسیار شدید، اگر متوجه شدید ارتباط مکرراً قطع میشود، میتوانید هر دو مقدار MIN و MAX را روی اعداد بسیار پایین (مثلاً ۵۰ یا ۶۰) قفل کنید. سرعت شما در این حالت بهشدت افت خواهد کرد، اما ارتباطی پایدار و بدون قطعی خواهید داشت که از سدهای محدودکننده عبور میکند.
به طور کلی در این پروژه محاسبه MTU و تنظیم مقادیر مناسب خیلی اهمیت دارد و هم سرعت اجرا شدن برنامه و هم پایداری شما را بیشتر میکند، پس حتما این بخش را با دقت انجام دهید و بهترین مقادیر را برای شبکه خود پیدا کنید.
سرعت شما و کیفیت ارتباط شما علاوه بر استفاده از Resolver های خوب و تعداد بالای Resolver ها به تنظیم MTU مناسب هم بستگی دارد، پس حتما این بخش را با دقت انجام دهید و بهترین مقادیر را برای شبکه خود پیدا کنید. شما میتوانید با MTU های بالاتر نیز تست کنید، با توجه به شرایط ریزالورها و اینترنت شما ممکن است ارتباط بهتری بگیرید، پس تست و دستکاری MTU ها را فراموش نکنید.
از آنجایی که در حال حاضر اپلیکیشن مستقیم برای اندروید یا iOS ساخته نشده است، شما میتوانید به راحتی از طریق ۳ روش زیر، قدرت این تونل را به گوشی خود بیاورید:
این روش سادهترین راه برای زمانی است که لپتاپ یا کامپیوتر شما روشن است و میخواهید گوشی هم از همان اتصال پایدار استفاده کند.
- آمادهسازی کلاینت: در فایل
client_config.tomlروی کامپیوتر، مقدارLISTEN_IPرا از"127.0.0.1"به"0.0.0.0"تغییر دهید و برنامه را اجرا کنید. - اتصال به شبکه مشترک: مطمئن شوید گوشی و کامپیوتر هر دو به یک مودم (Wi-Fi) متصل هستند.
- پیدا کردن آیپی کامپیوتر (ویندوز):
- منوی Start را باز کرده، عبارت
cmdرا تایپ و اینتر بزنید. - در پنجره مشکی باز شده عبارت
ipconfigرا بنویسید و اینتر بزنید. - عددی که جلوی عبارت
IPv4 Addressنوشته شده را یادداشت کنید (مثلاً:192.168.1.10).
- منوی Start را باز کرده، عبارت
- تنظیم پروکسی در گوشی:
- در تلگرام: به بخش
Settings > Data and Storage > Proxy Settingsبروید. یک پروکسی SOCKS5 اضافه کنید. در بخش Server، همان آیپی کامپیوتر و در بخش Port، پورت تنظیم شده در فایل (پیشفرض1080) را وارد کنید. - در کل گوشی: اگر گوشی شما به صورت پیشفرض Socks5 را پشتیبانی نمیکند میتوانید از برنامه هایی نظیر
v2Boxیاv2rayNGو ... استفاده کنید و در آنها پروکسی Socks5 را تنظیم کنید و برای آدرس سرور، همان آیپی کامپیوتر و برای پورت، پورت تنظیم شده در فایل (پیشفرض1080) را وارد کنید.
- در تلگرام: به بخش
مناسب برای کاربرانی که سرور ایران دارند و میخواهند بدون نیاز به روشن بودن کامپیوتر شخصی، روی گوشی اینترنت آزاد داشته باشند.
- سرور خارج: نسخه Server را روی سرور خارج نصب و اجرا کنید.
- سرور ایران: نسخه Client را روی سرور ایران نصب کنید و به سرور خارج متصل شوید.
- تنظیم دسترسی: در فایل کانفیگ کلاینت (روی سرور ایران)،
LISTEN_IPرا روی0.0.0.0بگذارید. - اتصال گوشی: حالا در گوشی خود (در برنامه تلگرام یا تنظیمات پروکسی)، آدرس آیپی سرور ایران و پورت کلاینت را وارد کنید.
نکات امنیتی: روی سرور ایران حتما از یک پورت دیگه بجای 1080 استفاده کنید و حتماً برای بخش SOCKS5 در تنظیمات سرور، بخش نیاز به نام کاربری و رمز عبور را فعال کنید تا افراد غریبه نتوانند از سرور شما استفاده کنند.
اگر روی سرور ایران خود پنلهای مدیریت مثل X-UI دارید:
- کلاینت MasterDnsVPN را روی همان سرور ایران اجرا کنید تا یک پورت SOCKS5 محلی (مثلاً روی
127.0.0.1:1080) به شما بدهد. - در پنل X-UI، یک کانفیگ جدید (مثلاً VLESS) بسازید.
- بخش Outbound پنل را طوری تنظیم کنید که ترافیک خروجی را به جای اینترنت مستقیم، به پورت SOCKS5 این برنامه هدایت کند.
- لینک VLESS را در گوشی خود وارد کنید. حالا دیتای شما در ظاهر VLESS اما در باطن از تونل DNS عبور میکند.
نکات امنیتی: اگر روی همان سرور قرار است به کلاینت متصل شوید، حتما LISTEN_IP را روی 127.0.0.1 قرار دهید و یا مطمئن باشید پورت ساکس کلاینت در اینترنت در دسترس نباشد، تا از دسترسی افراد غریبه جلوگیری شود.
- دیواره آتش (Firewall): اگر گوشی به کامپیوتر وصل نمیشود، احتمالاً فایروال ویندوز جلوی دسترسی را گرفته است. باید پورت
1080را در بخشInbound Rulesفایروال ویندوز باز کنید. - امنیت: وقتی
LISTEN_IPرا روی0.0.0.0میگذارید، حتماً در فایل تنظیمات برای بخش SOCKS5 نام کاربری و رمز عبور تعریف کنید تا افراد غریبه نتوانند از سرور شما استفاده کنند.
زمانی که شبکه بهطور کامل قطع است، پکتلاس (Packet Loss) بسیار بالاست و تنها ترافیک DNS عبور میکند، تغییرات زیر را در فایل client_config.toml اعمال کنید تا ارتباط شما تضمین شود:
۱. افزایش تعداد رزولورها: تا جایی که میتوانید رزولورهای DNS عمومی و معتبر را پیدا کرده و در فایل client_resolvers.txt قرار دهید. فرمتهای پشتیبانیشده IP، IP:PORT، CIDR و CIDR:PORT هستند. استفاده از ترکیب سرورهای مختلف (مثل گوگل 8.8.8.8، کلودفلر 1.1.1.1، کوادناین 9.9.9.9 و اوپندیاناس 208.67.222.222) تنوع مسیرها را به حداکثر میرساند.
۲. افزایش تکثیر پکتها (Packet Duplication): مقدار پارامتر PACKET_DUPLICATION_COUNT را افزایش دهید. این متغیر تعیین میکند که هر قطعه از اطلاعات شما بهطور همزمان از طریق چند رزولور مختلف ارسال شود.
- مثال: اگر این مقدار را روی
5تنظیم کنید، کلاینت یک پکت را همزمان به ۵ رزولور میفرستد. حتی اگر ۴ مسیر مسدود شده یا پکت را گم کنند، پکت از طریق مسیر پنجم به سرور میرسد! سرور با استفاده از لایهٔ ARQ، پکتهای تکراری را تشخیص داده و دور میریزد تا مشکلی در ترافیک ایجاد نشود. - توصیه: در زمان قطعی شدید، مقادیر بین
3تا6تعادل خوبی ایجاد میکنند. توجه داشته باشید که تکثیر بیرویه بدون داشتن رزولورهای کافی، باعث فشار مضاعف روی همان چند رزولور و افت کیفیت میشود.
در اکثر توزیعهای لینوکس (مانند اوبونتو)، پورت 53 بهطور پیشفرض توسط سرویس systemd-resolved اشغال شده است. اگر هنگام اجرای سرور با خطای تداخل پورت مواجه شدید، باید شنوندهٔ پیشفرض (Stub Listener) را غیرفعال کنید. دستورات زیر را بهترتیب در ترمینال سرور وارد کنید:
۱. فایل تنظیمات را برای ویرایش باز کنید:
sudo nano /etc/systemd/resolved.conf۲. عبارت #DNSStubListener=yes را پیدا کرده، علامت # را حذف کنید و مقدار آن را به no تغییر دهید (به این شکل: DNSStubListener=no). سپس فایل را ذخیره کنید (در نانو: Ctrl+O سپس Enter و Ctrl+X).
۳. سرویس را ریاستارت کنید تا تغییرات اعمال شود:
sudo systemctl restart systemd-resolved۴. (اختیاری) در برخی سیستمها برای جلوگیری از اختلال در دسترسی اینترنت خود سرور، لینک نمادین resolv.conf را بهروز کنید:
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
⚠️ اخطار مهم: شما نمیتوانید روی یک سرور، همزمان چند پروژهٔ تونلینگ DNS (مثل DNSTT، SlipStream و MasterDnsVPN) را اجرا کنید! پورت ۵۳ فقط میتواند در اختیار یک برنامه باشد. اجرای همزمان آنها باعث اختلال در عملکرد تمامی پروژهها خواهد شد.
پروژه MasterDnsVPN با ترکیب یک سیستم مدیریت نشست (Session Multiplexing) و یک لایهٔ اطمینان اختصاصی (ARQ) بر بستر پروتکل UDP/DNS، توانسته محدودیتهای تونلهای معمول را دور بزند.
graph TD
subgraph Client_Side ["🖥️ سیستم کاربر (Client)"]
App["📱 برنامهها (مرورگر، تلگرام و...)"]
Client["🐍 کلاینت MasterDnsVPN<br>(پروکسی SOCKS5/TCP)"]
end
subgraph DNS_Network ["🌐 شبکه عمومی DNS"]
R1["📡 رزولور ۱ (مثلاً 8.8.8.8)"]
R2["📡 رزولور ۲ (مثلاً 1.1.1.1)"]
RN["📡 ... سایر رزولورها"]
end
subgraph Server_Side ["🖥️ سرور خارج از کشور (Server)"]
Server["🐍 سرور MasterDnsVPN<br>(دریافتکننده روی پورت ۵۳)"]
Target["🌐 اینترنت آزاد<br>(یا پروکسی خارجی)"]
end
App -->|"ترافیک TCP"| Client
Client -->|"کوئری DNS TXT<br>(رمزنگاری + قطعهبندی)"| R1
Client -->|"کوئری DNS TXT<br>(تکثیر پکت)"| R2
Client -->|"کوئری DNS TXT<br>(توزیع بار)"| RN
R1 -->|"فوروارد به NS سرور"| Server
R2 -->|"فوروارد به NS سرور"| Server
RN -->|"فوروارد به NS سرور"| Server
Server -->|"بازسازی پکتها (ARQ)<br>ارسال به مقصد"| Target
Target -->|"پاسخ مقصد"| Server
Server -->|"پاسخ DNS TXT<br>(رمزنگاریشده)"| R1
R1 -->|"پاسخ DNS"| Client
Client -->|"تحویل دیتای سالم"| App
sequenceDiagram
participant App as 📱 برنامه کاربر
participant Client as 🐍 کلاینت (لایه ARQ)
participant DNS as 📡 رزولورهای DNS
participant Server as 🖥️ سرور (لایه ARQ)
participant Target as 🌐 مقصد نهایی
App->>Client: ارسال داده TCP (پیوسته)
Note over Client: ۱. تکهتکه کردن دیتا بر اساس MTU<br>۲. رمزنگاری و افزودن هدر اختصاصی<br>۳. اختصاص شماره ترتیب (Sequence Number)
Client->>DNS: ارسال همزمان کوئری به چند رزولور (Duplication)
DNS->>Server: فوروارد درخواستها (چون سرور ما NS دامنه است)
Note over Server: ۱. لایه ARQ پکتهای تکراری را حذف میکند<br>۲. پکتهای نامنظم مرتب میشوند<br>۳. درخواست رمزگشایی میشود
Server->>Target: ارتباط SOCKS5 / TCP با مقصد
Target-->>Server: دریافت دیتای پاسخ
Note over Server: تکهتکه کردن، رمزنگاری و قرار دادن در صف ارسال
Server-->>DNS: ارسال پاسخ در قالب رکوردهای TXT (همراه با ACK)
DNS-->>Client: تحویل پاسخ DNS به کلاینت
Note over Client: مرتبسازی دادهها، تایید دریافت و بازسازی TCP
Client-->>App: تحویل دادهها به برنامه کاربر
| مفهوم (Concept) | توضیح کارکرد در سیستم |
|---|---|
| نشست (Session) | یک اتصال کلی بین کلاینت و سرور. هر سرور میتواند همزمان ۲۵۵ نشست مستقل را مدیریت کند. |
| استریم (Stream) | هر اتصال TCP (مثلاً باز کردن یک سایت جدید) یک استریم محسوب شده که روی یک Session واحد مولتیپلکس (Multiplex) میشود. |
| پروتکل ARQ | جایگزین سبکتری برای QUIC. این لایه با استفاده از شمارهترتیب (Sequence Number) و تاییدیه (ACK)، بازارسال پکتهای گمشده روی بستر ناپایدار UDP/DNS را تضمین میکند. |
| توزیع بار (Balancing) | کلاینت با استراتژیهای تصادفی، نوبتگردشی (Round-Robin) یا «کمترین میزان تلفات (Least Loss)» بار ترافیک را بین رزولورها پخش میکند. |
| ادغام تاییدیهها (Packed Control Blocks) | برای جلوگیری از هدررفت پهنای باند، سرور تاییدیههای رسیدن پکتها (ACK) را جمعآوری کرده و چندین ACK را در یک بستهٔ کوچک جاسازی میکند. |
- ⚡ اتصال مستقیم SOCKS5 (Fast-Connect): در صورتی که در سرور
USE_EXTERNAL_SOCKS5را رویfalseتنظیم کنید، سرور پایتون بهطور مستقیم و بدون نیاز به برنامههای واسط (مانند Dante یا Xray) ترافیک کلاینت را به مقصد نهایی متصل میکند که باعث کاهش شدید تاخیر (Latency) میشود. - 🔄 پولینگ تطبیقی (Adaptive Polling): کلاینت دارای سازوکار عقبنشینی هوشمند (Ping Manager) است. زمانی که دیتایی برای انتقال وجود نداشته باشد، کلاینت سرعت ارسال درخواستهای نگهدارنده (Keep-Alive) را کاهش میدهد تا بار اضافی از روی DNS برداشته شود.
- 🔒 کتابخانه Cryptography: برای استفاده از روشهای رمزنگاری پیشرفته (AES-GCM و ChaCha20) نصب این کتابخانه ضروری است. اما برای دستگاههایی مثل روترها که منابع محدودی دارند، الگوریتم بهینه و اختصاصی
XOR(روش شماره 1) درون خود برنامه پیادهسازی شده و بالاترین سرعت را ارائه میدهد.
ما از تمام مشارکتها استقبال میکنیم! لطفاً در صورت داشتن ایده، رفع باگ یا بهبود عملکرد، پروژه را Fork کرده و تغییرات خود را از طریق Pull Request برای ما ارسال کنید. تمام گزارشهای مشکل (Bug Reports) را نیز منحصراً در بخش Issues مطرح نمایید.
این پروژه تحت مجوز MIT منتشر شده است. استفاده، تغییر و توزیع آن با رعایت شرایط مجوز آزاد است. برای جزئیات کامل به فایل LICENSE مراجعه کنید.
توسعهدادهشده با ❤️ توسط: MasterkinG32