173 lines
9.9 KiB
Markdown
173 lines
9.9 KiB
Markdown
# План: 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 <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 и сайт» со ссылкой на этот документ и указанием домена/порта.
|