راهاندازی پراکسی WEB تلگرام با tproxy-server و Katabump
این روش چیه؟
تلگرام دسکتاپ از نسخهی 7.1 به بعد یک نوع پروکسی جدید به اسم WEB اضافه کرده که ترافیک را شبیه بازدید از یک سایت عادی میکند و همین باعث میشود شناساییش سختتر باشد.
این راهنما نشان میدهد چطور این نوع پروکسی را کاملاً رایگان روی یک هاست رایگان مثل Katabump راهاندازی کنیم.
سایتهای مورد نیاز
پیش از شروع، به اکانت روی این سایتها نیاز دارید:
۱. Katabump لینک: control.katabump.com یک هاست رایگان که پلن Python/Node.js میدهد. سروری که پروژه رویش اجرا میشود.
۲. Orihost (جایگزین Katabump، اختیاری) لینک: orihost.com یک هاست رایگان مشابه Katabump با همین نوع پلن. اگر Katabump در دسترس نبود، میتوانید از این استفاده کنید.
۳. Cloudflare لینک: dash.cloudflare.com برای ساخت تانل و عبور از محدودیت پورت هاست استفاده میشود.
۴. Termux لینک: termux.dev یک اپلیکیشن ترمینال برای اندروید. باینریهای لازم را با آن روی گوشی میسازیم.
۵. یک رجیستر دامین (اگر میخواهید دامین شخصی بخرید) لینک: namecheap.com برای خرید یک دامین ارزان و بدون سابقه — دلیل اهمیتش در بخش نکات دامین توضیح داده شده.
۶. DigitalPlat FreeDomain (جایگزین رایگان برای دامین شخصی) لینک: dash.domain.digitalplat.org یک سرویس رایگان ثبت سابدامین، برای وقتی که خرید دامین فعلاً مقدور نیست.
۷. مخزن tproxy-server لینک: github.com/telegramdesktop/tproxy-server پروژهی رسمی تیم تلگرام که این نوع پروکسی را پیادهسازی میکند.
۸. مخزن mtg لینک: github.com/9seconds/mtg نرمافزاری که ترافیک واقعی تلگرام را میفهمد و رد و بدل میکند.
پیشنیازها
- یک اکانت Katabump (یا مشابهش) با پلن Python/Node.js
- یک اکانت رایگان Cloudflare (فقط برای دامین اختصاصی لازم است، نه برای Quick Tunnel)
- Termux روی گوشی اندروید
- یک دامین (ترجیحاً خریداریشده — دلیلش را در بخش نکات دامین بخوانید)
معماری کلی
Internet
│
▼
Cloudflare
│
▼
main.py (on your host)
├── decoy site <- looks like a normal website
├── tproxy-server <- HTTPS disguise layer
└── mtg <- real Telegram backendهر درخواستی که به دامین شما میرسد، اول وارد tproxy-server میشود. اگر همراهش کد معتبر تلگرام نباشد، بدون هیچ نشانهای سایت قلابی نشانش داده میشود؛ اگر معتبر باشد، به mtg (که ترافیک واقعی تلگرام را میفهمد) وصل میشود.
روش پیشنهادی: اجرای خودکار با اسکریپت
توصیهی ما
بهجای انجام دستی همهی مراحل (نصب پکیجها، کامپایل tproxy-server و mtg، ساخت فایلهای کانفیگ)، یک اسکریپت آماده هست که همهی این کارها را برایتان انجام میدهد. برای اکثر کاربرها این سادهترین و سریعترین راه است.
کافی است این یک دستور را در ترموکس بزنید:
curl -fsSL -o build-web-proxy.sh https://raw.githubusercontent.com/mehdi-hexing/mehdi-hexing/refs/heads/main/docs/public/web-proxy-setup/build-web-proxy.sh && bash build-web-proxy.shاین اسکریپت:
- پکیجهای لازم را نصب میکند (فقط اگر از قبل نصب نباشند)
tproxy-serverوmtg v1را کامپایل میکند- دامین، نوع تانل، سکرت و
MTG_PUBLIC_IPV4را از شما میپرسد و خودش مستقیم تویconfig.json،profiles.jsonوcf-config.ymlمینویسد — دیگر لازم نیست بعداً دستی این فایلها را ویرایش کنید main.pyرا دانلود و باینریها را کنار بقیهی فایلها کپی میکند- در پایان یک جدول از همهی مقادیری که وارد کردید/برایتان ساخته شد چاپ میکند تا قبل از آپلود دوباره چکشان کنید (همین جدول توی
SETTINGS-SUMMARY.txtداخل پوشهی پروژه هم ذخیره میشود) - یک پوشهی کامل و آمادهی آپلود در Downloads گوشی شما (
Download/web-proxy-project/) قرار میدهد - اجرای دوبارهاش بیخطر است — مراحلی که قبلاً کامل شدهاند را دوباره انجام نمیدهد
آپلود خودکار با SFTP (اختیاری)
در پایان اجرای اسکریپت، این سؤال از شما پرسیده میشود:
Do you have SFTP/SSH access to Katabump and want to upload now? [y/N]اگر y را بزنید، از شما میخواهد همان آدرس SFTP را که پنل نشانتان میدهد پیست کنید (مثل sftp://user.katabump.fr:2022) — اسکریپت خودش هاست و پورت را از آن جدا میکند، و اگر یوزرنیم هم داخل آدرس بود (مثل فرمت Orihost) دیگر جداگانه یوزرنیم نمیپرسد. پسورد هم همان پسورد پنل شماست که خود دستور آپلود موقع اتصال از شما میپرسد.
پیدا کردن اطلاعات SFTP:
Katabump: از منوی سهخط (☰) بالا سمت چپ پنل، بروید به بخش Settings — آدرس و یوزرنیم SFTP همانجاست.
Orihost: در پایین صفحه، بخش Files را باز کنید و گزینهی SFTP Connection Details را بزنید.
📷 تصویر ۱ از ۲:

📷 تصویر ۲ از ۲:

اگر n بزنید یا فقط Enter بزنید، این بخش رد میشود و فقط پوشهی آماده در Downloads گوشیتان میماند تا خودتان دستی (از File Manager وب پنل) آپلودش کنید.
روش دستی (فقط اگر میخواهید خودتان انجام دهید)
اگر ترجیح میدهید دستی جلو بروید، این بخش را باز کنید
اگر اسکریپت بالا را اجرا کردید، نیازی به خواندن این بخش نیست — مستقیم بروید سراغ چه فایلهایی را باید خودتان تغییر دهید.
مرحله ۱: نصب پیشنیازهای Termux
pkg update && pkg upgrade
pkg install golang git openssl-tool cloudflared opensshمرحله ۲: ساخت فایل tproxy-server
git clone https://github.com/telegramdesktop/tproxy-server.git
cd tproxy-server
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -buildvcs=false \
-o ../tproxy-server-linux ./cmd/tproxy-serverمرحله ۳: ساخت فایل mtg
git clone https://github.com/9seconds/mtg.git mtg-v1
cd mtg-v1
git checkout v1.0.12
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -buildvcs=false \
-o ../mtg-v1-linux .مرحله ۴: ساخت کد اختصاصی (سکرت)
openssl rand -hex 16خروجی یک رشتهی ۳۲ کاراکتری است — این را در مرحلهی بعد در profiles.json میگذاریم و در لینک نهایی تلگرام هم همین مقدار استفاده میشود.
مرحله ۵: تنظیم فایلهای کانفیگ
config.json
{
"public_hostname": "your-domain.example.com",
"base_path": "",
"listen": "127.0.0.1:8080",
"admin_listen": "127.0.0.1:8081",
"public_upstream": "http://127.0.0.1:3000",
"token_key_file": "./token.key",
"static_routes": "exact",
"profiles_file": "./profiles.json",
"enable_pprof": false,
"limits": {
"max_sessions_global": 128,
"max_streams_global": 4096
},
"timeouts": {
"backend_dial": "5s",
"long_poll": "25s",
"reconnect_grace": "2m",
"idle": "75s"
}
}فقط خط public_hostname را با دامین خودتان جایگزین کنید؛ بقیه را دست نخورده نگه دارید.
profiles.json
{
"profiles": [
{
"name": "primary",
"secret": "REPLACE_WITH_YOUR_OWN_32_HEX_SECRET",
"backend": "127.0.0.1:2398",
"carrier_mode": "https"
}
]
}فقط خط secret را با کدی که در مرحلهی ۴ ساختید جایگزین کنید.
cf-config.yml (فقط اگر دامین اختصاصی دارید)
tunnel: tproxy
credentials-file: ./YOUR-TUNNEL-UUID.json
ingress:
- hostname: your-domain.example.com
service: http://localhost:8080
originRequest:
httpHostHeader: your-domain.example.com
- service: http_status:404اگر از حالت Quick Tunnel استفاده میکنید، اصلاً نیازی به این فایل نیست.
یک سایت قلابی ساده
باید یک index.html ساده هم آماده کنید — هر صفحهی معمولی کافی است، فقط باید شبیه یک سایت واقعی بهنظر برسد.
مرحله ۶: انتخاب روش تانل
دو راه برای اتصال سرورتان به اینترنت وجود دارد:
Quick Tunnel (سادهترین، بدون نیاز به دامین)
هیچ ثبتنامی نمیخواهد. مناسب تست سریع، اما لینک هر بار که سرور را دوباره اجرا کنید عوض میشود.
Named Tunnel (پایدار، نیاز به دامین دارد)
یک آدرس ثابت روی دامین خودتان — لینک همیشه یکی میماند.
:::
چه فایلهایی را باید خودتان تغییر دهید؟
اگر از اسکریپت استفاده کردید
این مقادیر را خود اسکریپت از شما پرسید و مستقیم توی فایلها نوشت — این جدول بیشتر برای روش دستی است، یا برای وقتی که میخواهید دوباره چک کنید همهچیز درست نوشته شده (همان کاری که جدول پایانی خود اسکریپت هم انجام میدهد).
| فایل | چه چیزی را عوض کنید |
|---|---|
profiles.json | فیلد secret |
config.json | فیلد public_hostname |
cf-config.yml (فقط Named Tunnel) | hostname، credentials-file، httpHostHeader |
my-site/index.html | محتوای صفحه (هر HTML سادهای) |
متغیر محیطی MTG_PUBLIC_IPV4 | مقدار IP:PORT که پنل به شما داده |
متغیر محیطی QUICK_TUNNEL | 1 برای حالت Quick Tunnel، خالی برای Named Tunnel |
فایلهایی که نباید دستی بسازید یا ویرایش کنید: token.key و status.html — اینها را خود اسکریپت میسازد.
اجرا روی Katabump
فایلهای زیر باید در ریشهی پروژه باشند:
main.py
config.json
profiles.json
cf-config.yml
tproxy-server-linux
mtg-v1-linux
cloudflared
my-site/index.htmlتنظیم PY FILE در پنل Katabump
در پنل Katabump، از بخش Startup، فیلد PY FILE را پیدا کنید و مقدارش را به main.py تغییر دهید — در غیر این صورت پنل نمیداند کدام فایل را اجرا کند.
برای اجرا با Quick Tunnel باید در کد پایتون، مقدار QUICK_TUNNEL را از 0 به مقدار 1 تغییر دهید:
# auto-detects it and rewrites config.json + status.html each time.
QUICK_TUNNEL = os.environ.get("QUICK_TUNNEL", "0") == "1"
QUICK_TUNNEL_URL_RE = re.compile(r"https://([a-zA-Z0-9.-]+\.trycloudflare\.com)")برای اجرا با Named Tunnel:
python /home/container/main.pyنکات فیلترینگ و انتخاب دامین
بعضی اپراتورها دامینهای سابدامین رایگان و شناختهشده (مثل dpdns.org, ggff.net, filegear-sg.me) را در سطح DNS مسدود میکنند، مستقل از اینکه پشت آنها چه سروری است. با توجه به این تجربه، گزینهها به این ترتیب پیشنهاد میشوند:
۱. خرید یک دامین شخصی (توصیهی اصلی)
مطمئنترین راه. یک دامین بدون سابقه (حتی ارزانترین TLDها مثل .xyz یا .online) شانس بیشتری برای عبور از فیلترینگ دارد.
۲. Cloudflare Quick Tunnel
اگر خرید دامین فعلاً مقدور نیست، دامین trycloudflare.com (متعلق به خود Cloudflare) گزینهی بعدی است. تنها ایرادش این است که لینک هر بار که سرور را دوباره اجرا کنید عوض میشود.
۳. DigitalPlat FreeDomain
از dash.domain.digitalplat.org میتوانید رایگان یک سابدامین (.us.kg, .qzz.io, .qd.je, .xx.kg) ثبت کنید.
احتیاط لازم است
dpdns.org هم متعلق به همین ارائهدهنده است. قبل از اتکای جدی به این گزینه، حتماً از شبکهی موردنظرتان تستش کنید.
عیبیابی رایج
| خطا | راهحل |
|---|---|
unknown field "_comment" | فقط فیلدهای مستندشده را در فایلهای JSON نگه دارید |
پرمیژن profiles.json | خود اسکریپت خودکار درستش میکند |
token_key_file: no such file | خود اسکریپت یکبار میسازدش |
incorrect first byte of secret | باید حتماً از mtg نسخهی ۱ استفاده کنید، نه نسخهی ۲ |
cannot resolve any public address | مقدار MTG_PUBLIC_IPV4 را تنظیم کنید |
| کلاینت روی «در حال اتصال» میماند | مطمئن شوید public_hostname با دامین واقعی یکی است |
راهنما و پشتیبانی
راهنمایی بیشتر
در صورت مواجهه با هرگونه سوال یا مشکل، میتوانید از راههای زیر با ما در ارتباط باشید:
- مستندات رسمی پروژه: tproxy-server در گیتهاب
- پروژهی mtg: 9seconds/mtg
توضیحات تکمیلی (برای علاقهمندان)
چرا CGO_ENABLED=0 لازم است؟
موقع کامپایل کردن با Go در ترموکس، اگر CGO فعال باشد، کامپایلر سعی میکند بخشهایی از کد را با ابزار C مخصوص معماری خودِ گوشی (ARM) بسازد، در حالی که سرور به نسخهی amd64 نیاز دارد. همین باعث خطاهای عجیب کامپایل میشود. با CGO_ENABLED=0 کل این بخش دور زده میشود و کراسکامپایل تمیز انجام میشود.
چرا باید حتماً mtg نسخهی ۱ باشد؟
نسخهی ۲ فقط سکرتهای نوع FakeTLS (شروعشونده با ee) را قبول میکند، در حالی که tproxy-server فقط سکرتهای کلاسیک یا نوع dd را معتبر میداند. این دو با هم سازگار نیستند، پس باید از نسخهی ۱ که فرمت کلاسیک را میپذیرد استفاده کرد.
چرا httpHostHeader در cf-config.yml لازم بود؟
tproxy-server بر اساس هدر Host تصمیم میگیرد که آیا درخواست واقعی تلگرام است یا یک بازدیدکنندهی معمولی. باید مطمئن شد Cloudflare همیشه همان دامین اصلی را بهعنوان Host به سرور تحویل میدهد، نه چیز دیگری.
mtg چرا به IP عمومی نیاز دارد؟
mtg برای صحبت با سرورهای واسط خود تلگرام، باید بداند از چه آدرس عمومیای قابلدسترس است. روی هاستهای رایگانی مثل Katabump که پشت یک لایهی شبکهی داخلی هستند، این آدرس را نمیتواند خودش حدس بزند، پس باید صریح در MTG_PUBLIC_IPV4 داده شود.