آموزش ساختن پروکسی MTProto تلگرام #
در این نوشتار، یک پراکسی با پروتکل MTProto را گام به گام میسازیم.
انواع پیادهسازیها #
در سمت سرور پیادهسازیهای گوناگونی در زبانهای مختلف برای این پروتکل نوشته شده است. برای هر کدام از این راهکارها، اسکریپتهای نصبی وجود دارد که فرآیند راهاندازی سمت سرور را راحت میکند.
پروژه | #مشارکتکنندگان | تازهترین کامیت | #ستارههای گیتهاب | زبان |
---|---|---|---|---|
TelegramMessenger/MTProxy رسمی | 11 | Oct. 2019 | 4.2k | C |
alexbers/mtprotoproxy | 14 | فعال | 1.4k | Python |
seriyps/mtproto_proxy | 3 | فعال | 0.36k | Erlang |
9seconds/mtg | 18 | فعال | 1.6k | Go |
پیادهسازی mtg #
ما در اینجا از پروژهی 9seconds/mtg بدون اسکریپت استفاده میکنیم. ویژگیهای این پروژه که در README آن قابل خواندن است شامل موارد زیر میشود:
- مقاومت در برابر حملهی تکرار بسته (replay attack)
- جلونهادن دامنهی استتار (domain fronting)
- faketls
تفاوت این پروژه با سایرین، تاکید طراحش بر موارد زیر است:
- کم مصرفی برنامه تا در VPS های با منابع پایین و در نتیجه ارزان هم قابل راهاندازی باشد
- راحتی در deploy کردن
- تک رمزه بودن (single secret)
- پشتیبانی نکردن از adtag در نسخهی ۲
- نداشتن رابط کاربری تحت وب برای مدیریت
- لیست مسدودکردن IPهای مشکوک، پیادهسازی شده به صورت محلی (native)
- قابلیت ترکیب با v2ray, trojan, Gost و کاربری به شکل کتابخانه
نویسندهی این پیادهسازی فلسفهای دارد مبنی بر اینکه پراکسی چیزی است که به صورت خصوصی بین چند ده نفر پخش میشود. تا جای ممکن باید سعی شود از سامانهی سانسور پنهان بماند. در صورت کشف هم باید بتوان به سرعت در سرور دیگری راهاندازی مجدد کرد. در نتیجه در نسخهی ۲، دیگر از adtag پشتیبانی نمیشود.
گامهای راهاندازی #
فرض میشود که دامنه و سرور VPS با دسترسی root
دارید.
- ایجاد زیردامنه در یک سرویس DNS مثل CloudFlare و مرتبط ساختن زیردامنه به IP سرور
به این راهنما مراجعه شود.
پس از این مرحله، در سمت کلاینت یک ping
بگیرید تا از درستی تنظیمات مطمئن شوید:
# this should point to your server IP
ping my.domain.name
- بالا آوردن وبسایت استتار
یک وبسایت معمولی تحت 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
- نصب 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
- تنظیم 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
- دیدن تنظیم برای کلاینت
در آخرین مرحله، برای مشاهدهی کانفیگ برای set کردن در سمت کلاینت تلگرام از دستور زیر استفاده کنید:
mtg access /etc/mtg.toml
کافیست لینک tmu_url
را به کاربران بدهید.
اگر دقت کنید، تنظیمات به شکل کد QR هم برای share کردن راحتتر ایجاد شده است.
میتوانید به جای server
در سمت کلاینت، از زیردامنهای که ایجاد کردهاید استفاده کنید تا در صورت کثیف شدن IP، و انتقال به سرور دیگر، کاربر مجبور نباشد مجدداً تنظیمات تازه دریافت کند.
در ادامه گامهای ایجاد کردن dashboard برای رصد پارامترهای تعداد اتصال، میزان ترافیک مصرفی و… پراکسی با استفاده از prometheus میآید.
- نصب 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/
- تنظیم 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"]
- ساخت 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
- تنظیم داشبورد تحت وب
دقت کنید که داشبورد را تحت پروتکل 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
- ساخت سرویس فایل برای 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
- روشن کردن سرویس 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 را رسم کنید.