惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Google DeepMind News
Google DeepMind News
Hugging Face - Blog
Hugging Face - Blog
D
Docker
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
Project Zero
Project Zero
Engineering at Meta
Engineering at Meta
J
Java Code Geeks
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Simon Willison's Weblog
Simon Willison's Weblog
S
Security Affairs
NISL@THU
NISL@THU
T
Tor Project blog
A
About on SuperTechFans
宝玉的分享
宝玉的分享
腾讯CDC
S
Schneier on Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Privacy & Cybersecurity Law Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Stack Overflow Blog
Stack Overflow Blog
P
Privacy International News Feed
雷峰网
雷峰网
C
Cyber Attacks, Cyber Crime and Cyber Security
Vercel News
Vercel News
Cisco Talos Blog
Cisco Talos Blog
D
DataBreaches.Net
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Google Online Security Blog
Google Online Security Blog
Recorded Future
Recorded Future
L
LINUX DO - 热门话题
Microsoft Security Blog
Microsoft Security Blog
Latest news
Latest news
C
Check Point Blog
有赞技术团队
有赞技术团队
T
The Exploit Database - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
云风的 BLOG
云风的 BLOG
SecWiki News
SecWiki News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
爱范儿
爱范儿
月光博客
月光博客
V
Vulnerabilities – Threatpost
T
Threat Research - Cisco Blogs
P
Palo Alto Networks Blog
T
The Blog of Author Tim Ferriss
C
Cisco Blogs
Webroot Blog
Webroot Blog
S
Security @ Cisco Blogs

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Как быстро реализовать современный работающий VPN в эпоху блокировок: теория и практика
PXI · 2026-06-19 · via Все публикации подряд на Хабре

Простой

7 мин

3.3K

🙂Всем привет! В последнее время меня никак не оставит равнодушным тема с блокировками. Поэтому я решил написать эту небольшую статью про VPN в современных реалиях России. Статья в себя включает:

  1. Общее понимание проблемы и методы её решения.

  2. Теоретический минимум для понимания и реализации VPN.

  3. Как реализовать VPN, опираясь на мой пример.

С чего всё началось?

Два месяца назад я решил больше не платить за VPN и сделать свой. Решил использовать я связку VLESS + REALITY + в качестве транспорта TCP, а также использовал цепочку из двух серверов.

Если у вас уже есть пара VPS, где работают ваши веб-сервисы (как у меня мессенджер и хаб), то всё равно купите другие, чтобы не рисковать своими рабочими VPS.

Был очень рад, что всё получилось. Думал, что такая связка просто никогда не даст сбой, но вскоре всё поменялось...

Первая атака РКН на мой VPN

Две недели назад, спустя полтора месяца бесперебойной работы, мой VPN умер. Я принялся исправлять ситуацию и искать причину такого поведения. Проверил не упали ли сервера, но нет, все в рабочем состоянии.

Потом решил, что проблема в первом VPS. Попытался подключиться напрямую к европейскому серверу, всё к удивлению даже заработало, но только на 10 секунд от силы.

Далее я попытался локализовать проблему, клиентское приложение показывало проблему при TLS рукопожатии. Уже стало легче, хотя бы не по IP заблокировали. Зашёл в свою панель управления и действительно вижу, что появляется активное соединение, но через пару секунд кто-то его закрывает (кидают RST по всей видимости).

Тут я уже не понимал, каким образом они научились обнаруживать мою связку.

Проблема либо в том, что они научились как-то расшифровывать мой вложенный пакет с реальными данными и вытаскивать SNI, так как SNI благодаря REALITY для РКН снаружи выглядит как к какому-то легитимному сайту (который вы выбираете сами).

Либо проблема в том, что я в качестве транспорта использую TCP. Так как аномально то, что я вроде обращаюсь к сайту, но TCP соединение не разрывается после каждого HTTP/HTTPS запроса.

А может даже в совсем другом. Например, нужно обновить сертификат сайта, который используется в REALITY. Поменять отпечаток или ключи. В общем и целом, понять проблему и прийти к решению было не так просто.

Мой ответ на атаку РКН

Я решил большинство из этих проблем разом, перейдя на XHTTP и изменив ресурс, чей сертификат мы используем.

Механизм XHTTP разбивает и упаковывает наши данные в стандартный HTTP запросы. Таким образом у нас теперь не висит долгое TCP соединение (в котором не структурированно передаются данные), а короткое, которое максимально похоже на работу с веб-сайтами.

Мой ответ РКН своей новой связкой VLESS + REALITY + XHTTP дал свои плоды и VPN снова работает, но я уверен, что это не конец. Поэтому буду ждать новых атак от РКН.

