🙂Всем привет! В последнее время меня никак не оставит равнодушным тема с блокировками. Поэтому я решил написать эту небольшую статью про VPN в современных реалиях России. Статья в себя включает:
-
Общее понимание проблемы и методы её решения.
-
Теоретический минимум для понимания и реализации VPN.
-
Как реализовать 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), которое может быть тоже с бэкдором.
Пару моментов в процессе установки:
Далее заходим в панель через браузер по URL:
Для входа вводим логин и пароль, который указали при установке. Далее перейдите в раздел подключения, нажмите на создать подключение, выберите протокол 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.gztar -xvzf gost_3.2.6_linux_amd64.tar.gzchmod +x gost
Теперь запускаем проброс на на VPN-сервер:
sudo ./gost -L tcp://:port_этого_сервера/ip_vpn:port_vpn
Проверяем работу, если всё ок, то останавливаем текущий процесс и создаём файл конфигурации:
sudo nano /etc/systemd/system/gost.servise
Туда вставить это, только свои ip и порты:
[Unit]Description=Gost Proxy RelayAfter=network.target[Service]Type=simpleUser=rootExecStart=/gost -L tcp://:443/7.56.6.59:443 -L udp://:443/7.56.6.59:443Restart=always[Install]WantedBy=multi-user.target
Перезапускаем службу:
sudo systemctl restart gostsudo systemctl status gost
На этом заканчиваем работу с промежуточным узлом и переходим к настройке на стороне клиента.
Настраиваем доступ к VPN у клиента на устройстве
Скачивайте любой VPN-клиент, например, HAPP или V2Raytune и вставляете туда ссылку начинающуюся с vless://, которую получили в панели 3X-UI.
Заходим в настройки новой конфигурации и меняем IP VPN-сервера на IP нашего промежуточного узла. Также рекомендую настроить маршрутизацию, чтобы трафик приложений, которым VPN не нужен им не пользовались. Включите SOCKS5 авторизацию, чтобы другие приложения не обнаружили туннель.
На этом всё, надеюсь было всё понятно. Отвечу на все ваши вопросы в комментариях.
ссылка на оригинал статьи https://habr.com/ru/articles/1049680/