June 10

Настройка и установка mtproto.zig с шифрованием и обходом DPI.

Вариант А — конечный MTProto-сервер с нуля

На новом сервере:

apt update
apt install -y curl

Ставим mtproto.zig:

curl -fsSL https://raw.githubusercontent.com/sleep3r/mtproto.zig/main/deploy/bootstrap.sh | sudo bash

Потом устанавливаем сам прокси:

sudo mtbuddy install --port 443 --domain rutube.ru --middle-proxy --yes

Официальный README указывает установку через bootstrap.sh, затем mtbuddy install; в конце mtbuddy печатает готовую tg://-ссылку. Там же указано, что --domain вшивается в ссылки, поэтому его лучше выбирать один раз. (ссылка на репу GitHub)

Проверка:

sudo mtbuddy status
sudo mtbuddy config validate
sudo mtbuddy config doctor --network
sudo systemctl status mtproto-proxy --no-pager

Получить актуальную ссылку можно так:

sudo mtbuddy links

Конфиг лежит тут:

nano /opt/mtproto-proxy/config.toml

Минимально нормальные параметры:

[server]
port = 443
public_ip = "example.com" #ваш домен, подставляется вместо IP
public_port = 443
max_connections = 800
workers = 0
idle_timeout_sec = 120
handshake_timeout_sec = 15
handshake_flood_guard_enabled = false

[upstream]
type = "auto" #direct нужен, если поднято соединение awg и сервер не может достучаться до DC Telegram

[censorship]
tls_domain = "rutube.ru" #после установки менять запрещено, иначе перетрутся ссылки
mask = true
desync = true
drs = true
fast_mode = true
mask_port = 8443

[general]
use_middle_proxy = true

[access.users]
user = "ТВОЙ_32_HEX_SECRET"

После правки:

sudo mtbuddy config validate
sudo systemctl restart mtproto-proxy
sudo mtbuddy links

Вариант Б — front-прокси перед MTProto

Данный вариант будет предпочтительней, так как он позволяет налету менять IP в случае их бана со стороны РКН.

Схема такая:

Telegram-клиент
    ↓
front VPS с чистым IP :443
    ↓
backend MTProto-сервер :443
    ↓
Telegram DC

На front-сервере:

apt update
apt install -y haproxy

Открываешь конфиг:

nano /etc/haproxy/haproxy.cfg

Вставляешь:

global
    log /dev/log local0
    maxconn 50000
    daemon

defaults
    log global
    mode tcp
    option tcplog
    timeout connect 5s
    timeout client 5m
    timeout server 5m

frontend mtproto_in
    bind *:443
    default_backend mtproto_backend

backend mtproto_backend
    server mtproto IP_конечного_сервера:443 check

Проверяешь конфиг:

haproxy -c -f /etc/haproxy/haproxy.cfg

Запускаешь:

systemctl restart haproxy
systemctl enable haproxy
ss -ltnp | grep ':443'

DNS

Создаёшь новый поддомен, например:

mtp2.example.ru → IP_FRONT_СЕРВЕРА

На backend-сервере 130.49.219.132 в /opt/mtproto-proxy/config.toml ставишь:

[server]
public_ip = "mtp2.example.ru"
public_port = 443

Потом:

sudo mtbuddy config validate
sudo systemctl restart mtproto-proxy
sudo mtbuddy links

Пользователям отдаёшь новую ссылку из mtbuddy links.

В дополнение: настройка nfqws

Он делает TCP desync — fake packets + TTL-limited splits против stateful DPI. В README mtproto.zig он отдельно указан как один из DPI-модулей, а команда для донастройки после установки — sudo mtbuddy setup nfqws.

Сначала просто выполни:

sudo mtbuddy setup nfqws
sudo mtbuddy setup recovery
sudo mtbuddy config doctor --network
sudo systemctl restart mtproto-proxy

Потом проверь статус:

sudo mtbuddy status
systemctl list-units | grep -Ei 'nfqws|zapret|mtproto|recovery'
systemctl list-timers | grep -Ei 'nfqws|zapret|mtproto|recovery'

Дальше проверь, появились ли правила в firewall:

sudo iptables -t mangle -S | grep -Ei 'NFQUEUE|nfqws|443|tcp'
sudo iptables -t nat -S | grep -Ei '443|nfqws'
sudo nft list ruleset | grep -Ei 'NFQUEUE|nfqws|443|queue'

Параллельно открой логи:

sudo journalctl -u mtproto-proxy -f

И в другом окне:

sudo tcpdump -ni any tcp port 443

После этого пробуешь подключиться с мобильных данных.