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

173 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# План: 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
- Документация 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 и сайт» со ссылкой на этот документ и указанием домена/порта.