Что такое VPN и как он работает?

Начну с того, что есть понятие просто Private Network — это, например, когда компания для своих двух офисов физически прокладывает кабель или покупает его у провайдера в своё монопольное пользование.

Это позволяет создать единую локальную сеть между устройствами и обезопасить от сниффинга трафика извне (только если физически кто-то не вскопает его и что-то нашаманит).

Но вскоре для экономии и удобства придумали VPN (Virtual Private Network). В VPN используется общий глобальный интернет для передачи нашего трафика, а слово Private подразумевает использование шифрования для сокрытия трафика от чужих лиц.

А для реализации общей виртуальной локальной сети пакет с виртуальными локальными ip-адресами инкапсулируется в пакет с реальными ip-адресами. Виртуальный ip-адрес вы получаете при подключении к серверу VPN вместе с виртуальными сетевым интерфейсом.

На данный момент мёртвыми считаются следующие протоколы VPN: OpenVPN, WireGuard, L2TP, IPsec и другие. Их очень легко обнаруживают по заголовкам, портам (DPI) и разрывают соединение.

На 2026 год одним из золотых стандартов для реализации VPN является связка из протокола VLESS, механизма REALITY и механизма, который используется в качестве транспорта XHTTP. REALITY и XHHTP обеспечивают маскировку трафика под HTTPS обращение к сайту.

Протокол VLESS

VLESS (Very Lightweight Encryption Security Stream) — это протокол, разработанный проектом V2Ray на замену VMess. Он в отличии от предшественника не имеет встроенного шифрования. Для шифрования мы будем использовать REALITY.

Если соотносить его с моделью OSI, он работает на стыке сеансового (5) и представительского (6) уровней. Он имеет минимальный дополнительный заголовок со служебной информацией, который отправляется сразу после установления TLS соединения в зашифрованном виде:

[Version: 1 байт] = 0x00

[UUID: 16 байт] = идентификатор клиента

[AddInfo Length: 1 байт] = длина дополнительной информации

[AddInfo: переменная] = опциональные метаданные

[Command: 1 байт] = 0x00 для TCP, 0x01 для UDP

[Port: 2 байта] = порт назначения

[AddrType: 1 байт] = 0x01 IPv4, 0x02 домен, 0x03 IPv6

[Address: переменная] = адрес назначения

Наш VPN сервер проверяет UUID, если такой есть, то установится соединение по протоколу vless поверх TCP, а если нет или вообще кто-то даже не отправил такие заголовки, то выдаём сертификат сайта, который настроили, за это отвечает REALITY.

Структура пакета выше, это только для первого пакета после TLS. Далее просто данные без заголовков VLESS.

Разберёмся с механизмом REALITY

REALITY — это специализированная технология (механизм) обфускации TLS-сессий, работающая на представительском уровне. Она модернизирует TLS 1.3, воруя сертификат и перенаправляя весь нелегитимный трафик на сайт, с которого украден сертификат.

При отправке Client hello мы отправляем пакет с SNI нашего сайта. В ответ получаем сертификат публичный этого сайта и публичный ключ REALITY, сверяем с тем, что в конфигурации нашего впн на клиенте заложено. Далее уже генерируем симметричный общий ключ с сервером и отправляем первый пакет VLESS  с uuid.

Обфускация с XHTTP

Проблема в том, что даже при шифровании DPI анализируют поведение трафика (тайминги, размеры пакетов и структуру потока). Обычный TCP-транспорт уже хорошо детектируется. Чтобы этого избежать можно использовать XHTTP (Extensible HTTP) — транспортный протокол (но он работает на прикладном уровне модели OSI), который выступает подложкой для VLESS.

XHTTP дробит VPN-трафик и упаковывает его в стандартные HTTP/2 или HTTP/3 запросы. Он имитирует естественные задержки веб-серфинга и подстраивает заголовки так, чтобы поведение трафика идеально совпадало с архитектурой выбранного вами сайта в REALITY. Конечно за это придётся платить немного большими задержками.

Теперь рассмотрим один из самых простых способов, как реализовать свой VPN на примере моей связки VLESS + REALITY + XHTTP

Настраиваем VPN-сервер

Скачиваем на VPS или на иное устройство, которое будет использоваться в качестве VPN-сервера панель управления 3X-UI, чтобы иметь удобный доступ через браузер. Также нужно установить само ядро XRay и создать две службы-демона systemd для запуска панели управления и самого ядра XRay, которое будет слушать порт и заниматься маршрутизацией трафика, как указано в конфигурации, которую создала панель.

Всё это делается одной командой:

bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)

Заодно вы там поменяете пароль и логин, получите секретный ключ и выберите порт для панели. Там же рекомендую не ставить SSL сертификат для простоты.

Естественно ставить скрипты из интернета – не очень. Автор что-то поменяет и привет что-то вредоносное, но этот репозиторий достаточно популярен и с открытым сходным кодом.

Как альтернатива можно делать и через конфиг вручную в консоли, но всё равно надо откуда-то скачать ядро XRay (например, с того же гитхаба или через docker pull), которое может быть тоже с бэкдором.

Пару моментов в процессе установки:

Тут выбираем SQLite, для VPN не на продажу пойдет

Тут выбираем SQLite, для VPN не на продажу пойдет

Здесь выбираем порт, по которому будет доступна панель 3X-UI

Здесь выбираем порт, по которому будет доступна панель 3X-UI

Здесь проще выбрать четвёртый пункт

Здесь проще выбрать четвёртый пункт

После установки получаем всю нужную информацию

Далее заходим в панель через браузер по URL:

http://IP_server:port/secret_key

Для входа вводим логин и пароль, который указали при установке. Далее перейдите в раздел подключения, нажмите на создать подключение, выберите протокол vless и порт, который будет слушать ядро XRay.

В разных версиях названия могут немного отличаться, как и интерфейс в целом

В разных версиях названия могут немного отличаться, как и интерфейс в целом

Учитывайте, что если вы выберете порт 443 или 80, то больше никакое приложение на них поднять не сможете, но именно они меньше всего обнаруживаются.

Нажмите на вкладку (в некоторых версиях это отдельный раздел, куда надо перейти после настройки VPN) Клиент и сгенерируйте ID и Subscription, в email можете писать, что хотите. Вкладку с шифрованием и аутентификацией не трогаем, у нас этим занимается VLESS и REALITY.

Далее выбираем транспорт XHTTP, в качестве пути пишете, что угодно, например, /video. Во вкладке Безопасность выбираем REALITY, отпечаток выбираете на свой вкус.

Во вкладке Target и SNI пишем ресурс, чей сертификат будем использовать. Только в Target ещё дописываем порт (google.com:443).

Генерируем ShortIDs — второй секретный ключ, который нужен для аутентификации клиента для REALITY, чтобы отличать своих клиентов. Этот ShortIDs встраивается в поле Random, которое используется для создания общего симметричного ключа, при отправке ClientHello.

Также генерируем приватный и публичный ключи REALITY. Чтобы клиент убедился, что общается с нужным сервером. Приватным ключом север подписывает сертификат и отсылает нам после TLS рукопожатия в зашифрованном виде.

Нажимаем создать, далее 3 точки и нажимаем экспорт ссылок, сохраняем ссылку и переходим к настройке промежуточного сервера, если у вас он есть, но можно и без него.

Настраиваем проксирование порта на промежуточном сервере

Можно прописать iptables, но я покажу способ с использованием Gost.

Скачиваем бинарник:

wget https://github.com/go-gost/gost/releases/download/v3.2.6/gost_3.2.6_linux_amd64.tar.gz

tar -xvzf gost_3.2.6_linux_amd64.tar.gz

chmod +x gost

Теперь запускаем проброс на на VPN-сервер:

sudo ./gost -L tcp://:port_этого_сервера/ip_vpn:port_vpn

Проверяем работу, если всё ок, то останавливаем текущий процесс и создаём файл конфигурации:

sudo nano /etc/systemd/system/gost.servise

Туда вставить это, только свои ip и порты:

[Unit]
Description=Gost Proxy Relay
After=network.target

[Service]
Type=simple
User=root
ExecStart=/gost -L tcp://:443/7.56.6.59:443 -L udp://:443/7.56.6.59:443
Restart=always

[Install]
WantedBy=multi-user.target

Перезапускаем службу:

sudo systemctl restart gost
sudo systemctl status gost

На этом заканчиваем работу с промежуточным узлом и переходим к настройке на стороне клиента.

Настраиваем доступ к VPN у клиента на устройстве

Скачивайте любой VPN-клиент, например, HAPP или V2Raytune и вставляете туда ссылку начинающуюся с vless://, которую получили в панели 3X-UI.

Заходим в настройки новой конфигурации и меняем IP VPN-сервера на IP нашего промежуточного узла. Также рекомендую настроить маршрутизацию, чтобы трафик приложений, которым VPN не нужен им не пользовались. Включите SOCKS5 авторизацию, чтобы другие приложения не обнаружили туннель.

На этом всё, надеюсь было всё понятно. Отвечу на все ваши вопросы в комментариях.