Files
homelab-docs/docs/vps/vpn-vps-mtproto-site-plan.md

9.9 KiB
Raw Blame History

План: 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 с MTProtoproxy (с правильным секретом):

    • Клиент шлёт fakeTLS трафик с секретом (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клиента выглядит как обычный сайт с Lets Encryptсертификатом.
  • AmneziaWG:

    • Продолжает слушать 33118/udp на VPS, используется для VPNтуннеля и никак не завязан на MTProto/HTTPS.

Маскировка и безопасность

  • TLSмаскировка:

    • Сертификат: Lets 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.


Использование

MTProtoproxy

  • Параметры прокси:

    • Сервер: 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 <IP>.


Итоговая схема портов

Порт Служба Доступ
22/tcp SSH интернет
80/tcp HTTP для certbot
443/tcp mtg интернет
993/tcp nginx (SSL) только localhost (для mtg cloak)
33118/udp AmneziaWG интернет

Ссылки и ссылка для Telegram


Связь с другими документами

  • Текущий VPN и доступ к VPS: VPN-сервер (VPS, AmneziaWG).
  • После выполнения плана имеет смысл добавить в vpn-vps-amneziawg.md краткий раздел «MTProto и сайт» со ссылкой на этот документ и указанием домена/порта.