Files
Rus_VPS/README.md
T

155 lines
14 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.
# Rus_VPS
Единая российская точка входа для клиентов к нашему зарубежному парку VPS.
Клиент получает конфиг только до Rus_VPS. Российский трафик уходит с хаба напрямую,
зарубежный — по VLESS-туннелям на выбранную для клиента зарубежную VPS
(Hetzner, Финляндия, …). Протоколы входа: VLESS, AmneziaWG, HTTP(S)-прокси для
браузера, MTProto.
> Профили хостов, диагностика и история изменений ведутся в ops-knowledge
> (`vps/adminvps-russia.md`, `vps/hetzner-big-helsinki.md`,
> `diagnostics/2026-10-21-vps-rus-noren-hub-recon.md`). Здесь — архитектура, конфиги
> (без секретов) и runbook'и хаба.
## Хосты
| Роль | Хост | IP | Состояние на 2026-10-21 (вечер) |
|---|---|---|---|
| **Хаб (вход), новый** | Миран, Санкт-Петербург (hostname тоже `rus.noren.ru`) | `91.142.94.196` | Ubuntu 22.04, обновлена. Docker CE, Tailscale-клиент `00-miran-ru`, Zabbix Agent 2, fail2ban, nftables. TCP 1080/3128 снаружи доходят. **UDP 500 режется у Мирана**, поэтому IKEv2 здесь невозможен (решили, что не нужен). Профиль: `vps/miran-russia.md` |
| Хаб, отказались | `rus.noren.ru`, ADMINVPS, Москва | `168.113.171.130` | ТСПУ режет TCP до зарубежных хостингов. ADMINVPS не пропускает входящие TCP 1080/3128. На нём развёрнут стек `p.noren.ru` (`/opt/p-noren`), но снаружи он недоступен |
| Выходы | Tailscale exit nodes парка | — | По тесту коллеги (`diagnostics/2026-10-21-vps-adminvps-russia-tailscale-exit-paths.md`): `04-zomro` лучший, `01-adminvps` запасной. С Мирана прямые пути есть до обоих (41 и 23 мс) |
## Переезд `p.noren.ru` (с fedora-xxx, XSERVER)
- Секреты и конфиги (telemt MTProto `:1080`, 3proxy `:3128`, IKEv2) скопированы без изменений.
Пользователям ничего не нужно менять. DNS `p.noren.ru` пока указывает на `168.113.171.130`.
- Схема: копия стека fedora-xxx. Userspace-Tailscale `ts-proxy` с exit node даёт SOCKS5,
через него работают telemt и 3proxy. Правило «LAN без пароля» в 3proxy убрано.
Контейнеру 3proxy нужен честный DNS: с российских хостов обычный DNS к 8.8.8.8 и 1.1.1.1
перехватывается, Quad9 отвечает честно.
- **Сделано 2026-10-21:** стек работает на Миране (`/opt/p-noren`). Выход — `04-zomro`, он
лучший по тесту коллеги, запасной — `02-cloudvps`. Проверено с XSERVER и HOSTKEY. MTProto
`:1080` и HTTP-прокси `:3128` работают со старыми секретами. IKEv2 лежит в
compose-профиле `ikev2` и не запускается. Копия на ADMINVPS остановлена.
- **Раздельная маршрутизация для HTTP-прокси (2026-10-21):** 3proxy → Xray (`ts-lan-xray`).
РФ (`geosite:category-ru`, `.ru/.su/.рф`, `geoip:ru`) уходит напрямую с IP хаба
`91.142.94.196`. Заблокированное в РФ (`ru-blocked`) и всё остальное — в туннель
`04-zomro`. Исключение: у Мирана нет маршрута до Госуслуг, поэтому они идут в туннель.
Геоданные — runetfreedom, их автообновление ещё не настроено. MTProto всегда идёт
через туннель.
- **AmneziaWG (2026-10-21):** `amnezia-awg2` (`36113/udp`). Клиенты идут по той же политике,
что и прокси: nft-пометка + TPROXY → нативный Xray `awg-router` → `ts-lan-xray`. Отказ
безопасный: если роутер лежит, трафик не уходит в обход туннеля. ICMP держит
`unblock-icmp-watch`. **Зарубежный UDP работает с 2026-10-21:** туннельный выход
`ts-lan-xray` теперь идёт через kernel-mode Tailscale `ts-vpn` (`00-miran-ru-vpn`, выход
`04-zomro`) и SOCKS `xray-exit` в его netns. Userspace `ts-proxy` UDP не передаёт и
остался только для MTProto. Инструмент:
`tools/amnezia-split-routing` в ops-knowledge.
- DNS `p.noren.ru` уже на `91.142.94.196` (TTL 86400 — до суток кэша).
- **Было в плане:** переключить публичный A-запись `p.noren.ru` на `91.142.94.196` — сделано. Внутренний
DNS XSERVER (`192.168.0.2`) отдаёт `p.noren.ru → 192.168.0.10` (старый fedora-xxx);
поменять, когда fedora-xxx будут выводить.
## Результаты разведки (2026-10-21)
- Канал хаб → big-helsinki: RTT 64 мс. 20 МБ по SSH прошли за 5,2 с, «заморозки после
15–20 КБ» нет. Зарубежный TLS в целом работает: Cloudflare 10 МБ ≈ 237 Мбит/с.
С настоящим VLESS/REALITY ещё не проверяли.
- `hel1/fsn1-speed.hetzner.com` с хаба не открываются (0 байт, таймаут). Как контроль
их не использовать.
- **GeoIP хаба расходится.** MaxMind считает `168.113.171.130` адресом в **США**,
ip-api и ipinfo — в РФ. Российские сайты с гео-фильтрацией по MaxMind могут
посчитать «прямой» трафик с хаба зарубежным.
- Локальный DNS — `195.208.4.1` (НСДИ). Заблокированные домены (YouTube, Instagram)
через него не резолвятся. Зарубежные имена нужно резолвить через туннель или DoH.
- На хабе есть AES-NI, модуль WireGuard и `/dev/net/tun`. Для хаба нужно включить
форвардинг и BBR.
- Безопасность: root по паролю, файрвола нет, fail2ban нет. Закрыть до запуска.
## Канал хаб → выходы: проверено 2026-10-21
Из сети ADMINVPS любой TCP до зарубежных хостингов, кроме SSH, режется ТСПУ: обрыв на
~16 КБ или ноль данных. Проверено на Hetzner и на CLOUDVPS (FI) для REALITY,
TLS и raw VLESS Encryption. Тот же REALITY-клиент с HOSTKEY RU (ru-relay) работает
на ~116 Мбит/с.
**AmneziaWG v2 (UDP) до Hetzner работает чисто:** ~150 Мбит/с вниз, ~118 вверх, без
обрывов. Поэтому плечи «хаб → выход» делаем на AWG. Xray на хабе остаётся
маршрутизатором и отправляет трафик каждого выхода в его AWG-интерфейс
(`sockopt.interface` или метка + policy route). DNS для зарубежных имён — тоже через
туннель.
## Предлагаемая архитектура (черновик)
```
клиенты ──► rus.noren.ru (168.113.171.130)
├─ VLESS+REALITY :443 ─┐
├─ HTTPS-прокси │
├─ MTProto (FakeTLS) ├─► Xray (маршрутизатор)
└─ AmneziaWG (UDP) ────┘ ├─ geosite/geoip RU ──► direct (с IP хаба)
(TPROXY в Xray) ├─ клиент A ──► VLESS → big-helsinki
├─ клиент B ──► VLESS → FI-VPS
└─ группа C ──► balancer(A,B) с observatory
```
1. **Один Xray-core как маршрутизатор на хабе.** Схема уже обкатана на `ru-relay`:
VLESS+REALITY+Vision наружу, AmneziaWG/IKEv2 заводятся в Xray через TPROXY,
раздельная маршрутизация внутри Xray. Берём тот же стек, а не sing-box: опыт и
грабли уже записаны в ops-knowledge (`VLESSNONE`, `IPIfNonMatch`).
2. **Клиента определяем по учётным данным, а не по домену.** Правило маршрутизации
Xray `user` (email у UUID VLESS, логин HTTP-прокси) или `inboundTag`. У AmneziaWG —
по подсети или пиру, у MTProto — по отдельному инбаунду/секрету на группу. Домены
`p.ukiz.ru`, `p.noren.ru` полезны как адрес в конфиге: хаб можно переносить без
перевыпуска конфигов, и клиенты разделены визуально. Но у REALITY в SNI стоит
маска-домен (чужой сайт), а не наш, поэтому домен как ключ маршрутизации там не
работает. Работает он только для TLS с нашими сертификатами (XHTTP/WS,
HTTPS-прокси).
3. **Что считать «RU».** `geosite:category-ru` + `geoip:ru` из
`runetfreedom/russia-v2ray-rules-dat` (обновляется ежедневно), плюс `.ru/.su/.рф`.
Всё остальное идёт в туннель. Обязательно проверить с хаба банки, Госуслуги и
маркетплейсы клиентов: см. GeoIP=US выше.
4. **Туннели хаб → выходы.** Основной — VLESS+REALITY+Vision (TCP), резервный — XHTTP.
Каждый выход — отдельный outbound. Для групп клиентов — `balancer` + `observatory`,
чтобы при падении выхода переключаться автоматически.
5. **Выход на big-helsinki.** Порт `:443` занят nginx (stream `ssl_preread`).
Варианты: (а) добавить SNI-маршрут в существующий nginx на локальный инбаунд Xray
(REALITY за `ssl_preread` работает); (б) отдельный порт. Вариант (а) незаметнее, но
правит боевой nginx арендатора — согласовать. Принимать соединения только с
`168.113.171.130`.
6. **MTProto.** telemt на хабе ходит к DC Telegram через туннель: с хаба
`api.telegram.org` даёт таймаут. Проверить, умеет ли текущий telemt upstream
SOCKS5. Если нет — клиентский FakeTLS принимать на хабе и через VLESS-туннель
пробрасывать в telemt на выходе.
7. **HTTP-прокси для браузера.** Только с TLS (HTTPS-прокси) и аутентификацией: обычный
HTTP-прокси передаёт логин открытым текстом по сети РФ.
8. **DNS.** Встроенный DNS Xray: RU-домены — через `77.88.8.8` напрямую, остальные —
DoH через туннель. Время по chrony: REALITY чувствителен к сдвигу часов.
9. **Общее.** nftables по умолчанию drop, открыты только порты хаба. SSH — только по
ключу. Метрики Xray (stats API) по пользователям — в Zabbix. Конфиги хранятся в этом
репо шаблонами, секреты — вне git.
## Риски
- Хаб — единая точка отказа и единая точка блокировки для всех клиентов. Нужен второй
RU-вход (хотя бы холодный) и короткий TTL у клиентских `p.*` имён.
- Мобильные «белые списки»: ради них во многом и нужен российский вход. Доступность
`168.113.171.130` с мобильных операторов в режиме ограничений нужно проверить
отдельно, со стороны клиента.
- Из-за MaxMind=US часть «прямого» RU-трафика может видеться сайтам как зарубежный.
## Открытые вопросы
- Можно ли ставить Xray-выход на боевой big-helsinki, и каким способом: через nginx
SNI или на отдельном порту?
- Какие клиенты/домены переезжают первыми, и какие выходы за ними закреплены?
- Устраивает ли, что RU-трафик всех клиентов выходит с одного IP хаба?
## Ближайшие шаги
1. Хаб: hardening (ключи, nftables, fail2ban), `ip_forward`, BBR, chrony.
2. Xray на хабе + один VLESS-туннель до big-helsinki. Проверить реальный REALITY-канал
на объёме.
3. Первый инбаунд (VLESS) для тестового клиента, проверить split: RU напрямую, остальное
через Хельсинки.
4. Затем AmneziaWG → TPROXY, HTTPS-прокси, MTProto.