# План: 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`. - **Telegram с MTProto‑proxy (с правильным секретом):** - Клиент шлёт fake‑TLS трафик с секретом (`ee…`). - `mtg` распознаёт секрет и работает как MTProto‑прокси: устанавливает соединение с Telegram DC и пересылает трафик через себя. - Для внешнего наблюдателя подключение всё равно идёт на `katykhin.store:443` по 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‑хост. - Никаких самоподписанных сертификатов или нестандартных портов. - **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` настроен, но в текущей схеме почти не срабатывает (см. примечание ниже). **Важно:** запросы к nginx на 993 приходят от mtg (`127.0.0.1`), поэтому в логах nginx реальные клиентские IP не видны, и `nginx-limit-req` практически не пригоден для блокировки внешних адресов. Основная практическая защита здесь — rate limiting самого nginx и jail `sshd` в `fail2ban`. --- ## Использование ### MTProto‑proxy - **Параметры прокси:** - Сервер: `katykhin.store` (или напрямую IP `185.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` - **Ожидаемое поведение:** - При включении прокси Telegram устанавливает соединение на `katykhin.store:443`. - Секрет распознаётся mtg, трафик уходит в Telegram DC. - Снаружи это выглядит как обычный HTTPS‑трафик к сайту. ### 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 `. --- --- ## Итоговая схема портов | Порт | Служба | Доступ | |-------------|-------------|---------------| | 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). - После выполнения плана имеет смысл добавить в `vpn-vps-amneziawg.md` краткий раздел «MTProto и сайт» со ссылкой на этот документ и указанием домена/порта.