Это не инструкция «поставь 3x-ui и радуйся». Это то, как я принимаю решения: куда смотреть, что выбирать, какие схемы держать, чем платить за живучесть и как понимать, что именно сломалось. Всё проверено на своём парке за 2025–2026.
Реальные IP, домены, UUID и ключи здесь отсутствуют намеренно. Всё, что нужно
подставить, помечено как <...>.
1. Семь принципов, из которых растёт всё остальное
- Независимость важнее обфускации. Два-три узла в разных ASN переживают волну блокировок лучше, чем один «умный» сервер с модной маскировкой.
- Скучный реалистичный HTTPS. Трафик должен выглядеть как обычный HTTP/2/3 к обычному сайту: настоящий сертификат, живая заглушка, нормальные тайминги. Экзотика привлекает внимание сильнее, чем помогает.
- Настоящий сертификат вместо трюка. Свой домен + Let’s Encrypt + XHTTP за nginx/caddy. Reality — не замена, а дополнительный слой.
- Второй путь на другом транспорте. TCP-схему лечит одно, потери и поведенческий детект — другое. Поэтому в парке живут XHTTP, Hysteria2 (QUIC) и NaiveProxy (Chromium HTTP/2).
- DNS только внутрь туннеля. С 26.08.2026 открытые 8.8.8.8/1.1.1.1 подменяются на НСДИ. Голый публичный резолвер в клиенте = утечка и поломка.
- Один изменяемый параметр за тест. Baseline до правки, проверка после, откат под рукой. Иначе не понять, что помогло.
- IP — расходник, паттерн — капитал. Смена IP сама по себе не лечит: новый адрес с тем же видимым сервисом сгорает снова. Лечится смена видимого паттерна (CDN, reverse-relay, туннель).
2. Как выбираю сервер
Критерии
| Критерий | Что смотрю | Почему |
|---|---|---|
| Юрисдикция | Не РФ. Нидерланды/Германия/Финляндия — привычно и дёшево | РФ-хостинг под VPN запрещён офертами, плюс доступность логов |
| ASN | Малый, «не VPN-гайдовый». Не Hetzner/DO/OVH/Aeza-класс | Крупные ASN в списках и режутся подсетями |
| IP | Свежий, чистый, не из публичных списков | Старый «известный VPN» IP живёт дни |
| Смена IP | Возможна платно, без пересоздания сервера | Единственный реальный выход, когда адрес сгорел |
| Канал | 1 vCPU / 1 ГБ RAM достаточно; 100–200 Мбит/с | Больше не нужно для 5–20 человек |
| Панель | Нет панели или панель только на 127.0.0.1 | 3x-ui на публичном порту — готовый отпечаток |
| UDP | Разрешён входящий UDP (для Hysteria2) | Часто режут на нестандартных портах — знать заранее |
Проверка перед покупкой и после
# 1. Кто такой IP: происхождение, история префикса
open https://bgp.tools/ip/<IP>
open https://scamalytics.com/ip/<IP> # fraud score
open https://eais.rkn.gov.ru/ # официальный реестр
# 2. Не «VPN-подсеть» ли это: список ValdikSS (ntc.party, looking.house)
# и внешний сканер “методикой РКН” — ByeByeVPN (github.com/pwnnex/ByeByeVPN)
# 8 TLS-проб на порт, JA4S-классификация, шкала CLEAN → OBVIOUSLY-VPN
# 3. После установки — проба снаружи, не с Mac с включённым VPN
curl --resolve "<домен>:443:<IP>" https://<домен>/ -I
Внешние точки проверки: check-host.net (TCP/HTTP/DNS из 15+ стран),
ip-api.com (гео/ASN). Локальный тест на машине с активным туннелем врёт:
трафик уходит в utun.
Главное про IP и подсети
- С 31.08.2026 «новый IP» не спасает: режут подсети, резервные адреса детектят за часы.
- Хостерам с 01.10.2026 на год запрещено выдавать мощности под VPN — часть провайдеров начала «стучать» на клиентов.
- Каждый LE-сертификат навсегда в публичных логах (crt.sh). Отдельные имена на боевых IP связывают узлы между собой — лучше одно имя или wildcard.
3. Стек: лестница протоколов
Ставлю не «один протокол», а лестницу: основной канал, запасной на другом транспорте, аварийный вход. Так переживаются волны, когда ломается конкретный транспорт.
3.1. Основной: VLESS + XHTTP + TLS (свой домен)
- XHTTP
mode: autoза nginx/caddy, TLS с настоящим сертификатом Let’s Encrypt на своём домене. - Уникальный
path(не из гайдов),xPaddingBytes: "100-1000". xmux.maxConnections: 2–3— не давать больше 3 параллельных TLS-хендшейков к одному SNI: залп хендшейков при старте — отдельная детектируемая сигнатура.flowпустой: Vision с XHTTP несовместим.minClientVer: "1.0.0"при ядре ≥26.7 — иначе старые клиенты молча отшиваются.- fingerprint:
chrome— самый распространённый, статистически не выделяется.firefox/edge/randomized— если есть причина, но тогда на всех узлах сразу (единый отпечаток парка, иначе один узел «тянет» остальные).
3.2. Слой поверх: Reality
- Reality — опциональный слой, не замена XHTTP с сертификатом.
- Только self-steal на свой decoy. Чужой публичный донор (
samsung.com,icloud.com) слишком популярен и подозрителен; плюс forward зондов утекает на чужой сайт в логах. - Свой decoy должен поддерживать тот же PQ-обмен (X25519MLKEM768) и иметь нормальный сертификат — иначе PQ-фингерпринт сам становится сигнатурой.
- Проверка:
xray tls ping <decoy>.
3.3. Второй путь: Hysteria2 (QUIC)
- UDP, валидный сертификат, нестандартный
obfs(напримерgecko). - Сильная сторона: per-packet recovery — ровная латентность там, где TCP страдает от head-of-line blocking (мобильные сети, потери 2–10%).
- Слабости: UDP режут хостинги и DPI; клиенты с ручным профилем надо обновлять руками. Держать как второй канал, не как единственный.
3.4. Второй путь: NaiveProxy
- Caddy
forward_proxy, ALPNh2, basic auth, padding. - Самый правдоподобный HTTP/2-трафик на ШПД, независимый TCP-путь.
- Слабости: поддержка на Android зависит от клиента (нужен Chromium-стек, не Xray-ядро), при потерях медленнее.
3.5. Что не ставить
- Голый VLESS+TCP+Reality без vision/padding — с мая 2026 ТСПУ его фингерпринтит.
- Shadowsocks/obfs4 без padding — то же самое.
- Экзотика (Mieru, самодельные фреймворки) — только факультативно, не в проде.
3.6. Версии ядра
- Сидеть на проверенной версии (у меня — Xray 26.7.28) и не обновлять слепо.
- 26.9.8+ ломает
xmux.maxConnections(issue #6797) → шторм хендшейков и OOM. - 26.10.10/17 отозваны (компрометация корней), 26.10.21 — регрессии Reality.
- Обновление = отдельная операция с сохранением бинарника и проверкой
xmux+ Reality-хендшейка.
4. Сервер: что должно быть сделано
Полный плейбук — отдельный документ, здесь только то, без чего не выпускаю узел.
Периметр
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp # или кастомный порт
ufw allow 80/tcp # ACME
ufw allow 443/tcp # всё остальное — за SNI-демультиплексором
- Наружу — только 443 (+80 для ACME) и обоснованные исключения. Каждый открытый порт — отпечаток: панели, второй Reality-порт, Mieru 444–448, Hysteria 30000, AmneziaWG 39743 — закрыть, если не используются прямо сейчас.
- Админ-панель и резолвер — только на
127.0.0.1, доступ через SSH-туннель.
Доступ
- Ключи,
PasswordAuthentication no, root —prohibit-password. Пароли — не тиражировать «на время». - fail2ban: jail
sshd(+ панель),banAction=ufw, разумныеmaxretry/bantime. - Сначала правило на SSH-порт, потом всё остальное — иначе можно закрыть себе единственный вход.
Система
- Точное время (NTP) — критично для TLS/Reality.
unattended-upgradesдля безопасности; ядро Xray — вручную.- BBR +
fq. - Логи не в
debug,logrotate; забился диск —truncate -s 0, неrm(процесс держит дескриптор). - swap на 1 ГБ VPS.
Маскировка
- Живой decoy-сайт:
200на известные пути,404на остальные, англоязычный текст, без CDN/форм/логинов, единая легенда,robots.txt,sitemap.xml,favicon.ico. - Никаких дефолтных масок Xray и самоподписанных сертификатов.
- Не держать на боевом IP торренты и лишние сервисы: «входящий >> исходящий» — наблюдаемый признак VPN.
Архитектура
клиент ──TLS 443──> nginx (ssl_preread, TLS не трогает)
├─ SNI <домен-1> → xray 127.0.0.1:4431 (XHTTP+Reality)
└─ SNI <домен-2> → xray 127.0.0.1:4432 (gRPC/WS — совместимость)
xray 4431 ── self-steal ──> локальный decoy на 8081 (свой сертификат <домен-1>)
Инбаунды слушают только loopback, наружу торчит один демультиплексор. Каждый сервер предъявляет свой сертификат на свой SNI — иначе пробинг увидит несоответствие.
5. Клиент и маршрутизация
Два независимых контура. Клиент уводит RU-трафик мимо туннеля (скорость,
локальные сервисы, банки не репортят exit-IP), сервер добивает остатки
(geoip:ru → block, см. §6). Один контур без другого — дыра: без клиентского
правила RU-трафик идёт через Европу, без серверного — утекает, если клиент
прислал RU-назначение.
- Один URL подписки на человека; чужие публичные подписки удалить.
- XHTTP — только на Xray-ядре (v2rayNG, NekoBox, Happ, Exclave).
- ≤2–3 параллельных TLS-хендшейка (
xmux). - Профиль не раздавать широко.
5.1. Правила: порядок решает
{
"domainStrategy": "IPIfNonMatch",
"domainMatcher": "hybrid",
"rules": [
{
"type": "field", "outboundTag": "direct",
"ip": ["geoip:private"], "domain": ["geosite:private"]
},
{
"type": "field", "outboundTag": "direct",
"protocol": ["bittorrent"]
},
{
"type": "field", "outboundTag": "direct",
"domain": [
"geosite:category-ru", "geosite:category-gov-ru",
"geosite:ru-available-only-inside",
"domain:ru", "domain:su", "domain:рф"
]
},
{
"type": "field", "outboundTag": "direct",
"ip": ["geoip:ru", "geoip:yandex"]
},
{
"type": "field", "outboundTag": "proxy",
"network": "tcp,udp"
}
]
}
privateпервым — иначе LAN, принтеры, Docker поедут в туннель.- RU-домены до RU-IP:
vk.comза Cloudflare по IP не опознать, по домену — да. geoip:ruработает только сdomainStrategy: IPIfNonMatch.- Последнее правило —
proxy: «всё остальное в туннель».
Обязательно: sniffing с destOverride: ["http", "tls", "quic"] и
routeOnly: true — без него доменные правила мёртвые. destinationOverride
выключить: с ним ломаются MTProto, Apple Push, Tor.
5.2. DNS
RU-домены — российским резолвером (иначе CDN отдаст западный адрес и получишь лишний ход через туннель), остальное — через прокси.
{
"dns": {
"servers": [
{
"address": "https://dns.yandex.net/dns-query",
"domains": ["geosite:category-ru", "geosite:ru-available-only-inside"],
"expectIPs": ["geoip:ru"]
},
{
"address": "https://cloudflare-dns.com/dns-query",
"domains": ["geosite:geolocation-!ru"],
"expectIPs": ["geoip:!ru"],
"skipFallback": true
},
{
"address": "8.8.8.8",
"skipFallback": true
}
]
}
}
Fake DNS и DNS routing включены; системный «приватный DNS» выключен — иначе конфликт и утечка.
5.3. Устройство
- TUN + gVisor, MTU 1500.
- per-app в режиме bypass: «всё в туннель, кроме списка». Режим «proxy» (только выбранные приложения) оставляет половину софта мимо VPN.
- Исключить клиент из оптимизации батареи и разрешить автозапуск — иначе Android убивает VPN в фоне (типичное «ночью отвалился»).
- Прямой UDP 443 блокировать — QUIC уходит мимо туннеля.
allowAppsBypassVpn— осознанно: push/FCM ходят мимо VPN.
5.4. Источники списков
runetfreedom/russia-v2ray-rules-dat—geosite.dat+geoip.dat, веткаlatest(категорииcategory-ru,category-gov-ru,ru-available-only-inside, плюсgeoip:yandex— в стандартном v2fly-наборе их нет).- Слабые устройства —
runetfreedom/russia-blocked-geoip(лёгкие.dat/.mmdb/.srs). - Для nftables —
ipverse/country-ip-blocks,ru.txt. - Не брать:
Loyalsoldier(устаревает),geoip:ru-blocked(это список РКН, а не все RU-подсети).
5.5. Проверка
xray run -test -config client.json # warning про отсутствующие категории — читать
curl -s -o /dev/null -w '%{http_code} %{time_total}\n' https://ya.ru # direct, < 50 мс
curl -s -o /dev/null -w '%{http_code}\n' \
-x socks5h://127.0.0.1:1080 https://example.com # 200
curl -s -o /dev/null -w '%{http_code}\n' \
-x socks5h://127.0.0.1:1080 https://ya.ru # 000 — сервер блокирует
6. Гигиена: как не сжечь узел самому
- Egress-гигиена. Сервер не должен ходить в рунет по клиентскому трафику:
«европейский IP, стабильно посещающий RU-сайты» — детекционный паттерн.
В routing Xray:
geoip:ruиgeosite:category-ru→blocked. Проверка:curl ya.ruна сервере →000,example.com→200. - CT-аудит. Проверить
crt.shпо своему домену: сколько имён и когда связано с боевым IP. Админку/sub-api держать на другом имени или за CDN. - Мало клиентов на IP, мало хендшейков на старте.
- Не покупать «VPN-шные» ASN и не брать туториальные дефолты (SNI
ya.ru, pathvless, порт 2096). - Не строить выживание на SSH:22 — с августа 2026 он тоже под ударом; аварийный доступ — через туннель (cloudflared access / reverse-канал).
- Копия подписки и DNS — вне узла. Домен и подписка умирают вместе с IP.
7. Диагностика: что именно случилось
Сначала ответ на один вопрос: это блокировка, деградация или сеть? 80% жалоб «VPN не работает» — не ТСПУ.
| Симптом | Вероятная причина | Первое действие |
|---|---|---|
| SYN таймаут на узел, старый туннель жив | Точечный блок IP:порт | Проверить другим портом/адресом, curl --resolve |
| TCP Reset на все соединения | Блок по реестру (домен/IP) | Сменить домен/адрес, проверить реестр |
| Молчит всё, включая SSH | Блок IP целиком | План Б (см. §8) |
| Рвётся через 30–60 с | Поведенческая заморозка | Сменить паттерн: CDN, туннель, mux |
| Первые 15–20 КБ и тишина | Троттлинг TLS после всплеска | Другой транспорт (Hysteria2), клиентский desync |
| «Внезапно всё тормозит» | Режим деградации (дроп доли пакетов) | Замер потерь, второй канал |
| SSH жив, VLESS мёртв | Фильтр по dest IP/порту | Сменить dest, проверить iptables |
Нет geoip_RU.dat |
Упавшее обновление геобазы | Файл должен называться ровно geoip_RU.dat |
Инструменты
# проверить адрес, а не домен — ТСПУ режет IP точечно
curl --resolve "<домен>:443:<IP>" https://<домен>/<path> -I
# что слушает сервер
ss -tulpn
# TLS-рукопожатие и цепочка
openssl s_client -connect <IP>:443 -servername <домен> -alpn h2 \
</dev/null 2>/dev/null | head -20
# сервис и логи
systemctl status xray nginx
journalctl -u xray -n 100 --no-pager
Внешние: check-host.net, ipleak.net, ip-check.org, browserleaks.com.
Логи ТСПУ живут ~2 суток — постфактум не диагностируется. Поэтому собственная
фиксация состояния (healthcheck + пробы из нескольких сетей) — единственная
история.
Проверять с нескольких сетей: провод + 2 мобильных оператора. Фильтр обновляется несинхронно, одна точка врёт.
8. Узел заблокирован: план Б
Принцип: ingress заблокирован, но исходящие соединения сервера из Европы никто не трогает. Сервер сам дозванивается до чистой точки входа.
| # | Схема | Надёжность | QoE из РФ | Комментарий |
|---|---|---|---|---|
| 1 | Reverse-туннель забаненный → чистый узел (rathole; frp запасной) |
4.5/5 | 4/5 | Клиент входит на чистый Reality, забаненный узел сам дозванивается. Нога EU↔EU не фильтруется |
| 2 | Cloudflare Tunnel + второй домен | 3/5 | 2/5 | Работает, но 16 КБ-дроссель CF — потолок QoE. Аварийный, не основной |
| 3 | RU-CDN host-front (Yandex/VK Cloud/TimeWeb) → origin | 3.5/5 | 4.5/5 | Главный тренд 2026, спасает при белых списках. Минусы: RU-юрлицо, ToS, CDN терминирует TLS |
| 4 | Dual-stack IPv6 (AAAA + Reality) | 2/5 | 3/5 у кого есть v6 | Дешёвый эксперимент: мобильные могут пройти мимо v4-блоклистов |
| 5 | Новый IP → сразу за туннель | — | — | Ничего не слушать напрямую: светнуть VLESS:443 на чистом IP = снова бан за дни |
| 6 | Аварийный SSH (cloudflared access, reverse-канал) | 4/5 | 2/5 | 22 не считать единственным входом |
Правила: один параметр за тест, baseline до/после, бэкап с датой, откат проверен до правки. Рабочее соединение — прод.
9. Чего не делать
- Cloudflare-fronting (маскировка SNI под чужие заблокированные сайты) — риск, не решение. Не путать с VLESS+WS за CF на своём домене — это другое.
- Менять SNI как тактику — ТСПУ смотрит полную TLS-сигнатуру, не только SNI.
- WARP как анти-блок — меняет только egress, ingress не спасает.
- Дробить на 15–20 КБ — работает, убивает скорость.
- Чужой публичный Reality-донор — утечка исходного IP и подозрительность.
- Публичные списки ключей, туториальные дефолты, панель наружу.
- Экзотические SNI из RU-подсетей под белые списки — путь в никуда.
- Делать RU-хостинг для панели/биллинга/CDN — оферты запрещают.
- Обновлять Xray «на всякий случай» без проверки xmux и Reality.
10. Если настраивает агент
Этот файл специально написан так, чтобы его можно было отдать агенту целиком. Дальше — рабочая рамка.
Промпт
Ты помогаешь мне поднять/починить личный VPN. Прочитай этот документ целиком. Работай по циклу: осмотр (только чтение) → анализ → моё согласие → правка → проверка. Один изменяемый параметр за раз, baseline до правки, бэкап с датой, откат проверен до правки. Секреты не выводить в чат и не коммитить. Рабочее соединение — прод: без бэкапа и доказанного отката ничего не удалять и не заменять. Если правка сломала канал — стоп остальных правок, восстановить последний рабочий конфиг, рестартнуть только задетый сервис, перепроверить.
Что агенту нужно знать перед стартом
- Где инвентарь (адреса, порты, версии) — а где секреты (права
600). - Какой канал сейчас основной, какой аварийный.
- Как проверять: команда healthcheck + внешние пробы с нескольких сетей.
- Где бэкапы и как выглядит откат.
- Что считается «сломано» (критерий успеха теста, а не «вроде работает»).
Чек-лист агента на любую правку
[ ] прочитал документ и текущую схему
[ ] снял baseline (сервис, внешняя проба, клиент)
[ ] сделал бэкап с датой
[ ] изменил ОДИН параметр
[ ] проверил конфиг до рестарта (xray -test / nginx -t)
[ ] рестартнул только задетый сервис
[ ] проверил старый и новый путь
[ ] записал что сделано и как откатить
11. Чек-листы
Новый узел
[ ] IP/ASN чистые (bgp.tools, scamalytics, реестр, ByeByeVPN)
[ ] хостинг вне РФ, смена IP доступна
[ ] UFW: deny in, allow 22/80/443
[ ] ключи, PasswordAuthentication no, fail2ban, NTP, BBR
[ ] домен + LE-сертификат, автообновление + hook на рестарт
[ ] живой decoy (200/404, robots, sitemap, favicon)
[ ] Xray: XHTTP+Reality self-steal, loopback, уникальный path, padding, xmux 2–3
[ ] ядро закреплено (26.7.28), бэкап бинарника
[ ] egress: geoip:ru → blocked
[ ] проверка снаружи: curl --resolve, 200 на decoy, TLS-цепочка
[ ] клиент: подписка, RU-direct, DNS внутрь, ≤3 хендшейка
[ ] запись в инвентарь: адрес, порт, версия, дата, что открыто наружу
Ежемесячно
[ ] healthcheck по всем узлам
[ ] проба из РФ: провод + 2 мобильных
[ ] срок сертификатов
[ ] crt.sh на новые имена
[ ] обновления безопасности (ядро Xray — отдельно, осознанно)
[ ] бэкап конфигов и подписки вне узла
12. Источники и куда смотреть
- Сообщество: ntc.party (блокировки, Reality, замеры), habr (разборы волн), te-st.org (мониторинг доступности), vpnstatus.site (живучесть протоколов).
- Официально: eais.rkn.gov.ru (реестр), crt.sh (сертификаты), bgp.tools (префиксы), scamalytics.com (репутация IP).
- Документация: XTLS/Xray-core discussions и Xray-examples (XHTTP, Reality), klzgrad/naiveproxy, enfein/mieru, GitHub issue #6797 (xmux и Go 1.27).
- Списки для маршрутизации:
runetfreedom/russia-v2ray-rules-dat(geosite/geoip),runetfreedom/russia-blocked-geoip(лёгкие),ipverse/country-ip-blocks(CIDR). - Сканеры: ByeByeVPN (методика РКН), check-host.net (внешние пробы).
Правило источников: сначала свои замеры, потом сообщество, потом официальные списки. Блог-гайд 2024 года — не источник истины в 2026.
Словарь
- XHTTP — транспорт Xray поверх HTTP/2/3, выглядит как обычный веб-трафик.
- Reality — маскировка TLS под чужой/свой сайт без своего сертификата в клиентской проверке; требует донора/decoy.
- Self-steal — Reality, который при пробинге отдаёт свой же decoy-сайт.
- xmux — мультиплексирование соединений Xray; ограничивает параллельные TLS-хендшейки.
- Decoy — сайт-заглушка, которую видит пробующий.
- ASN — автономная система, сеть провайдера; блокировки идут по подсетям.
- НСДИ — Национальная система доменных имён (подмена DNS-запросов).
- HOL blocking — простой TCP-потока из-за потери одного пакета.