2026-10-21 17:43:24 +03:00

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.
  • VLESS (2026-10-21): VLESS + REALITY + Vision на 91.142.94.196:443, SNI www.spbu.ru. Это второй inbound в ts-lan-xray, правило маршрутизации то же (РФ напрямую, остальное через 04-zomro, UDP работает). Клиент пока один — noren-shared. Параметры и ссылка лежат на хосте в /opt/p-noren/vless-clients.env, в git их нет. Для каждого клиента лучше заводить свой UUID.
  • Резервный выход (2026-10-21): AmneziaWG до CloudVPS (78.17.12.7:39928) в контейнере awg-backup с Xray SOCKS xray-backup. В ts-lan-xray стоит балансировщик egress: основной — Tailscale/ZOMRO, резерв — CloudVPS, проверка раз в 30 с. Проверено: на резерв переключается за ~24 с, обратно за ~27 с, российский трафик не затрагивается. REALITY до CloudVPS:8443 с Мирана нестабилен (4/15) и не используется. MTProto (telemt) тоже с резервом: у него второй upstream через awg-backup. Telemt распределяет соединения между обоими путями и при отказе переходит на живой — проверено.
  • 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.
S
Description
No description provided
Readme
84 KiB