From f4366577452cb598a04f5443123bdcf482ece6f5 Mon Sep 17 00:00:00 2001 From: "Satur@it-depot.ru" Date: Wed, 21 Oct 2026 12:14:50 +0300 Subject: [PATCH] README: hub architecture draft, recon results, hub-to-exit transport findings Rus_VPS (rus.noren.ru) as single RU entry with split routing to the foreign fleet. From ADMINVPS every TCP transport to foreign hosting except SSH is cut by TSPU; AmneziaWG v2 (UDP) to Hetzner carries ~150 Mbit/s. Co-Authored-By: Claude Opus 5.5 --- README.md | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/README.md b/README.md index e89d9e2..dd9acc4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,122 @@ # 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 | +|---|---|---|---| +| Хаб (вход) | `rus.noren.ru`, ADMINVPS, Москва | `168.113.171.130` | Ubuntu 24.04, чистая база: только sshd + zabbix-agent2. IPv6 нет. `ip_forward=0` | +| Тестовый выход | `big-helsinki`, Hetzner, Хельсинки | `46.62.192.219` | **Боевой многоарендный хост** (telemt, AmneziaWG ×2, OpenClaw, Nordway; клиенты 39/47). `:443` занят nginx SNI-роутером | + +## Результаты разведки (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.