Enhance backup documentation for Proxmox and VPS configurations. Add details for MTProto proxy setup on VPS, clarify backup processes for Immich photos, and update restic backup scripts to exclude photo directories. Include test recovery results and refine instructions for restoring various services and configurations.
This commit is contained in:
@@ -92,4 +92,12 @@ ss -ulnp | grep 33118
|
||||
|
||||
Параметры обфускации на обоих серверах (Германия и США) **одинаковые** — конфиг можно полностью перенести на новый сервер при переезде. На роутере создаётся второе VPN-подключение; переключение между Germany и USA — выбор нужного профиля.
|
||||
|
||||
→ **Подробно:** [Перенос конфигурации AmneziaWG между серверами](vpn-migrate-config.md).
|
||||
→ **Подробно:** [Перенос конфигурации AmneziaWG между серверами](vpn-migrate-config.md).
|
||||
|
||||
---
|
||||
|
||||
## MTProto и сайт-заглушка (план)
|
||||
|
||||
На этом же VPS можно развернуть MTProto proxy с маскировкой под обычный HTTPS-сайт (один порт 443): при заходе на домен — статический сайт, при подключении Telegram с секретом — прокси. Домен: katykhin.store. VPN (AmneziaWG) при этом остаётся на порту 33118/UDP без изменений.
|
||||
|
||||
→ **План развёртывания:** [MTProto + сайт на VPS Германия (план)](vpn-vps-mtproto-site-plan.md).
|
||||
|
||||
112
docs/vps/vpn-vps-mtproto-check-report.md
Normal file
112
docs/vps/vpn-vps-mtproto-check-report.md
Normal file
@@ -0,0 +1,112 @@
|
||||
# Отчёт проверки MTProto + маскировка (katykhin.store)
|
||||
|
||||
Проверки выполнены **с внешней консоли** (без SSH на сервер) 2026-02-26. Цель: убедиться, что на 443 выглядит как обычный HTTPS, а MTProto срабатывает только при наличии секрета.
|
||||
|
||||
---
|
||||
|
||||
## 1) HTTPS сайта
|
||||
|
||||
**Команда:** `curl -I https://katykhin.store/`
|
||||
|
||||
**Результат:**
|
||||
- **HTTP/1.1 200 OK**
|
||||
- Server: nginx/1.24.0 (Ubuntu)
|
||||
- Content-Type: text/html
|
||||
|
||||
**Вывод:** Сайт отдаётся по **HTTPS**, не по HTTP. Маскировка по TLS выполнена.
|
||||
|
||||
---
|
||||
|
||||
## 2) Порт 443 и TLS
|
||||
|
||||
### Порт 443 открыт
|
||||
|
||||
**Команда:** `nc -vz katykhin.store 443`
|
||||
|
||||
**Результат:** `Connection to katykhin.store port 443 [tcp/https] succeeded!`
|
||||
|
||||
### TLS-рукопожатие и сертификат
|
||||
|
||||
**Команда:** `openssl s_client -connect katykhin.store:443 -servername katykhin.store`
|
||||
|
||||
**Результат:**
|
||||
- **Verification: OK**
|
||||
- **Сертификат:** Let's Encrypt (E8), CN=katykhin.store
|
||||
- **Срок:** NotBefore 26 Feb 2026, NotAfter 27 May 2026
|
||||
- **Протокол:** TLSv1.3, Cipher TLS_AES_256_GCM_SHA384
|
||||
- **SAN:** host "katykhin.store" в сертификате
|
||||
|
||||
**Вывод:** Внешний вид — обычный HTTPS с валидным доверенным сертификатом, без самоподписи.
|
||||
|
||||
---
|
||||
|
||||
## 3) Однострочная проверка
|
||||
|
||||
**Команда:** `curl -Iv https://katykhin.store/`
|
||||
|
||||
**Результат:**
|
||||
- TLS handshake успешен
|
||||
- Сертификат проверен (SSL certificate verify ok)
|
||||
- **HTTP/1.1 200 OK**
|
||||
- subject: CN=katykhin.store, issuer: Let's Encrypt
|
||||
|
||||
**Вывод:** Важнейшая часть маскировки выполнена: **katykhin.store:443 = обычный HTTPS**.
|
||||
|
||||
---
|
||||
|
||||
## 4) Поведение при «не-TLS» подключении к 443
|
||||
|
||||
### Сырой TCP без данных
|
||||
|
||||
**Команда:** подключение к 443 без отправки данных (nc без ввода).
|
||||
|
||||
**Результат:** Ответа нет (сервер ждёт данные). mtg перенаправил соединение на nginx:993; nginx ждёт TLS ClientHello — логично.
|
||||
|
||||
### Plain HTTP на порт 443
|
||||
|
||||
**Команда:** отправка `GET / HTTP/1.0` на 443 (без TLS).
|
||||
|
||||
**Результат:** Ответ от nginx:
|
||||
- **HTTP/1.1 400 Bad Request**
|
||||
- «The plain HTTP request was sent to HTTPS port»
|
||||
|
||||
**Вывод:** На 443 приходит трафик без MTProto-секрета → mtg отдаёт его nginx (cloak). Nginx на 993 принимает только TLS, поэтому на plain HTTP отвечает 400. Для DPI/активной проверки, которые делают **нормальный TLS** (как браузер или `openssl s_client`), будет обычный HTTPS и страница сайта. Plain HTTP на 443 даёт только 400 от nginx, а не MTProto.
|
||||
|
||||
---
|
||||
|
||||
## 5) Итоговая таблица поведения
|
||||
|
||||
| Подключение | Ожидание по плану | Факт |
|
||||
|--------------------------|--------------------------|-------------------------------|
|
||||
| Браузер / curl HTTPS | Сайт-заглушка, 200 | ✅ HTTP/1.1 200, nginx, TLS |
|
||||
| TLS (openssl s_client) | Валидный HTTPS | ✅ Let's Encrypt, TLS 1.3 |
|
||||
| Telegram с MTProto | Работа прокси | ✅ Подтверждено пользователем |
|
||||
| Plain HTTP на 443 | Не MTProto | ✅ 400 от nginx (HTTPS port) |
|
||||
| Соединение без данных | Нет «сырого» HTTP-ответа| ✅ Нет ответа (ожидание TLS) |
|
||||
|
||||
---
|
||||
|
||||
## 6) Что не проверялось из консоли (нужен сервер или устройство)
|
||||
|
||||
- **Логи nginx** (access.log / error.log) — нужен SSH.
|
||||
- **Логи mtg** (принятые соединения с секретом) — нужен SSH.
|
||||
- **Проверка из РФ** (iPhone/устройство в целевой сети, без общего VPN, с MTProto) — нужно выполнить у тебя.
|
||||
- **Симуляция активного probing** уже по сути сделана: `openssl s_client` к 443 ведёт себя как обычный HTTPS-клиент и получает нормальный TLS и сайт.
|
||||
|
||||
---
|
||||
|
||||
## 7) Частые ошибки — статус
|
||||
|
||||
| Риск | Статус |
|
||||
|-----------------------------|--------|
|
||||
| Сайт только по HTTP | ❌ Нет: HTTPS отвечает 200 |
|
||||
| Самоподписанный сертификат | ❌ Нет: Let's Encrypt |
|
||||
| MTProto на нестандартном порту | ❌ Нет: используется 443 |
|
||||
| Не-MTProto видит прокси | ❌ Нет: без секрета — nginx/сайт или 400 |
|
||||
|
||||
---
|
||||
|
||||
## Краткий вывод
|
||||
|
||||
**Сеть видит katykhin.store:443 как обычный HTTPS** (валидный сертификат, TLS 1.3, ответ 200 на GET /).
|
||||
Только клиент с правильным MTProto-секретом попадает на прокси; остальное идёт в nginx (сайт или 400 на plain HTTP). Маскировка настроена корректно.
|
||||
172
docs/vps/vpn-vps-mtproto-site-plan.md
Normal file
172
docs/vps/vpn-vps-mtproto-site-plan.md
Normal file
@@ -0,0 +1,172 @@
|
||||
# План: 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 и сайт» со ссылкой на этот документ и указанием домена/порта.
|
||||
Reference in New Issue
Block a user