آموزش ساختن پروکسی MTProto برای تلگرام

آموزش ساختن پروکسی MTProto تلگرام #

در این نوشتار، یک پراکسی با پروتکل MTProto را گام به گام می‌سازیم.

MTProto-chad

انواع پیاده‌سازی‌ها #

در سمت سرور پیاده‌سازی‌های گوناگونی در زبان‌های مختلف برای این پروتکل نوشته شده است. برای هر کدام از این راهکار‌ها، اسکریپت‌های نصبی وجود دارد که فرآیند راه‌اندازی سمت سرور را راحت می‌کند.

پروژه#مشارکت‌کنندگانتازه‌ترین کامیت#ستاره‌های گیت‌هابزبان
TelegramMessenger/MTProxy رسمی11Oct. 20194.2kC
alexbers/mtprotoproxy14فعال1.4kPython
seriyps/mtproto_proxy3فعال0.36kErlang
9seconds/mtg18فعال1.6kGo

پیاده‌سازی mtg #

ما در اینجا از پروژه‌ی 9seconds/mtg بدون اسکریپت استفاده می‌کنیم. ویژگی‌های این پروژه که در README آن قابل خواندن است شامل موارد زیر می‌شود:

  • مقاومت در برابر حمله‌ی تکرار بسته (replay attack)
  • جلونهادن دامنه‌ی استتار (domain fronting)
  • faketls

تفاوت این پروژ‌ه با سایرین، تاکید طراحش بر موارد زیر است:

  • کم مصرفی برنامه تا در VPS های با منابع پایین و در نتیجه ارزان هم قابل راه‌اندازی باشد
  • راحتی در deploy کردن
  • تک رمزه‌ بودن (single secret)
  • پشتیبانی نکردن از adtag در نسخه‌ی ۲
  • نداشتن رابط کاربری تحت وب برای مدیریت
  • لیست مسدود‌کردن IPهای مشکوک، پیاده‌سازی شده به صورت محلی (native)
  • قابلیت ترکیب با v2ray, trojan, Gost و کاربری به شکل کتابخانه

‌نویسنده‌ی این پیاده‌سازی فلسفه‌ای دارد مبنی بر اینکه پراکسی چیزی است که به صورت خصوصی بین چند ده نفر پخش می‌شود. تا جای ممکن باید سعی شود از سامانه‌ی سانسور پنهان بماند. در صورت کشف هم باید بتوان به سرعت در سرور دیگری راه‌اندازی مجدد کرد. در نتیجه در نسخه‌ی ۲، دیگر از adtag پشتیبانی نمی‌شود.

گام‌های راه‌اندازی #

فرض می‌شود که دامنه‌ و سرور VPS با دسترسی root دارید.

  1. ایجاد زیردامنه در یک سرویس DNS مثل CloudFlare و مرتبط ساختن زیردامنه به IP سرور

به این راهنما مراجعه شود.

پس از این مرحله، در سمت کلاینت یک ping بگیرید تا از درستی تنظیمات مطمئن شوید:

# this should point to your server IP
ping my.domain.name
  1. بالا آوردن وبسایت استتار

یک وبسایت معمولی تحت HTTPS در پورت ۴۴۳ بالا بیاورید. پورت ۸۰ را هم به همینجا redirect کنید. هر روشی که بلدید را می‌توانید انجام دهید (مثل nginx, apache, etc) یا اینکه از روشی که در ادامه می‌آید استفاده کنید:

مراحل ۲ و ۳ از این بخش را انجام دهید با این تفاوت‌ها:

  • محتویات ریشه‌ی سایت (root) باید در آدرس /var/www/ باشد:
hugo --minify --themesDir ../.. --destination /var/www/
  • سرور HTTP با systemd مدیریت شود:

این کار از این جهت انجام می‌شود که اگر سرور خاموش/روشن شد، سایت دوباره بالا بیاید.

تنظیم caddy:

$ cat /etc/caddy/Caddyfile
my.domain.name {
    root * /var/www/
    # Enable the static file server.
    file_server
    log {
        output file /var/log/caddy/decoy-site.log
    }
}

روشن کردن سرویس caddy:

systemctl daemon-reload
systemctl enable caddy
systemctl restart caddy
# caddy should be up and running
systemctl status caddy
# test my.domain.name from your client to make sure website is up
  1. نصب mtg در سرور
# download proper version from https://github.com/9seconds/mtg/releases 
wget "https://github.com/9seconds/mtg/releases/download/v2.1.7/mtg-2.1.7-linux-amd64.tar.gz"
# extract and move mtg binary to /usr/local/bin/mtg
  1. تنظیم mtg

رمز را بسازید:

mtg generate-secret my.domain.name

تنظیمات mtg را بسازید:

