From bc0ca62147914d4bda805a0ea5d945f9e6822486 Mon Sep 17 00:00:00 2001 From: Radikak Date: Thu, 30 Apr 2026 18:28:39 +0400 Subject: [PATCH] Complate README_FA.md --- README_FA.md | 854 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 801 insertions(+), 53 deletions(-) diff --git a/README_FA.md b/README_FA.md index 4166c27..e09dbad 100644 --- a/README_FA.md +++ b/README_FA.md @@ -1,91 +1,308 @@ -# آموزش راه‌اندازی پروژه (Cloudflare Worker + Google Apps Script) +# MHR-CFW — راهنمای کامل راه‌اندازی + +
+ +[![GitHub](https://img.shields.io/badge/GitHub-MasterHttpRelayVPN-blue?logo=github)](https://github.com/denuitt1/mhr-cfw) + | [English](README.md) | [Persian](README_FA.md) | | :---: | :---: | -Persian translation was provided by [pingplas_channel](https://t.me/pingplas_channel) +--- +## فهرست مطالب + +- [پروژه چیست؟](#پروژه-چیست) +- [چطور کار می‌کند؟](#چطور-کار-میکند) +- [پیش‌نیازها](#پیشنیازها) +- [مرحله ۱ — دریافت کد](#مرحله-۱--دریافت-کد) +- [مرحله ۲ — ساخت Cloudflare Worker](#مرحله-۲--ساخت-cloudflare-worker) +- [مرحله ۳ — ساخت Google Apps Script](#مرحله-۳--ساخت-google-apps-script) +- [مرحله ۴ — تنظیم فایل config.json](#مرحله-۴--تنظیم-فایل-configjson) +- [مرحله ۵ — اجرا](#مرحله-۵--اجرا) +- [مرحله ۶ — تنظیم مرورگر](#مرحله-۶--تنظیم-مرورگر) +- [مرحله ۷ — تست اتصال](#مرحله-۷--تست-اتصال) +- [تنظیمات پیشرفته config.json](#تنظیمات-پیشرفته-configjson) +- [ابزار اسکن IP گوگل](#ابزار-اسکن-ip-گوگل) +- [اشتراک‌گذاری در شبکه محلی (LAN)](#اشتراکگذاری-در-شبکه-محلی-lan) +- [راه‌اندازی روی لینوکس و مک](#راهاندازی-روی-لینوکس-و-مک) +- [عیب‌یابی](#عیبیابی) +- [سؤالات متداول](#سؤالات-متداول) +- [سلب مسئولیت](#سلب-مسئولیت) + +--- +### - [تلگرام ما : @Raydikalx](https://t.me/Raydikalx) +--- +## پروژه چیست؟ + +**MHR-CFW** یک پروکسی محلی است که ترافیک اینترنت شما را از طریق زیرساخت Google و Cloudflare عبور می‌دهد تا سیستم‌های DPI (بازرسی عمیق بسته) نتوانند آن را شناسایی و فیلتر کنند. + +از دید سیستم فیلترینگ، همه ترافیک شما شبیه ارتباط عادی با `www.google.com` به نظر می‌رسد، در حالی که درخواست‌های واقعی شما به هر سایتی که بخواهید ارسال می‌شوند. --- -## 1) نصب پیش‌نیازها -دستور زیر را اجرا کنید: +## چطور کار می‌کند؟ + +``` +مرورگر شما + │ + ▼ +پروکسی محلی (127.0.0.1:8085) + │ ← رمزگشایی TLS محلی (MITM) + ▼ +اتصال TLS به Google با SNI=www.google.com + │ ← از دید فیلترینگ: ترافیک عادی گوگل + ▼ +Google Apps Script (script.google.com) + │ ← رله JSON داخل زیرساخت گوگل + ▼ +Cloudflare Worker + │ ← خروج از طریق IP کلودفلر + ▼ +سایت مقصد +``` + +**مزایای این معماری:** +- سیستم DPI فقط SNI=`www.google.com` می‌بیند +- IP مقصد متعلق به گوگل است (مسدود نمی‌شود) +- محتوای واقعی درخواست داخل TLS رمزگذاری شده و پنهان است +- IP نهایی شما IP کلودفلر است، نه IP واقعی‌تان + +--- + +## پیش‌نیازها + +قبل از شروع به موارد زیر نیاز دارید: + +| مورد | توضیح | +|------|-------| +| **Python 3.10 یا بالاتر** | روی سیستم نصب باشد | +| **حساب Google** | برای ساخت Apps Script | +| **حساب Cloudflare** | برای ساخت Worker (رایگان) | +| **Git** (اختیاری) | برای دریافت کد | + +### بررسی نسخه Python + +**ویندوز — PowerShell یا CMD:** +``` +python --version +``` +یا: +``` +py --version +``` + +**لینوکس / مک — ترمینال:** +```bash +python3 --version +``` + +اگر خروجی `Python 3.10.x` یا بالاتر بود آماده‌اید. در غیر این صورت از [python.org](https://www.python.org/downloads/) نصب کنید. + +> **ویندوز:** هنگام نصب Python، تیک گزینه **"Add Python to PATH"** را حتماً بزنید. + +--- + +## مرحله ۱ — دریافت کد + +### روش اول: با Git ```bash +git clone https://github.com/denuitt1/mhr-cfw.git +cd mhr-cfw +``` + +### روش دوم: دانلود مستقیم + +از GitHub روی **Code → Download ZIP** کلیک کنید، فایل را از حالت فشرده خارج کرده و وارد پوشه آن شوید. + +### ساخت محیط مجازی Python (توصیه شده) + +محیط مجازی یا `virtualenv` باعث می‌شود کتابخانه‌های این پروژه با سایر پروژه‌های Python روی سیستم شما تداخل نداشته باشند. + +**ویندوز:** +``` +python -m venv .venv +.venv\Scripts\activate +``` +پس از فعال شدن، ابتدای خط ترمینال به این شکل تغییر می‌کند: +``` +(.venv) C:\Users\...> +``` + +**لینوکس / مک:** +```bash +python3 -m venv .venv +source .venv/bin/activate +``` +پس از فعال شدن: +``` +(.venv) user@host:~/mhr-cfw$ +``` + +> برای **خروج** از محیط مجازی در هر زمان، کافی است تایپ کنید: +> ``` +> deactivate +> ``` + +### نصب کتابخانه‌ها + +``` pip install -r requirements.txt ``` +اگر دسترسی مستقیم به PyPI ندارید: +``` +pip install -r requirements.txt -i https://mirror-pypi.runflare.com/simple/ --trusted-host mirror-pypi.runflare.com +``` + --- -## 2) راه‌اندازی Cloudflare Worker (worker.js) +## مرحله ۲ — ساخت Cloudflare Worker -1. وارد داشبورد Cloudflare شوید و لاگین کنید. -2. از منوی کناری بروید به: - **Compute > Workers & Pages** -3. روی **Create Application** کلیک کنید. -4. گزینه **Start with Hello World** را انتخاب کرده و Deploy کنید. -5. روی **Edit code** بزنید. -6. تمام کدهای پیش‌فرض را حذف کنید. -7. فایل `worker.js` پروژه (پوشه script) را باز کنید. -8. کل کد را کپی کرده و در ادیتور Cloudflare پیست کنید. +Cloudflare Worker نقش «خروجی» ترافیک را دارد — درخواست را از Apps Script دریافت کرده و به سایت مقصد ارسال می‌کند. IP نهایی‌ای که سایت می‌بیند، IP کلودفلر است. -⚠️ مهم: -این خط را با آدرس ورکر خودتان جایگزین کنید: -``` +### گام‌ به گام: + +**۱.** به [dash.cloudflare.com](https://dash.cloudflare.com/) بروید و وارد حساب کاربری‌تان شوید. +> اگر حساب ندارید از همین لینک رایگان ثبت‌نام کنید. + +**۲.** از منوی سمت چپ، روی **Compute (Workers)** کلیک کنید. + +**۳.** روی **Workers & Pages** کلیک کنید. + +**۴.** دکمه **Create** را بزنید. + +**۵.** گزینه **Start with Hello World** را انتخاب کنید. + +**۶.** یک نام دلخواه برای Worker خود بدهید (مثلاً `my-relay`) و دکمه **Deploy** را بزنید. + +**۷.** پس از Deploy، روی **Edit code** کلیک کنید. + +**۸.** تمام کد پیش‌فرض داخل ویرایشگر را انتخاب و **حذف** کنید. +> در ویندوز: `Ctrl+A` سپس `Delete` +> در مک: `Cmd+A` سپس `Delete` + +**۹.** فایل `script/worker.js` را از پوشه پروژه با یک ویرایشگر متن باز کنید (مثلاً Notepad، VS Code، یا Gedit). + +**۱۰.** تمام محتوای آن را کپی (`Ctrl+A` سپس `Ctrl+C`) و داخل ویرایشگر Cloudflare **Paste** کنید (`Ctrl+V`). + +**۱۱. مهم:** این خط را پیدا کنید: +```javascript const WORKER_URL = "myworker.workers.dev"; ``` +آدرس `myworker.workers.dev` را با **آدرس Worker خودتان** جایگزین کنید. آدرس Worker شما در بالای صفحه کلودفلر نمایش داده می‌شود (مثلاً `my-relay.yourname.workers.dev`). -9. روی **Deploy** کلیک کنید. +**۱۲.** دکمه **Deploy** را بزنید. + +**۱۳.** آدرس Worker خود را یادداشت کنید — در مرحله بعد به آن نیاز دارید. +آدرس معمولاً به شکل `https://my-relay.yourname.workers.dev` است. --- -## 3) راه‌اندازی Google Relay (Code.gs) +## مرحله ۳ — ساخت Google Apps Script -1. وارد Google Apps Script شوید. -2. روی **New Project** کلیک کنید. -3. تمام کدهای پیش‌فرض را حذف کنید. -4. فایل `Code.gs` پروژه را باز کرده و کپی کنید. -5. کد را داخل ادیتور پیست کنید. +Apps Script نقش «دروازه» را دارد — درخواست‌های پروکسی محلی شما را دریافت کرده و از طریق زیرساخت گوگل به Worker کلودفلر ارسال می‌کند. -⚠️ مهم: -``` -const AUTH_KEY = "your-secret-password-here"; -const WORKER_URL = "https://myworker.workers.dev"; +### گام به گام: + +**۱.** به [script.google.com](https://script.google.com/) بروید و با همان حساب Google وارد شوید. + +**۲.** روی **New project** (پروژه جدید) کلیک کنید. + +**۳.** در ویرایشگر باز‌شده، تمام کد پیش‌فرض (`function myFunction() {}`) را **حذف** کنید. + +**۴.** فایل `script/Code.gs` را از پوشه پروژه با یک ویرایشگر متن باز کرده، کل محتوا را کپی و داخل ویرایشگر Apps Script **Paste** کنید. + +**۵. مهم:** این دو خط را پیدا کنید: +```javascript +const AUTH_KEY = "STRONG_SECRET_KEY"; +const WORKER_URL = "https://example.workers.dev"; ``` -- یک رمز دلخواه قوی انتخاب کنید. -- آدرس Worker خودتان را جایگزین کنید. +- **AUTH_KEY** را با یک رمز دلخواه قوی (حداقل ۲۰ کاراکتر، ترکیب حروف و اعداد) تغییر دهید. + مثال: `const AUTH_KEY = "mYs3cr3tP@ss2024xZ9k";` + > این رمز را یادداشت کنید — در `config.json` هم باید همین رمز را وارد کنید. + +- **WORKER_URL** را با آدرس Worker کلودفلر که در مرحله قبل ساختید تغییر دهید. + مثال: `const WORKER_URL = "https://my-relay.yourname.workers.dev";` + +**۶.** کد را ذخیره کنید (`Ctrl+S` یا `Cmd+S`). + +**۷.** از منوی بالا روی **Deploy** کلیک کنید، سپس **New deployment** را انتخاب کنید. + +**۸.** در پنجره باز‌شده: +- روی آیکون چرخ‌دنده (⚙️) کنار «Select type» کلیک کنید +- **Web app** را انتخاب کنید + +**۹.** تنظیمات را به این شکل پر کنید: +``` +Description : هر چیزی دلتان بخواهد (مثلاً "relay v1") +Execute as : Me +Who has access : Anyone +``` + +**۱۰.** روی **Deploy** کلیک کنید. + +**۱۱.** اگر اولین بار است، Google از شما می‌خواهد دسترسی‌ها را تأیید کنید: +- روی **Authorize access** کلیک کنید +- حساب Google خود را انتخاب کنید +- اگر پیام «Google hasn't verified this app» نمایش داده شد: + - روی **Advanced** کلیک کنید + - روی **Go to [نام پروژه] (unsafe)** کلیک کنید + - روی **Allow** کلیک کنید + +**۱۲.** پس از Deploy موفق، یک **Deployment ID** به شما نمایش داده می‌شود که شکلی مانند این دارد: +``` +AKfycbz...................................xYZ +``` +این ID را کپی کرده و نگه دارید — در مرحله بعد نیاز است. --- -### Deploy کردن +## مرحله ۴ — تنظیم فایل config.json -1. از بالا روی **Deploy → New deployment** کلیک کنید. -2. نوع را روی **Web app** بگذارید. -3. تنظیمات: - - Execute as: **Me** - - Who has access: **Anyone** -4. روی **Deploy** بزنید. +در پوشه پروژه، فایلی به نام `config.example.json` وجود دارد. باید از روی آن یک فایل `config.json` بسازید. -📌 بعد از Deploy: -یک **Deployment ID** دریافت می‌کنید (رشته طولانی) -→ این را ذخیره کنید. +**ویندوز:** +``` +copy config.example.json config.json +``` -⚠️ رمز عبوری که انتخاب کردید را حتما نگه دارید. +**لینوکس / مک:** +```bash +cp config.example.json config.json +``` ---- +حالا `config.json` را با یک ویرایشگر متن باز کنید و مقادیر لازم را تغییر دهید: -## 4) تنظیم فایل config.json +**ویندوز (Notepad):** +``` +notepad config.json +``` +**لینوکس (nano):** +```bash +nano config.json +``` +> برای **ذخیره** در nano: `Ctrl+O` سپس `Enter` +> برای **خروج** از nano: `Ctrl+X` -سپس فایل `config.json` را باز کرده و مقادیر را وارد کنید: +**لینوکس (vim):** +```bash +vim config.json +``` +> برای **رفتن به حالت ویرایش** در vim: کلید `i` را بزنید +> برای **ذخیره و خروج** از vim: کلید `Esc` سپس تایپ کنید `:wq` و `Enter` + +### حداقل تنظیمات لازم: ```json { "mode": "apps_script", "google_ip": "216.239.38.120", "front_domain": "www.google.com", - "script_id": "PASTE_YOUR_DEPLOYMENT_ID_HERE", - "auth_key": "your-secret-password-here", + "script_id": "DEPLOYMENT_ID_را_اینجا_بگذارید", + "auth_key": "همان_رمزی_که_در_Code.gs_گذاشتید", "listen_host": "127.0.0.1", "listen_port": 8085, "socks5_enabled": true, @@ -95,28 +312,559 @@ const WORKER_URL = "https://myworker.workers.dev"; } ``` -### توضیحات: -- `script_id` → همان Deployment ID -- `auth_key` → همان رمز مرحله قبل +- **script_id**: Deployment ID که در مرحله ۳ کپی کردید +- **auth_key**: رمزی که در `Code.gs` برای `AUTH_KEY` گذاشتید (باید دقیقاً یکسان باشد) --- -## 5) اجرا (Run) +## مرحله ۵ — اجرا +### روش ساده (توصیه شده) + +**ویندوز:** +فایل `run.bat` را دوبار کلیک کنید یا در CMD: +``` +run.bat +``` + +**لینوکس / مک:** +```bash +chmod +x run.sh +./run.sh +``` + +این اسکریپت‌ها به صورت خودکار: +- محیط مجازی Python می‌سازند +- وابستگی‌ها را نصب می‌کنند +- اگر `config.json` نداشته باشید، wizard راه‌اندازی را اجرا می‌کنند +- پروکسی را روشن می‌کنند + +### روش دستی + +اگر محیط مجازی را خودتان ساخته‌اید: + +```bash +# ابتدا محیط مجازی را فعال کنید (اگر نکرده‌اید) +# ویندوز: +.venv\Scripts\activate +# لینوکس/مک: +source .venv/bin/activate + +# سپس اجرا کنید: +python main.py +``` + +### خروجی موفق + +اگر همه چیز درست باشد، پیام‌هایی شبیه به این می‌بینید: ``` +╭──────────────────────────────────────────────────────────────────────╮ +│ mhr-cfw Domain-Fronted GAS-CFW Relay v1.1.0 │ +╰──────────────────────────────────────────────────────────────────────╯ +10:25:43 • INFO [Main ] DomainFront Tunnel starting (Apps Script relay) +10:25:43 • INFO [Main ] Apps Script relay : SNI=www.google.com → script.google.com +10:25:43 • INFO [Main ] Script ID : AKfycbz... +10:25:44 • INFO [Main ] MITM CA is already trusted. +10:25:44 • INFO [Proxy ] HTTP proxy listening on 127.0.0.1:8085 +10:25:44 • INFO [Proxy ] SOCKS5 proxy listening on 127.0.0.1:1080 +10:25:44 • INFO [Fronter ] Pre-warmed 28/30 TLS connections +10:25:44 • INFO [H2 ] H2 multiplexing active — one conn handles all requests +``` + +### نصب گواهی CA (اولین بار) + +برای رمزگشایی ترافیک HTTPS، پروژه یک گواهی CA محلی می‌سازد که باید به مرورگر شما اضافه شود. + +پروژه سعی می‌کند این کار را **به صورت خودکار** انجام دهد. اگر خودکار کار نکرد: + +```bash +python main.py --install-cert +``` + +در ویندوز ممکن است پنجره‌ای برای تأیید باز شود — روی **Yes** کلیک کنید. + +> **نکته:** گواهی CA فقط برای اتصالات از طریق همین پروکسی استفاده می‌شود. هیچ ترافیک خارج از پروکسی تحت تأثیر نیست. + +--- + +## مرحله ۶ — تنظیم مرورگر + +پروکسی روی پورت `8085` اجرا می‌شود. باید مرورگر خود را تنظیم کنید تا ترافیک را از طریق این پروکسی بفرستد. + +### روش ۱: FoxyProxy (توصیه شده برای Chrome/Firefox) + +**۱.** افزونه FoxyProxy را نصب کنید: +- [Chrome](https://chromewebstore.google.com/detail/foxyproxy/gcknhkkoolaabfmlnjonogaaifnjlfnp) +- [Firefox](https://addons.mozilla.org/en-US/firefox/addon/foxyproxy-standard/) + +**۲.** روی آیکون FoxyProxy کلیک کنید → **Options** + +**۳.** روی **Add** کلیک کنید و این اطلاعات را وارد کنید: +``` +Proxy Type : HTTP +Proxy IP : 127.0.0.1 +Port : 8085 +``` + +**۴.** یک نام دلخواه بدهید (مثلاً «MHR-CFW») و ذخیره کنید. + +**۵.** از آیکون FoxyProxy، پروکسی ساخته‌شده را فعال کنید. + +### روش ۲: تنظیمات سیستم ویندوز + +اگر می‌خواهید همه برنامه‌ها از پروکسی استفاده کنند: + +۱. **Settings** → **Network & Internet** → **Proxy** +۲. زیر **Manual proxy setup** گزینه **Use a proxy server** را روشن کنید +۳. آدرس `127.0.0.1` و پورت `8085` را وارد کنید +۴. **Save** + +### روش ۳: SOCKS5 (برای برنامه‌های سازگار) + +پروجه همچنین یک پروکسی SOCKS5 روی پورت `1080` دارد: +``` +Protocol : SOCKS5 +Host : 127.0.0.1 +Port : 1080 +``` + +--- + +## مرحله ۷ — تست اتصال + +پس از اینکه پروکسی روشن و مرورگر تنظیم شد: + +**۱.** مرورگر را باز کنید و به آدرس [ipleak.net](https://ipleak.net) بروید. + +**۲.** نتیجه موفق: +- IP نمایش‌داده‌شده باید از **Cloudflare** (AS13335) باشد +- IP واقعی شما نباید نمایش داده شود + +**۳.** تست دسترسی به سایت فیلترشده: هر سایتی که قبلاً در دسترس نبود را امتحان کنید. +# - [تلگرام ما : @Raydikalx](https://t.me/Raydikalx) +--- + +## تنظیمات پیشرفته config.json + +فایل `config.json` گزینه‌های زیادی دارد که می‌توانید برحسب نیاز تنظیم کنید: + +### تنظیمات اصلی + +| کلید | پیش‌فرض | توضیح | +|------|---------|-------| +| `google_ip` | `216.239.38.120` | IP سرور Google برای domain fronting. از ابزار اسکن برای یافتن سریع‌ترین IP استفاده کنید. | +| `front_domain` | `www.google.com` | دامنه‌ای که در SNI به سیستم فیلترینگ نمایش داده می‌شود | +| `script_id` | — | Deployment ID گوگل Apps Script شما | +| `auth_key` | — | رمز مشترک بین پروکسی و Apps Script | +| `listen_host` | `127.0.0.1` | آدرس گوش‌دادن HTTP پروکسی | +| `listen_port` | `8085` | پورت HTTP پروکسی | +| `socks5_enabled` | `true` | فعال‌سازی پروکسی SOCKS5 | +| `socks5_port` | `1080` | پورت SOCKS5 | +| `log_level` | `INFO` | سطح لاگ: `DEBUG`, `INFO`, `WARNING`, `ERROR` | +| `verify_ssl` | `true` | تأیید گواهی SSL هنگام اتصال به گوگل | + +### تنظیمات شبکه و اتصال + +| کلید | پیش‌فرض | توضیح | +|------|---------|-------| +| `lan_sharing` | `false` | اشتراک پروکسی با سایر دستگاه‌های شبکه محلی | +| `relay_timeout` | `25` | مهلت زمانی (ثانیه) برای هر درخواست رله | +| `tls_connect_timeout` | `15` | مهلت اتصال TLS به گوگل (ثانیه) | +| `tcp_connect_timeout` | `10` | مهلت اتصال TCP مستقیم (ثانیه) | +| `max_response_body_bytes` | `209715200` | حداکثر حجم پاسخ (200 مگابایت) | +| `parallel_relay` | `1` | تعداد Apps Script که به صورت موازی استفاده می‌شوند (نیاز به چند `script_id`) | + +### چند script_id برای سرعت بیشتر + +اگر چندین پروژه Apps Script دارید، می‌توانید ID آن‌ها را به صورت لیست بدهید: + +```json +{ + "script_ids": [ + "AKfycbzFIRSTID...", + "AKfycbzSECONDID...", + "AKfycbzTHIRDID..." + ], + "parallel_relay": 3 +} +``` + +با `parallel_relay: 3`، پروکسی هر درخواست را به **هر سه** script به صورت همزمان می‌فرستد و سریع‌ترین پاسخ را برمی‌گرداند — این latency را به شدت کاهش می‌دهد. + +### تنظیمات دانلود موازی (Parallel Download) + +برای فایل‌های بزرگ، پروکسی از قابلیت HTTP Range استفاده می‌کند تا چندین قطعه را به صورت موازی دانلود کند: + +```json +{ + "chunked_download_extensions": [".mp4", ".mkv", ".zip", ".iso"], + "chunked_download_min_size": 5242880, + "chunked_download_chunk_size": 524288, + "chunked_download_max_parallel": 8, + "chunked_download_max_chunks": 256 +} +``` + +| کلید | توضیح | +|------|-------| +| `chunked_download_extensions` | پسوندهایی که دانلود موازی روی آن‌ها فعال می‌شود | +| `chunked_download_min_size` | حداقل حجم فایل برای فعال‌شدن دانلود موازی (بایت) — پیش‌فرض 5MB | +| `chunked_download_chunk_size` | حجم هر قطعه (بایت) — پیش‌فرض 512KB | +| `chunked_download_max_parallel` | حداکثر تعداد قطعه‌های هم‌زمان | +| `chunked_download_max_chunks` | حداکثر تعداد کل قطعه‌ها | + +### قوانین مسیریابی + +```json +{ + "block_hosts": ["ads.example.com", ".adserver.net"], + "bypass_hosts": ["localhost", ".local", ".lan"], + "youtube_via_relay": false, + "hosts": { + "custom.example.com": "1.2.3.4" + } +} +``` + +| کلید | توضیح | +|------|-------| +| `block_hosts` | دامنه‌هایی که کاملاً مسدود می‌شوند. قوانین با `.` مثل `.adserver.net` شامل همه زیردامنه‌ها می‌شوند | +| `bypass_hosts` | دامنه‌هایی که مستقیم (بدون رله) اتصال برقرار می‌شوند | +| `youtube_via_relay` | اگر `true` باشد، YouTube از طریق Apps Script رله می‌شود (پیش‌فرض: مستقیم با SNI rewrite) | +| `hosts` | نگاشت دستی دامنه به IP (مثل hosts سیستم‌عامل) | + +### تنظیمات گوگل + +```json +{ + "direct_google_exclude": ["gemini.google.com", "mail.google.com"], + "direct_google_allow": ["www.google.com", "safebrowsing.google.com"] +} +``` + +سرویس‌های گوگل که در `direct_google_exclude` هستند از طریق Apps Script رله می‌شوند (نه مستقیم). سرویس‌های `direct_google_allow` مستقیم به IP گوگل متصل می‌شوند. + +--- + +## ابزار اسکن IP گوگل + +اگر پروکسی کند است یا IP گوگل فعلی مسدود شده، می‌توانید سریع‌ترین IP موجود را پیدا کنید: + +```bash +python main.py --scan +``` + +خروجی نمونه: +``` +Scanning 26 Google frontend IPs + SNI: www.google.com + Timeout: 4s per IP + Concurrency: 8 parallel probes + +IP LATENCY STATUS +-------------------- ------------ ------------------------- +216.239.38.120 42ms OK +142.250.80.142 45ms OK +172.217.14.206 78ms OK +... + +Top 3 fastest IPs: + 1. 216.239.38.120 (42ms) + 2. 142.250.80.142 (45ms) + 3. 172.217.14.206 (78ms) + +Recommended: Set "google_ip": "216.239.38.120" in config.json +``` + +IP پیشنهادشده را در `config.json` در قسمت `google_ip` قرار دهید. + +--- + +## اشتراک‌گذاری در شبکه محلی (LAN) + +اگر می‌خواهید موبایل یا سایر دستگاه‌های خانگی هم از این پروکسی استفاده کنند: + +در `config.json`: +```json +{ + "lan_sharing": true +} +``` + +پروکسی به صورت خودکار روی همه رابط‌های شبکه (`0.0.0.0`) گوش می‌دهد و آدرس‌های قابل دسترس از شبکه محلی را لاگ می‌کند: + +``` +INFO [Main] LAN HTTP proxy : 192.168.1.100:8085, 192.168.1.100:8085 +INFO [Main] LAN SOCKS5 proxy : 192.168.1.100:1080 +``` + +**تنظیم موبایل (Android/iOS):** +1. به تنظیمات WiFi بروید +2. شبکه متصل را نگه دارید یا روی آیکون ⚙️ بزنید +3. گزینه **Proxy** را روی **Manual** بگذارید +4. **Hostname**: آدرس IP لپ‌تاپ/PC شما (مثلاً `192.168.1.100`) +5. **Port**: `8085` + +> **توجه:** فایروال ویندوز ممکن است اتصال از شبکه محلی را مسدود کند. اگر موبایل نتوانست متصل شود، یک قانون استثنا در Windows Defender Firewall برای پورت ۸۰۸۵ اضافه کنید. + +--- + +## راه‌اندازی روی لینوکس و مک + +تمام مراحل بالا روی لینوکس و مک یکسان است با این تفاوت‌ها: + +### نصب Python (Ubuntu/Debian) +```bash +sudo apt update +sudo apt install python3 python3-pip python3-venv git -y +``` + +### نصب Python (Fedora/RHEL) +```bash +sudo dnf install python3 python3-pip git -y +``` + +### نصب Python (macOS) +```bash +brew install python3 git +``` +> اگر Homebrew ندارید: `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"` + +### نصب گواهی CA روی لینوکس + +اگر نصب خودکار با خطا روبرو شد: +```bash +sudo python main.py --install-cert +``` + +برای Ubuntu/Debian می‌توانید دستی هم نصب کنید: +```bash +sudo cp ca/ca.crt /usr/local/share/ca-certificates/mhr-cfw.crt +sudo update-ca-certificates +``` + +### حذف گواهی CA +```bash +sudo python main.py --uninstall-cert +``` + +--- + +## آرگومان‌های خط فرمان + +``` +python main.py [گزینه‌ها] + + -c, --config PATH مسیر فایل config (پیش‌فرض: config.json) + -p, --port PORT اوررید پورت HTTP + --host HOST اوررید آدرس گوش‌دادن + --socks5-port PORT اوررید پورت SOCKS5 + --disable-socks5 غیرفعال کردن SOCKS5 + --log-level LEVEL سطح لاگ (DEBUG/INFO/WARNING/ERROR) + --install-cert نصب گواهی CA و خروج + --uninstall-cert حذف گواهی CA و خروج + --no-cert-check رد شدن از بررسی گواهی CA + --scan اسکن IP های گوگل و خروج + -v, --version نمایش نسخه +``` + +مثال — اجرا با پورت متفاوت بدون تغییر config: +```bash +python main.py -p 9090 --socks5-port 9091 --log-level DEBUG +``` + +--- + +## متغیرهای محیطی + +می‌توانید به جای تغییر `config.json` از متغیرهای محیطی استفاده کنید: + +| متغیر | معادل config | +|-------|-------------| +| `DFT_AUTH_KEY` | `auth_key` | +| `DFT_SCRIPT_ID` | `script_id` | +| `DFT_PORT` | `listen_port` | +| `DFT_HOST` | `listen_host` | +| `DFT_SOCKS5_PORT` | `socks5_port` | +| `DFT_LOG_LEVEL` | `log_level` | +| `DFT_CONFIG` | مسیر فایل config | + +**لینوکس/مک:** +```bash +export DFT_AUTH_KEY="my_secret_key" +export DFT_SCRIPT_ID="AKfycbz..." +python main.py +``` + +**ویندوز CMD:** +``` +set DFT_AUTH_KEY=my_secret_key python main.py ``` --- -## خروجی نهایی +## عیب‌یابی -اگر همه چیز درست باشد، این پیام را می‌بینید: +### خطا: `auth_key is unset or uses a known placeholder` +**علت:** مقدار `auth_key` در `config.json` تغییر نکرده یا خالی است. + +**راه‌حل:** در `config.json` مقدار `auth_key` را به یک رمز واقعی تغییر دهید. این رمز باید **دقیقاً** با مقدار `AUTH_KEY` در فایل `Code.gs` یکسان باشد. + +--- + +### خطا: `Missing 'script_id' in config` + +**علت:** Deployment ID وارد نشده یا مقدار پیش‌فرض تغییر نکرده. + +**راه‌حل:** Deployment ID را از Google Apps Script کپی و در `config.json` وارد کنید. + +--- + +### پروکسی اجرا می‌شود اما سایت‌ها باز نمی‌شوند + +**۱. بررسی کنید مرورگر به پروکسی متصل است:** +- در FoxyProxy مطمئن شوید پروکسی فعال است +- در ipleak.net بررسی کنید IP تغییر کرده باشد + +**۲. AUTH_KEY را بررسی کنید:** +- مقدار `auth_key` در `config.json` باید **کاملاً یکسان** با `AUTH_KEY` در `Code.gs` باشد +- به فاصله، کوچک/بزرگ‌بودن حروف، و کاراکترهای اضافه دقت کنید + +**۳. پس از تغییر Code.gs باید Deploy جدید بسازید:** +- هر بار که `Code.gs` را تغییر می‌دهید، باید دوباره **Deploy → New deployment** کنید +- از Deployment ID **جدید** استفاده کنید + +**۴. google_ip را بررسی کنید:** +- دستور `python main.py --scan` را اجرا کنید +- سریع‌ترین IP را در `config.json` قرار دهید + +--- + +### خطا در لاگ: `unauthorized` + +**علت:** `AUTH_KEY` در Apps Script با `auth_key` در `config.json` مطابقت ندارد. + +**راه‌حل:** +1. `Code.gs` را در Apps Script باز کنید +2. مقدار `AUTH_KEY` را یادداشت کنید +3. همان مقدار را در `config.json` برای `auth_key` قرار دهید +4. سرویس را ری‌استارت کنید + +--- + +### خطا: `MITM CA is not trusted` + +**علت:** گواهی CA نصب نشده یا نصب آن ناموفق بوده. + +**راه‌حل:** +```bash +# اجرا با دسترسی ادمین: +# ویندوز: CMD را به عنوان Administrator باز کنید +python main.py --install-cert + +# لینوکس/مک: +sudo python main.py --install-cert ``` -HTTP proxy is running on 127.0.0.1:8085 + +اگر مشکل ادامه داشت، گواهی را **دستی** نصب کنید: +1. فایل `ca/ca.crt` را پیدا کنید +2. روی آن دوبار کلیک کنید (ویندوز) +3. **Install Certificate** → **Local Machine** → **Trusted Root Certification Authorities** + +--- + +### پروکسی در ویندوز کند است یا قطع می‌شود + +برخی مواقع Windows Defender یا آنتی‌ویروس ترافیک پروکسی را بررسی می‌کند. + +پوشه پروژه را به استثناهای آنتی‌ویروس اضافه کنید: +- Windows Security → Virus & threat protection → Manage settings → Exclusions + +--- + +### پیام: `H2 multiplexing` نمی‌آید + +این پیام نشان می‌دهد کتابخانه `h2` نصب نشده. بدون آن پروکسی با HTTP/1.1 کار می‌کند (کمی کندتر). + +برای نصب: +```bash +pip install h2>=4.1.0 ``` --- +## سؤالات متداول + +**آیا این پروژه رایگان است؟** +بله، کاملاً رایگان است. Google Apps Script و Cloudflare Workers هر دو پلن رایگان دارند که برای استفاده شخصی کافی است. + +**محدودیت‌های Apps Script چیست؟** +در پلن رایگان، Google Apps Script روزانه محدودیت ۶ دقیقه زمان اجرا و ۲۰,۰۰۰ درخواست URL دارد. برای استفاده معمول روزانه معمولاً کافی است. اگر پیام `quota_exceeded` در لاگ دیدید، روز بعد سهمیه تجدید می‌شود. + +**آیا می‌توانم چند نفر از یک Apps Script استفاده کنیم؟** +بله، اما سهمیه روزانه مشترک می‌شود. بهتر است هر نفر پروژه مجزای خود را بسازد. + +**آیا ترافیک شما توسط گوگل دیده می‌شود؟** +Apps Script درخواست‌ها را از طریق `UrlFetchApp` ارسال می‌کند. محتوای JSON رمزگذاری‌نشده توسط Apps Script پردازش می‌شود. برای اطلاعات حساس از HTTPS اطمینان حاصل کنید (که به صورت پیش‌فرض رمزگذاری شده باقی می‌ماند). + +**آیا IPv6 پشتیبانی می‌شود?** +پروکسی HTTP روی IPv4 گوش می‌دهد. اتصالات مستقیم (مثل bypass) هم IPv4 و هم IPv6 را پشتیبانی می‌کنند. + +**گواهی CA را چطور حذف کنم؟** +```bash +python main.py --uninstall-cert +``` +یا فایل `run.bat --uninstall-cert` را اجرا کنید. + +**آیا پروکسی بعد از ری‌استارت سیستم خودکار اجرا می‌شود؟** +خیر، باید دستی اجرا شود. برای راه‌اندازی خودکار در ویندوز می‌توانید یک Task در Task Scheduler بسازید. در لینوکس می‌توانید یک systemd service بنویسید. + +--- + +## ساختار فایل‌های پروژه + +``` +mhr-cfw/ +├── main.py ← نقطه ورود اصلی +├── setup.py ← wizard راه‌اندازی +├── config.json ← تنظیمات شما (ساخته نمی‌شود، باید بسازید) +├── config.example.json ← نمونه تنظیمات با همه گزینه‌ها +├── requirements.txt ← وابستگی‌های Python +├── run.bat ← اجراکننده ویندوز +├── run.sh ← اجراکننده لینوکس/مک +├── ca/ ← گواهی CA (خودکار ساخته می‌شود) +│ ├── ca.crt ← گواهی عمومی CA +│ └── ca.key ← کلید خصوصی CA (محرمانه) +├── script/ +│ ├── Code.gs ← کد Google Apps Script +│ └── worker.js ← کد Cloudflare Worker +└── src/ + ├── proxy_server.py ← سرور HTTP/SOCKS5 محلی + ├── domain_fronter.py ← موتور رله Apps Script + ├── h2_transport.py ← انتقال HTTP/2 + ├── mitm.py ← مدیریت گواهی MITM + ├── cert_installer.py ← نصب CA در سیستم‌عامل + ├── codec.py ← رمزگشایی gzip/brotli/zstd + ├── constants.py ← ثابت‌های قابل تنظیم + ├── google_ip_scanner.py ← اسکنر IP گوگل + ├── lan_utils.py ← ابزارهای شبکه محلی + └── logging_utils.py ← لاگ‌گذاری رنگی +``` + +> **هرگز** فایل `ca/ca.key` را به کسی ندهید یا در اینترنت آپلود نکنید. + +--- + +## سلب مسئولیت + +این نرم‌افزار فقط برای اهداف آموزشی، تحقیقاتی و تست ارائه شده است. + +- نرم‌افزار «همانطور که هست» (AS IS) ارائه می‌شود بدون هیچ ضمانتی +- توسعه‌دهندگان مسئولیتی در قبال خسارات احتمالی ندارند +- رعایت قوانین محلی، ملی و بین‌المللی بر عهده کاربر است +- رعایت شرایط استفاده از سرویس‌های Google و Cloudflare بر عهده کاربر است + +
\ No newline at end of file