167 lines
15 KiB
Markdown
167 lines
15 KiB
Markdown
# 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.
|