Selfsteal: как нода притворяется обычным сайтом
Selfsteal — это Reality в его самой стойкой форме. Обычный Reality крадёт рукопожатие у чужого сайта, selfsteal — у твоего собственного на той же ноде. Разбираю без команд, чем это лучше, почему согласованность SNI/IP/контента ломает даже глубокий анализ и какова плата. Пошаговая сборка — в парной практике.
Перейти к практике →Проблема, ради которой придумали selfsteal
Обычный Reality с чужим донором хорош, но у него есть врождённый компромисс, о котором я подробно писал в разборе доноров. Ты ставишь serverNames = чужой сайт (условный microsoft.com), и снаружи рукопожатие выглядит идеально. Но есть тонкость: этот домен не резолвится в IP твоей ноды. При глубоком анализе DPI может сопоставить заявленное имя с владельцем адреса и заметить рассинхрон — «SNI говорит microsoft.com, а IP принадлежит хостеру в непонятной стране, и microsoft.com сюда не резолвится».
Под обычным DPI это не критично — ложных срабатываний было бы слишком много. Но под самым жёстким DPI, который активно прозванивает подозрительные адреса и сверяет SNI с реальностью, это зацепка. Selfsteal её убирает полностью.
Что делает selfsteal
Идея переворачивает логику Reality. Вместо того чтобы притворяться чужим сайтом, нода притворяется своим собственным — настоящим сайтом, который живёт на том же IP.
Схема такая. У тебя есть домен, A-запись которого указывает на ноду. На самой ноде поднят настоящий сайт-обманка (декой) — на локальном сокете или порту, за которым стоит nginx или Caddy с реальным сертификатом твоего домена. В конфиге Reality:
serverNames= твой домен (тот, что резолвится в ноду);target= твой локальный сайт-обманка (не чужой донор, а декой на этой же машине).
Теперь всё согласовано. Клиент показывает в SNI твой домен. Этот домен резолвится ровно в IP ноды. На этом IP реально живёт сайт по этому домену с валидным сертификатом. Активная проба, ткнувшись в адрес, попадает на настоящую страницу именно по заявленному имени. Никакого рассинхрона — SNI, IP и контент совпадают, как у любого честного веб-сервера.
Почему это ломает даже глубокий анализ
Разберём, что видит DPI при каждом виде проверки selfsteal-ноды:
- SNI в рукопожатии — твой домен, обычное имя, резолвится в этот же адрес. Никакой аномалии.
- Сертификат — настоящий, валидный, выпущенный на этот домен через Let's Encrypt. Не самоподписанный, не донорский, не подозрительный.
- Активная проба — DPI открывает соединение к адресу и видит реальный сайт по заявленному домену. Контент есть, страница отдаётся, всё как у обычного веб-сервера.
- Соответствие SNI ↔ IP — идеальное. Домен принадлежит этому IP, что легко проверяется через DNS.
То есть по всем осям, которыми DPI отличает VPN от честного сайта, selfsteal-нода является честным сайтом — с той разницей, что клиент с правильным ключом внутри того же соединения получает VPN. Для наблюдателя это неотличимо от обычного веб-сервера, на котором просто крутится какой-то сайт. Это максимальный уровень стелса, доступный без ухода за CDN.
Роль PROXY-protocol
Одна инженерная деталь, которую стоит понимать концептуально. Когда Reality проксирует чужой трафик (или активную пробу) на локальный сайт-обманку, у сайта возникает вопрос: какой на самом деле IP у клиента? Ведь соединение приходит с локального адреса ноды, а не от реального посетителя. Чтобы сайт-обманка видел настоящий IP клиента, между Reality и nginx используется PROXY-protocol — он передаёт исходный адрес клиента отдельным заголовком. В конфиге за это отвечает параметр xver: 1 на стороне Reality и соответствующая настройка proxy_protocol на стороне nginx. Без согласованной пары сайт-обманка не увидит клиента корректно. Это не влияет на стелс напрямую, но нужно, чтобы декой работал правильно и логировал реальные визиты. Конкретные строки — в практике.
Чем платишь за максимальный стелс
Честно про цену, потому что selfsteal — не бесплатный апгрейд:
- Нужен свой домен. В отличие от донорского Reality, где домен вообще не требуется, тут обязателен свой домен с A-записью на ноду.
- Нужен сертификат. Настоящий серт Let's Encrypt на этот домен, с автообновлением каждые 90 дней.
- Нужен сайт-обманка. И он должен быть правдоподобным. Пустая страница «It works» — плохой декой: настоящий сайт так не выглядит. Лендинг, блог, что угодно «живое» — чтобы активная проба видела нормальный ресурс, а не заглушку. Это дополнительная возня, которой нет у обычного Reality.
За это ты получаешь стелс, который переживает даже активное прозванивание и глубокий анализ соответствия SNI/IP. Под жёстким РФ-DPI это оправдано и часто необходимо; под мягким — можно обойтись донорским Reality.
Как принять решение
Схема простая:
- Жёсткий DPI, активные пробы, есть свой домен — бери selfsteal, это самый стойкий вариант без CDN.
- Мягкий DPI или нет своего домена — хватает донорского Reality, selfsteal избыточен.
- Блокируют по IP — selfsteal не поможет (рукопожатие тут ни при чём), нужен уход за CDN на XHTTP.
Selfsteal — это Reality, доведённый до предела: нода не притворяется чужим сайтом, она становится честным сайтом на своём адресе. Как поднять сайт-обманку на nginx, настроить сокет и PROXY-protocol и собрать inbound по официальному шаблону — в парной практике «Selfsteal + nginx: пошагово».
Следующий гайд Selfsteal + nginx: пошагово → ↗ Не понравилась статья или что-то непонятно? Напишите мне — помогу или поправлю. @notrealvpn →