$ cat /etc/mtg.toml
secret = "your-secret-here"
bind-to = "0.0.0.0:2086"
doh-ip = "1.1.1.1"

# prometheus metrics integration.
[stats.prometheus]
# enabled/disabled
enabled = true
# host:port where to start http server for endpoint
bind-to = "127.0.0.1:1212"
# prefix of http path
http-path = "/"
# prefix for metrics for prometheus
metric-prefix = "mtg"

این تنظیمات بیانگر این است که پورت دسترسی عمومی پراکسی روی ۲۰۸۶ است. برای DNS سمت سرور از سرویس DNS-over-HTTPS کلادفلر استفاده می‌شود. همچنین برای مانیتورینگ، prometheus را به کار می‌گیریم.

سپس برای mtg یک فایل سرویس بسازید:

$ cat /etc/systemd/system/mtg.service
[Unit]
Description=mtg - MTProto proxy server
Documentation=https://github.com/9seconds/mtg
After=network.target

[Service]
ExecStart=/usr/local/bin/mtg run /etc/mtg.toml
Restart=always
RestartSec=3
DynamicUser=true
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

سرویس را روشن کنید:

systemctl daemon-reload
systemctl enable mtg
systemctl start mtg
systemctl status mtg
  1. دیدن‌ تنظیم برای کلاینت

در آخرین مرحله، برای مشاهده‌ی کانفیگ برای set کردن در سمت کلاینت تلگرام از دستور زیر استفاده کنید:

mtg access /etc/mtg.toml

کافیست لینک‌ tmu_url را به کاربران بدهید. اگر دقت کنید، تنظیمات به شکل کد QR هم برای share کردن راحت‌تر ایجاد شده است. می‌توانید به جای server در سمت کلاینت، از زیر‌دامنه‌ای که ایجاد کرده‌اید استفاده کنید تا در صورت کثیف شدن IP، و انتقال به سرور دیگر، کاربر مجبور نباشد مجدداً تنظیمات تازه دریافت کند.

در ادامه‌ گام‌های ایجاد کردن dashboard برای رصد پارامتر‌های تعداد اتصال، میزان ترافیک مصرفی و… پراکسی با استفاده از prometheus می‌آید.

  1. نصب prometheus
# install proper version from https://prometheus.io/docs/prometheus/latest/installation/
wget "https://github.com/prometheus/prometheus/releases/download/v2.37.5/prometheus-2.37.5.linux-amd64.tar.gz"
# extract and move prometheus binary to /usr/local/bin/
  1. تنظیم prometheus
$ cat /etc/prometheus-mtg.yml
# my global config
global:
  scrape_interval: 20s
  evaluation_interval: 20s
# A scrape configuration containing exactly one endpoint to scrape:
scrape_configs:
  # The job name is added as a label `job=` to any timeseries scraped from this config.
  - job_name: "Monitoring_MTProto"
    # metrics_path defaults to '/metrics'
    metrics_path: "mtg"
    # scheme defaults to 'http'.
    static_configs:
      - targets: ["localhost:1212"]
  1. ساخت Hash رمز‌عبور برای داشبورد مانیتورینگ تحت وب
$ apt install python3-bcrypt
$ cat /root/bin/gen-pass-prometheus.py
import getpass
import bcrypt

password = getpass.getpass("password: ")
hashed_password = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt())
print(hashed_password.decode())

$ python3 ./gen-pass.py

  1. تنظیم داشبورد تحت وب

دقت کنید که داشبورد را تحت پروتکل HTTPS بالا می‌آوریم پس به certificate نیاز است.

$ cat /etc/prometheus-mtg-web.yml
# TLS and basic authentication configuration example.
tls_server_config:
  cert_file: /etc/letsencrypt/live/my.domain.name/fullchain.pem
  key_file: /etc/letsencrypt/live/my.domain.name/privkey.pem
basic_auth_users:
  your_username: YOUR_HASHED_PASSWORD_HERE
  1. ساخت سرویس فایل برای prometheus
$ cat /etc/systemd/system/prometheus-mtg.service
[Unit]
Description=Prometheus Server for MTProto Telegram Proxy
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target

[Service]
Restart=on-failure
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus-mtg.yml \
  --web.config.file=/etc/prometheus-mtg-web.yml \
  --web.listen-address=:5050 \
  --storage.tsdb.path=/opt/prometheus/data

[Install]
WantedBy=multi-user.target
  1. روشن کردن سرویس prometheus
systemctl daemon-reload
systemctl enable prometheus-mtg.service
systemctl start prometheus-mtg.service
systemctl status prometheus-mtg.service

حال می‌توانید به https://my.domain.name:5050 رفته و وضعیت پراکسی را مانیتور کنید. مثلاً می‌توانید نمودار میزان ترافیک مصرفی کاربران بر حسب زمان یا تعداد حملات replay-attack را رسم کنید.