راهنمای کامل نصب و راهاندازی برنامهٔ اندروید: نصب، تنظیمات اولیه، رفع اشکال و محدودیتهای شناختهشده.
- معرفی کلی
- پیشنیازها
- ۱. نصب APK
- ۲. ساخت Apps Script
- ۳. وارد کردن تنظیمات در برنامه
- ۴. تست SNI
- ۵. نصب گواهی MITM
- ۶. اجرای تونل
- راهنمای سریع رابط کاربری
- محدودیتهای شناختهشده
- رفع اشکال
- حذف برنامه
برنامهٔ اندروید همان کرت Rust پشت نسخهٔ دسکتاپ است که در قالب یک رابط Compose بستهبندی شده و از طریق VpnService و tun2proxy تمام ترافیک TUN دستگاه را به پروکسی میسپارد. همهٔ برنامههای روی گوشی بهطور خودکار از پروکسی رد میشوند — بدون نیاز به تنظیم per-app.
هر برنامه روی دستگاه
│
▼
VpnService TUN ──► tun2proxy (داخل فرایند)
│
▼
SOCKS5 محلی ──► dispatcher در mhrv-rs
│
┌─────────────────┤
▼ ▼
تونل sni-rewrite رلهٔ Apps Script
(دامنههای گوگل (هر چیز دیگر، از
مستقیم به google_ip) طریق /exec شما)
زمان راهاندازی: حدود ۱۰ دقیقه اگر Apps Script را قبلاً deploy کردهاید، ۱۵ دقیقه اگر از صفر شروع میکنید.
| نسخهٔ اندروید | ۷.۰ (API 24) یا بالاتر |
| معماری دستگاه | هر کدام. APK جهانی است: arm64-v8a، armeabi-v7a، x86_64، x86 |
| حساب گوگل | بله — Apps Script را زیر آن منتشر میکنید. یک Gmail یکبارمصرف کافی است |
| قفل صفحه | PIN، الگو، رمز، یا بیومتریک + fallback. الزام اندروید برای نصب گواهی کاربری است. بعد از نصب میتوانید برش دارید؛ گواهی معتبر باقی میماند |
| مصرف داده | حدود ۵ مگابایت برای APK، سپس حدود ۲ مگابایت سربار به ازای هر گیگابایت مرور وب (base64 و بستهبندی JSON) |
نکتهٔ دامنهٔ کار.
mhrv-rsاز طریقApps Scriptرله میکند. همین است که ابزار را ارزان و در برابرDPIمقاوم میسازد، ولی همین هم محدودیتهای بخش پایین را تحمیل میکند. اگر میخواهید با یکVPNواقعی (WireGuard/Tailscale/OpenVPN) مقایسه کنید، اول آن بخش را بخوانید.
۱. در مرورگر گوشی به https://github.com/therealaleph/MasterHttpRelayVPN-RUST/releases/latest بروید.
۲. فایل mhrv-rs-android-universal-v*.apk را دانلود کنید.
۳. روی نوتیفیکیشن دانلود ضربه بزنید تا installer باز شود.
۴. وقتی اندروید پرسید «Allow this source to install apps?»:
- روی Settings بزنید
- Allow from this source را روشن کنید
- ← Back → Install ۵. بعد از اتمام نصب روی Open بزنید.
اگر اندروید با پیام «App not installed» رد کرد: نسخهٔ قدیمی با کلید امضای متفاوتی نصب است.
Settings → Apps → mhrv-rs → Uninstallبزنید و دوباره امتحان کنید. (از v1.0.2 به بعد این یکباره است — بهروزرسانیها با کلید ثابت امضا میشوند.)
اگر قبلاً یک /exec URL فعال دارید، این مرحله را رد کنید.
این مرحله را روی لپتاپ انجام دهید — کار با مرورگر روی گوشی دردناک است.
۱. به https://script.google.com بروید → New project.
۲. محتوای کامل assets/apps_script/Code.gs از همین ریپو را کپی کنید.
۳. در ویرایشگر Script، کد پیشفرض function myFunction() {} را انتخاب و جایگزین کنید.
۴. خط زیر را نزدیک بالا پیدا کنید:
const AUTH_KEY = "CHANGE_ME_TO_A_STRONG_SECRET";مقدار placeholder را با یک رشتهٔ تصادفی قوی (حداقل ۲۰ کاراکتر حروف + رقم) جایگزین کنید. این مقدار را جایی ذخیره کنید — در برنامه هم همین را میخواهید.
۵. ذخیره کنید (⌘S / Ctrl+S). نام پروژه را چیزی مثل mhrv-relay بگذارید.
۶. Deploy → New deployment.
۷. روی آیکون چرخدنده بزنید → Web app. این فیلدها را پر کنید:
| فیلد | مقدار |
|---|---|
| Description | mhrv-relay v1 (یا هر چیزی) |
| Execute as | Me |
| Who has access | Anyone |
۸. Deploy را بزنید. بار اول گوگل دسترسی میخواهد:
- Authorize access → حسابتان را انتخاب
- در صفحهٔ «Google hasn't verified this app» → Advanced → Go to <project name> (unsafe) → Allow
۹. Web app URL را کپی کنید. به شکل
https://script.google.com/macros/s/AKfyc.../execاست.
اسکریپت دقیقاً چه میکند؟
درخواست POST { method, url, headers, body_base64 } را از پروکسی ما دریافت میکند، داخل دیتاسنتر گوگل UrlFetchApp.fetch(url, ...) را اجرا میکند، و { status, headers, body_base64 } را برمیگرداند. عبور از DPI به این دلیل کار میکند که ما به script.google.com با SNI متفاوت از Host هدر متصل میشویم — ISP میبیند www.google.com ولی Google edge بر اساس Host هدر داخل TLS مسیر را تعیین میکند.
برگردید به گوشی:
| فیلد | مقدار |
|---|---|
| Deployment URL(s) or script ID(s) | همان /exec URL که کپی کردید. میتوانید چند تا بگذارید — یکی در هر خط — تا round-robin چرخانده شوند (وقتی به سقف روزانهٔ 20k هر اسکریپت خوردید مفید است) |
| auth_key | دقیقاً همان رشتهای که در AUTH_KEY داخل Code.gs گذاشتید |
| google_ip | پیشفرض را نگه دارید. مرحلهٔ بعد خودکار پر میکند |
| front_domain | www.google.com را نگه دارید |
برای بستن کیبورد، جایی بیرون فیلدها ضربه بزنید.
قبل از شروع تونل، ببینید مسیر خروجی کار میکند. بخش SNI pool + tester را باز کنید و Test all بزنید.
| نتیجه | معنا | کار بعدی |
|---|---|---|
| ✅ تیک سبز + زمان | google_ip در دسترس است و SNI را قبول میکند |
ادامه بدهید |
❌ connect timeout روی همه |
google_ip تنظیمشده در دسترس نیست |
زیر بخش Network روی Auto-detect google_ip بزنید، بعد دوباره Test all |
❌ connect timeout روی بعضی |
آن SNIهای خاص در شبکهٔ شما DPI-filtered هستند |
تیک آنها را بردارید؛ pool فقط از موارد تیکدار استفاده میکند |
❌ dns: ... |
دستگاه اصلاً www.google.com را resolve نمیکند |
Wi-Fi / Airplane mode را بررسی کنید |
اگر Auto-detect هم زدید و باز همه fail شد، شبکهٔ شما کل Google edge را مسدود کرده — mhrv-rs از پسش بر نمیآید.
پروکسی TLS را محلی باز میکند (قبل از ارسال به Apps Script دوباره رمزگذاری میشود)، پس گوشی باید به یک گواهی که در اولین اجرا ساختهایم اعتماد کند.
۱. در برنامه روی Install MITM certificate بزنید.
۲. دیالوگ تأیید fingerprint گواهی را نشان میدهد. Install را بزنید.
۳. برنامه:
- یک نسخهٔ
PEMدر مسیرDownloads/mhrv-ca.crtذخیره میکند - برنامهٔ Settings اندروید را باز میکند
۴. اگر قفل صفحه ندارید — اندروید از شما میخواهد الان یکی تنظیم کنید. مجبورید. این الزام
OSبرای نصب هر گواهی کاربری است. بعد از نصب میتوانید قفل را بردارید؛ گواهی معتبر میماند. ۵. درSettings، روی نوار جستوجو بالا بزنید وCA certificateرا تایپ کنید. نتیجهای که CA certificate نوشته را باز کنید (یا روی بعضیOEMها «Install CA certificate»).
حواستان باشد: «VPN & app user certificate» یا «Wi-Fi certificate» را نزنید — دستهٔ اشتباه، کار نمیکند.
دلیل اینکه میگوییم search کنید: مسیر منو روی Pixel / Samsung / Xiaomi / … کاملاً متفاوت است، ولی همهشان توی نتیجهٔ جستوجوی CA certificate پیدایش میکنند.
۶. اندروید هشدار میدهد «Your network may be monitored by an unknown third party». ما هستیم. Install anyway بزنید.
۷. Downloads را انتخاب کنید → روی mhrv-ca.crt بزنید. یک اسم دوستانه بدهید (یا پیشفرض را قبول کنید). OK.
۸. به برنامهٔ mhrv-rs برگردید. یک snackbar پایین تأیید میکند Certificate installed ✓ — برنامه با مقایسهٔ fingerprint در AndroidCAStore مطمئن میشود نصب شده.
اگر گفت «not yet installed»، مرحلهٔ ۵ را دوباره انجام دهید.
چرا برنامه گواهی را مستقیماً نصب نمیکند؟
اندروید ۱۱ مسیر inline با KeyChain.createInstallIntent را حذف کرد. قبلاً این intent یک picker داخل خود برنامه باز میکرد. روی اندروید فعلی یک دیالوگ بنبست با فقط دکمهٔ Close نشان میدهد — گوگل میخواهد نصب CA خودآگاه باشد. ما کار سخت (ذخیرهٔ فایل، باز کردن Settings، تأیید پس از نصب) را انجام میدهیم، ولی خود ناوبری در Settings اجباری است.
۱. Start را بزنید.
۲. اندروید دیالوگ مجوز VPN را نشان میدهد: «mhrv-rs wants to set up a VPN connection...». OK.
۳. آیکون کلید در status bar ظاهر میشود. این یعنی VPN فعال است.
۴. Chrome را باز کنید. برای تست فشار سنگین: https://www.cloudflare.com، https://yahoo.com، https://discord.com — همه باید عادی load شوند.
بخش Live logs را باز کنید تا ترافیک را زنده ببینید:
| خط لاگ | معنا |
|---|---|
SOCKS5 CONNECT -> <host>:443 |
مرورگر یک جریان TCP باز کرد؛ TUN گرفت |
dispatch <host>:443 -> MITM + Apps Script relay |
تصمیم مسیریابی |
MITM TLS -> <host>:443 (sni=<host>) |
گواهی leaf ما را مرورگر پذیرفت |
relay GET https://<host>/... |
به Apps Script فرستاده شد |
preflight 204 <url> |
CORS preflight که خودمان جواب دادیم (عادی، نگران نباشید) |
| کنترل | محل | توضیح |
|---|---|---|
| Deployment URL(s) or script ID(s) | بخش Apps Script relay |
یکی در هر خط؛ round-robin |
| auth_key | بخش Apps Script relay |
باید دقیقاً با AUTH_KEY در Code.gs یکی باشد |
| google_ip / front_domain | بخش Network |
دکمهٔ Auto-detect با DNS پر میکند |
| Auto-detect google_ip | زیر ردیف Network |
www.google.com را دوباره resolve میکند + اگر front_domain به یک IP تبدیل شده بود ترمیم میکند |
| SNI pool + tester | باز/بسته میشود | تیک برای rotation؛ Test برای هر ردیف + Test all |
| Advanced | باز/بسته میشود | verify_ssl، log_level، parallel_relay، upstream_socks5 |
| Start / Stop | ردیف پایین | ۲ ثانیه debounce بین tapها |
| Install MITM certificate | زیر Start/Stop |
ذخیرهٔ PEM → باز کردن Settings → جستوجوی CA certificate |
| Live logs | باز/بسته میشود (زیر دکمهٔ Install) |
هر ۵۰۰ میلیثانیه ring buffer پروکسی خوانده میشود |
| v1.0.x (badge نسخه) | بالا سمت راست | ضربه بزنید تا GitHub را برای نسخهٔ جدیدتر چک کند |
قبل از گزارش باگ، این را بخوانید — بیشتر گزارشهای «کار نمیکند» یکی از اینهاست.
روی سایتهای تحت محافظت Cloudflare که هر درخواست را challenge میکنند، شما Turnstile را حل میکنید، به صفحه میرسید، بعد روی click بعدی دوباره challenge میشوید. این ذاتی مدل Apps Script است:
| عامل | مرورگر عادی | رلهٔ Apps Script |
|---|---|---|
IP خروج |
ثابت (ISP شما) | بین pool دیتاسنترهای گوگل میچرخد |
User-Agent |
مال Chrome |
ثابت Google-Apps-Script (گوگل قفل کرده؛ قابل تغییر نیست) |
TLS JA3/JA4 |
مال Chrome |
مال دیتاسنتر گوگل |
کوکی cf_clearance کلادفلر به سهتایی (IP, UA, JA3) چسبیده که challenge با آن حل شده. درخواست بعدی با IP دیگر → challenge دوباره.
سایتهایی که فقط بارگذاری اول را gate میکنند (اکثر مشتریان Bot Fight Mode کلادفلر) بعد از یک حل بیمشکل کار میکنند. سایتهایی که هر درخواست challenge میزنند (صرافیهای رمزارز، بزرگسال، بعضی فورومها) ذاتاً با این معماری نمیشوند — برایشان از تونل دیگری استفاده کنید.
SOCKS5 listener فقط CONNECT را میفهمد، نه UDP ASSOCIATE. Chrome اول HTTP/3 را امتحان میکند و به HTTP/2 over TCP برمیگردد — که از پروکسی رد میشود. اثر: اولین اتصال کمی کندتر، بقیه چیزها عادی.
TUN فقط IPv4 (addRoute 0.0.0.0/0) را روت میکند. IPv6 از رابط معمولی میرود، شامل WebRTC. اگر هدفتان حریم خصوصی است (نه فقط عبور از DPI)، روی Wi-Fi کلاً IPv6 را خاموش کنید.
هر /exec یک سقف اجرای روزانه دارد (۲۰ هزار در روز برای حساب مصرفکننده، بیشتر برای Workspace). سایتهای ویدیو / infinite scroll سنگین آن را میخورند. راهحل: ۲-۳ اسکریپت deploy کنید، همهٔ /exec URLها را در فیلد برنامه بچسبانید، یکی در هر خط — round-robin میکند.
بهطور پیشفرض، برنامههای اندروید از اعتماد به CAهای کاربری opt-out میکنند (پیشفرض Network Security Config از Android 7 به بعد). برنامههای بانکی، Netflix، Spotify، اکثر پیامرسانها — همه از mhrv-rs با خطای cert رد میشوند. TUN ترافیکشان را به ما میفرستد؛ آنها leaf ما را رد میکنند. فقط برنامههایی که صریحاً opt-in کردهاند (مرورگرها، curl، بعضی ابزارهای توسعهدهنده) کار میکنند. این محدودیت کلی MITM proxy است.
| علامت | احتمال علت | راهحل |
|---|---|---|
504 Relay timeout در Chrome |
دیپلوی Apps Script جواب نمیدهد |
دوباره /exec URL را چک کنید (باید /exec ختم شود، نه /dev). در Live logs دنبال Relay timeout در مقابل connect: بگردید |
NET::ERR_CERT_AUTHORITY_INVALID |
گواهی MITM نصب نشده یا پیدا نشد |
مرحلهٔ ۵ را دوباره انجام دهید. مطمئن شوید CA certificate را در Settings زدید، نه VPN یا Wi-Fi |
NET::ERR_CERT_COMMON_NAME_INVALID روی سایتهای Cloudflare |
باگ قبل از v1.0.0 | به v1.0.0 یا بالاتر بهروزرسانی کنید |
قسمتهای JS سایت load نمیشوند |
رد OPTIONS قبل از v1.0.0 |
به v1.0.0+ بهروزرسانی کنید. اگر باز هم بود: Live logs → Relay failed پیدا کنید، گزارش دهید |
همه SNIها در tester تایماوت |
google_ip قدیمی است (گوگل A record را عوض کرده) |
Auto-detect google_ip را بزنید |
SNI tester فقط بعضی ردیفها قرمز |
آن SNIها در شبکهٔ شما DPI-filtered هستند |
تیک ردیفهای خراب را بردارید |
برنامه با ضربه به Stop بسته میشود |
باگ race نسخهٔ ۱.۰.۰/۱.۰.۱ |
به v1.0.2 بهروزرسانی کنید. اگر روی v1.0.2+ هست: adb logcat -s MhrvVpnService mhrv-crash mhrv_rs و گزارش دهید |
هنگام update، INSTALL_FAILED_UPDATE_INCOMPATIBLE |
APK قدیمی با کلید متفاوت امضا شده (قبل از v1.0.2) | ابتدا uninstall کنید، سپس APK جدید را نصب کنید. فقط یکبار — از v1.0.2 به بعد امضا ثابت است |
Chrome سفید بدون خطا |
معمولاً باگ render روی emulator با GPU نرمافزاری |
روی دستگاه واقعی تست کنید. Live logs را ببینید آیا رله واقعاً درخواست میفرستد |
حلقهٔ Cloudflare Turnstile |
محدودیت شناختهشده | در این معماری راهحلی ندارد |
برنامههای بانکی/استریم خطای cert میدهند |
محدودیت شناختهشده | راهحل ندارد — خود برنامه opt-out کرده |
اگر میخواهید باگ گزارش دهید:
adb logcat -c # پاکسازی
# مشکل را در برنامه بازتولید کنید
adb logcat -d | grep -E "MhrvVpnService|mhrv_rs|mhrv-crash|tun2proxy" > mhrv.logmhrv.log را به issue پیوست کنید. اینها را هم بگویید:
- نسخهٔ اندروید (
Settings → About phone → Android version) OEM(Pixel / Samsung / Xiaomi / …)- نسخهٔ برنامه (روی
badgeنسخه درtop barضربه بزنید) - چه کردید، چه انتظار داشتید، چه شد
۱. Settings → Apps → mhrv-rs → Uninstall.
۲. اختیاری: حذف CA MITM — Settings → Security → Encryption & credentials → User credentials → mhrv-rs MITM CA → Remove. (اگر مسیر منو پیدا نمیشود، در Settings عبارت user credentials را جستوجو کنید.)
۳. پروفایل VPN هنگام uninstall خودکار باطل میشود — چیزی نیست که جداگانه پاک کنید.