9.9 KiB
План: MTProto + сайт-заглушка на VPS Германия (один порт 443)
Развёртывание MTProto proxy с TLS-camouflage и статическим сайтом на одном порту 443 на VPS в Германии (185.103.253.99). VPN (AmneziaWG) остаётся на текущем кастомном порту без изменений.
Цель
- Один порт 443: при заходе по HTTPS на домен — отдаётся обычный сайт; при подключении Telegram с секретом — трафик идёт в MTProto. Для DPI/проверок сервер выглядит как обычный веб-сайт.
- Домен: katykhin.store (A-запись на 185.103.253.99).
- VPN: без изменений, порт 33118/UDP (AmneziaWG), текущие конфиги клиентов и роутера не трогаем.
Архитектура
Клиент (браузер) → 443 → mtg → (нет секрета) → nginx:993 → статический сайт
Клиент (Telegram + proxy) → 443 → mtg → (есть секрет) → MTProto → Telegram DC
- mtg слушает 0.0.0.0:443. По первым байтам определяет: если передан корректный dd-secret — обрабатывает как MTProto; иначе перенаправляет соединение на cloak-port (nginx на 993).
- Nginx слушает 127.0.0.1:993 (или 0.0.0.0:993) с TLS, отдаёт статический сайт по Let's Encrypt для katykhin.store.
- AmneziaWG — как сейчас, порт 33118/UDP, конфигурация не меняется.
Выбор mtg (а не nginx stream + официальный MTProxy): один компонент на 443, встроенная логика «секрет → MTProto, иначе → cloak», меньше точек отказа и проще отладка. Избегаем связки обфускация + MTProxy на одном сервере.
Как это работает
Потоки трафика
-
Обычный HTTPS (браузер / curl):
- Клиент устанавливает TLS‑соединение на
katykhin.store:443. mtgпринимает соединение, не видит корректного MTProto‑секрета и прокидывает его на nginx поlocalhost:993(cloak‑порт).- Nginx завершает TLS, отдаёт статический сайт (
/var/www/katykhin.store), сертификат — Let's Encrypt дляkatykhin.store.
- Клиент устанавливает TLS‑соединение на
-
Telegram с MTProto‑proxy (с правильным секретом):
- Клиент шлёт fake‑TLS трафик с секретом (
ee…). mtgраспознаёт секрет и работает как MTProto‑прокси: устанавливает соединение с Telegram DC и пересылает трафик через себя.- Для внешнего наблюдателя подключение всё равно идёт на
katykhin.store:443по TLS.
- Клиент шлёт fake‑TLS трафик с секретом (
-
Неверный/отсутствующий секрет, “чужой” клиент или plain HTTP на 443:
- Соединение уходит в nginx на 993.
- TLS‑клиенты (обычный
openssl s_client, браузер) получают нормальный сертификат и ответ 200. - Plain HTTP на 443 получает от nginx стандартный
400 The plain HTTP request was sent to HTTPS port.
Роль отдельных компонентов
-
mtg (fake TLS / obfuscated secret):
- Слушает
0.0.0.0:443. - Секрет сгенерирован как
mtg generate-secret -c katykhin.store tls(префиксee…, fake TLS). - Если секрет корректный — MTProto; если нет — прокидка на nginx (cloak‑порт).
- Слушает
-
nginx:
- Слушает
993/tcpс TLS, работает только как backend для mtg. - Для любого валидного TLS‑клиента выглядит как обычный сайт с Let’s Encrypt‑сертификатом.
- Слушает
-
AmneziaWG:
- Продолжает слушать
33118/udpна VPS, используется для VPN‑туннеля и никак не завязан на MTProto/HTTPS.
- Продолжает слушать
Маскировка и безопасность
-
TLS‑маскировка:
- Сертификат: Let’s Encrypt, CN=
katykhin.store, TLS 1.3. - При проверке через
curl -Ivиopenssl s_clientсервер ведёт себя как одиночный нормальный HTTPS‑хост. - Никаких самоподписанных сертификатов или нестандартных портов.
- Сертификат: Let’s Encrypt, CN=
-
Fake TLS / obfuscated secret:
- Используется
mtgс режимом fake TLS, секрет видаee…. - Без секрета MTProto не “торчит наружу”: active probing с обычным TLS видит только сайт или стандартную ошибку HTTPS‑порта.
- Используется
-
Firewall (ufw):
- Входящие разрешены только:
22/tcp— SSH.80/tcp— HTTP (для выдачи/продления сертификатов).443/tcp— MTProto+HTTPS (mtg).33118/udp— AmneziaWG.
993/tcpне открыт наружу — им пользуется только mtg локально.
- Входящие разрешены только:
-
Rate limiting и fail2ban:
- В nginx включён лимит запросов и соединений на сервере
katykhin.store(cloak‑порт 993):limit_req_zone~ 10 r/s на IP,burst=20.limit_conn~ 10 одновременных соединений на IP.
fail2ban:- jail
sshd— защита от перебора паролей по SSH. - jail
nginx-limit-reqнастроен, но в текущей схеме почти не срабатывает (см. примечание ниже).
- jail
- В nginx включён лимит запросов и соединений на сервере
Важно: запросы к nginx на 993 приходят от mtg (127.0.0.1), поэтому в логах nginx реальные клиентские IP не видны, и nginx-limit-req практически не пригоден для блокировки внешних адресов. Основная практическая защита здесь — rate limiting самого nginx и jail sshd в fail2ban.
Использование
MTProto‑proxy
-
Параметры прокси:
- Сервер:
katykhin.store(или напрямую IP185.103.253.99). - Порт:
443. - Секрет:
eecf027cbd3a05d5ff99a18796a51958516b6174796b68696e2e73746f7265.
- Сервер:
-
Готовые ссылки:
- Через t.me:
https://t.me/proxy?server=katykhin.store&port=443&secret=eecf027cbd3a05d5ff99a18796a51958516b6174796b68696e2e73746f7265 - Через tg:// по IP:
tg://proxy?server=185.103.253.99&port=443&secret=eecf027cbd3a05d5ff99a18796a51958516b6174796b68696e2e73746f7265
- Через t.me:
-
Ожидаемое поведение:
- При включении прокси Telegram устанавливает соединение на
katykhin.store:443. - Секрет распознаётся mtg, трафик уходит в Telegram DC.
- Снаружи это выглядит как обычный HTTPS‑трафик к сайту.
- При включении прокси Telegram устанавливает соединение на
VPN (AmneziaWG)
- Конфигурация VPN не менялась:
- Сервер:
185.103.253.99. - Порт:
33118/udp. - Все существующие клиенты/роутер продолжают использовать старые конфиги.
- Сервер:
MTProto и VPN живут независимо: MTProto занимает 443/tcp, AmneziaWG — 33118/udp.
Мониторинг и отладка (на уже развёрнутой схеме)
-
mtg:
- Текущий статус сервиса:
systemctl status mtg. - Живые логи:
journalctl -u mtg -f.
- Текущий статус сервиса:
-
nginx:
- Доступы/ошибки по сайту:
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
- Доступы/ошибки по сайту:
-
fail2ban:
- Общий статус:
fail2ban-client status. - jail
sshd:fail2ban-client status sshd. - Разбан IP:
fail2ban-client set sshd unbanip <IP>.
- Общий статус:
Итоговая схема портов
| Порт | Служба | Доступ |
|---|---|---|
| 22/tcp | SSH | интернет |
| 80/tcp | HTTP | для certbot |
| 443/tcp | mtg | интернет |
| 993/tcp | nginx (SSL) | только localhost (для mtg cloak) |
| 33118/udp | AmneziaWG | интернет |
Ссылки и ссылка для Telegram
- Документация mtg: https://github.com/9seconds/mtg
- Руководство с cloak: https://v2how.github.io/post/2021-02-18-camouflage-telegram-mtproto-proxy-ubuntu-20-04/
- Ссылка для подключения к прокси (развёрнуто 2026-02-26):
https://t.me/proxy?server=katykhin.store&port=443&secret=eecf027cbd3a05d5ff99a18796a51958516b6174796b68696e2e73746f7265
Альтернативно по IP:tg://proxy?server=185.103.253.99&port=443&secret=eecf027cbd3a05d5ff99a18796a51958516b6174796b68696e2e73746f7265
Связь с другими документами
- Текущий VPN и доступ к VPS: VPN-сервер (VPS, AmneziaWG).
- После выполнения плана имеет смысл добавить в
vpn-vps-amneziawg.mdкраткий раздел «MTProto и сайт» со ссылкой на этот документ и указанием домена/порта.