Личный VPN · методика 2026

VPN, который живёт

Как выбирать сервер и протокол, что настраивать, куда смотреть, когда всё сломалось — и как передать это своему агенту, чтобы он не сломал прод.

версия 2026-10-30 XHTTP Reality Hysteria2 Naive без секретов

Это не инструкция «поставь 3x-ui и радуйся». Это то, как я принимаю решения: куда смотреть, что выбирать, какие схемы держать, чем платить за живучесть и как понимать, что именно сломалось. Всё проверено на своём парке за 2025–2026.

Реальные IP, домены, UUID и ключи здесь отсутствуют намеренно. Всё, что нужно подставить, помечено как <...>.


1. Семь принципов, из которых растёт всё остальное

  1. Независимость важнее обфускации. Два-три узла в разных ASN переживают волну блокировок лучше, чем один «умный» сервер с модной маскировкой.
  2. Скучный реалистичный HTTPS. Трафик должен выглядеть как обычный HTTP/2/3 к обычному сайту: настоящий сертификат, живая заглушка, нормальные тайминги. Экзотика привлекает внимание сильнее, чем помогает.
  3. Настоящий сертификат вместо трюка. Свой домен + Let’s Encrypt + XHTTP за nginx/caddy. Reality — не замена, а дополнительный слой.
  4. Второй путь на другом транспорте. TCP-схему лечит одно, потери и поведенческий детект — другое. Поэтому в парке живут XHTTP, Hysteria2 (QUIC) и NaiveProxy (Chromium HTTP/2).
  5. DNS только внутрь туннеля. С 26.08.2026 открытые 8.8.8.8/1.1.1.1 подменяются на НСДИ. Голый публичный резолвер в клиенте = утечка и поломка.
  6. Один изменяемый параметр за тест. Baseline до правки, проверка после, откат под рукой. Иначе не понять, что помогло.
  7. 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 и подсети


3. Стек: лестница протоколов

Ставлю не «один протокол», а лестницу: основной канал, запасной на другом транспорте, аварийный вход. Так переживаются волны, когда ломается конкретный транспорт.

3.1. Основной: VLESS + XHTTP + TLS (свой домен)

3.2. Слой поверх: Reality

3.3. Второй путь: Hysteria2 (QUIC)

3.4. Второй путь: NaiveProxy

3.5. Что не ставить

3.6. Версии ядра


4. Сервер: что должно быть сделано

Полный плейбук — отдельный документ, здесь только то, без чего не выпускаю узел.

Периметр

ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp      # или кастомный порт
ufw allow 80/tcp      # ACME
ufw allow 443/tcp     # всё остальное — за SNI-демультиплексором

Доступ

Система

Маскировка

Архитектура

клиент ──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-назначение.

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"
    }
  ]
}
  1. private первым — иначе LAN, принтеры, Docker поедут в туннель.
  2. RU-домены до RU-IP: vk.com за Cloudflare по IP не опознать, по домену — да.
  3. geoip:ru работает только с domainStrategy: IPIfNonMatch.
  4. Последнее правило — 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. Устройство

5.4. Источники списков

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. Гигиена: как не сжечь узел самому

  1. Egress-гигиена. Сервер не должен ходить в рунет по клиентскому трафику: «европейский IP, стабильно посещающий RU-сайты» — детекционный паттерн. В routing Xray: geoip:ru и geosite:category-ru → blocked. Проверка: curl ya.ru на сервере → 000, example.com → 200.
  2. CT-аудит. Проверить crt.sh по своему домену: сколько имён и когда связано с боевым IP. Админку/sub-api держать на другом имени или за CDN.
  3. Мало клиентов на IP, мало хендшейков на старте.
  4. Не покупать «VPN-шные» ASN и не брать туториальные дефолты (SNI ya.ru, path vless, порт 2096).
  5. Не строить выживание на SSH:22 — с августа 2026 он тоже под ударом; аварийный доступ — через туннель (cloudflared access / reverse-канал).
  6. Копия подписки и 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. Чего не делать


10. Если настраивает агент

Этот файл специально написан так, чтобы его можно было отдать агенту целиком. Дальше — рабочая рамка.

Промпт

Ты помогаешь мне поднять/починить личный VPN. Прочитай этот документ целиком. Работай по циклу: осмотр (только чтение) → анализ → моё согласие → правка → проверка. Один изменяемый параметр за раз, baseline до правки, бэкап с датой, откат проверен до правки. Секреты не выводить в чат и не коммитить. Рабочее соединение — прод: без бэкапа и доказанного отката ничего не удалять и не заменять. Если правка сломала канал — стоп остальных правок, восстановить последний рабочий конфиг, рестартнуть только задетый сервис, перепроверить.

Что агенту нужно знать перед стартом

  1. Где инвентарь (адреса, порты, версии) — а где секреты (права 600).
  2. Какой канал сейчас основной, какой аварийный.
  3. Как проверять: команда healthcheck + внешние пробы с нескольких сетей.
  4. Где бэкапы и как выглядит откат.
  5. Что считается «сломано» (критерий успеха теста, а не «вроде работает»).

Чек-лист агента на любую правку

[ ] прочитал документ и текущую схему
[ ] снял 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. Источники и куда смотреть

Правило источников: сначала свои замеры, потом сообщество, потом официальные списки. Блог-гайд 2024 года — не источник истины в 2026.


Словарь