VLESS header type: структура заголовка, настройка и обход DPI

Разбираем формат заголовка VLESS, его роль в обходе DPI, настройку transport и security, сравнение с REALITY, диагностику ошибок и практические рекомендации.

Что такое VLESS и зачем нужен header type

VLESS (Very Lightweight Encryption Security Stream) — это прокси-протокол, разработанный проектом V2Ray как эволюция VMess. Его главная задача — обеспечить невидимость для систем Deep Packet Inspection (DPI), которые используются для блокировки VPN-трафика. В отличие от традиционных протоколов, VLESS не шифрует данные сам по себе, а полагается на внешний транспортный уровень, такой как TLS или REALITY.

Термин "header type" в контексте VLESS обычно относится к структуре заголовка протокола, который содержит информацию для маршрутизации: версию, UUID пользователя, команду (TCP/UDP), адрес назначения и порт. Этот заголовок отправляется либо в открытом виде (если транспорт не зашифрован), либо внутри TLS-сессии. Понимание структуры заголовка критически важно для диагностики проблем и настройки клиентов.

В более широком смысле "header type" может также обозначать тип транспорта (например, WebSocket, gRPC, XHTTP), который определяет, как именно упаковываются данные. В этой статье мы рассмотрим оба аспекта: внутренний формат заголовка VLESS и настройку transport header.

Структура заголовка VLESS: байты, UUID и адрес

Заголовок VLESS имеет фиксированную структуру, которая одинакова в Xray-core и sing-box. Она включает следующие поля:

  • Version (1 байт): всегда 0x00 для текущей версии.
  • UUID (16 байт): идентификатор пользователя, используется для аутентификации.
  • Addons Length (1 байт): длина дополнительной информации (обычно 0).
  • Addons (N байт): опциональные метаданные, закодированные в protobuf.
  • Command (1 байт): 0x01 для TCP, 0x02 для UDP, 0x03 для Mux.
  • Port (2 байта): порт назначения.
  • AddrType (1 байт): 0x01 IPv4, 0x02 домен, 0x03 IPv6.
  • Address (переменная): адрес назначения.

Этот заголовок минималистичен и не содержит характерных сигнатур, которые могли бы выдать прокси. Однако если он отправляется без шифрования, DPI может распознать его по структуре. Поэтому на практике заголовок всегда оборачивается в TLS или REALITY.

В sing-box формат данных делегируется библиотеке sing-vmess/vless, что обеспечивает совместимость с Xray-core. Важно отметить, что sing-box не поддерживает Vision flow, в отличие от Xray-core, что может влиять на выбор клиента.

Как header type влияет на обход DPI

Системы DPI, такие как российская ТСПУ, используют три основных метода обнаружения VPN: фингерпринтинг протоколов, статистический анализ трафика и активное зондирование. VLESS эффективно противостоит всем трём благодаря своей архитектуре.

Фингерпринтинг: заголовок VLESS не имеет фиксированных опкодов или магических чисел, которые можно было бы обнаружить. Когда заголовок передаётся внутри TLS 1.3, DPI видит только стандартное HTTPS-рукопожатие, неотличимое от браузерного трафика.

Статистический анализ: VLESS не создаёт характерных паттернов в размерах пакетов или таймингах, особенно при использовании WebSocket-транспорта, который имитирует обычные HTTP-запросы.

Активное зондирование: здесь ключевую роль играет fallback-механизм. Если DPI подключается к серверу с невалидным запросом, сервер должен отвечать как обычный веб-сервер, а не как прокси. Правильная настройка fallback на реальный сайт или HTTP-сервер позволяет избежать блокировки.

Однако важно понимать, что VLESS сам по себе не шифрует трафик. Если использовать его без TLS, заголовок будет виден DPI, и протокол будет легко обнаружен. Поэтому header type (транспорт) и security (TLS/REALITY) являются обязательными компонентами для защиты.

Транспорты VLESS: WebSocket, gRPC, XHTTP и другие

Выбор транспорта определяет, как VLESS-пакеты упаковываются в TCP-соединение. Каждый транспорт имеет свои особенности и уровень маскировки.

WebSocket (WS): самый популярный транспорт. Данные передаются внутри WebSocket-фреймов, что выглядит как обычный HTTP-трафик. Требует настройки path (например, /api/v1/stream) и Host. Хорошо работает с CDN, например Cloudflare, что позволяет скрыть IP-адрес сервера.

gRPC: использует HTTP/2 и protobuf, что даёт высокую производительность и маскировку под современные API. Требует настройки serviceName. Поддерживается не всеми клиентами, но популярен в sing-box.

XHTTP: новый транспорт, который имитирует HTTP/3 (QUIC). Обеспечивает высокую скорость и устойчивость к DPI, но требует поддержки в клиенте и сервере.

Raw TCP: простейший транспорт без маскировки. Используется только в связке с REALITY, который обеспечивает шифрование и маскировку.

При выборе транспорта важно учитывать совместимость с клиентом и возможность интеграции с CDN. Например, WebSocket и gRPC поддерживаются Cloudflare, а XHTTP — нет.

Security: TLS, REALITY и их роль в header type

Security-слой определяет, как шифруется и маскируется VLESS-трафик. Основные варианты: обычный TLS и REALITY.

TLS: использует стандартные сертификаты (например, Let's Encrypt) и шифрует весь трафик. Требует настройки serverName, alpn и cipherSuites. При правильной конфигурации DPI видит обычное HTTPS-соединение. Однако TLS-серверы могут быть обнаружены активным зондированием, если они отвечают на невалидные запросы не так, как настоящие веб-серверы.

REALITY: технология, которая не требует собственного сертификата. Она использует сертификат и конфигурацию реального сайта (например, microsoft.com) для маскировки. При активном зондировании REALITY-сервер ведёт себя как настоящий сайт, что делает его практически неотличимым. REALITY поддерживает только Xray-core и некоторые клиенты, но не sing-box.

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

Важно: VLESS сам по себе не шифрует данные, поэтому без TLS или REALITY трафик будет открытым. Это критическое ограничение, которое нужно учитывать.

Настройка VLESS inbound и outbound в Xray и sing-box

Рассмотрим пример настройки VLESS с WebSocket и TLS для Xray-core. Конфигурация inbound включает порт 443, протокол vless, UUID пользователя, decryption none, streamSettings с network ws и security tls. Также настраивается fallback на локальный веб-сервер (например, порт 8080) для маскировки.

{
  "inbounds": [{
    "port": 443,
    "protocol": "vless",
    "settings": {
      "clients": [{"id": "uuid", "level": 0}],
      "decryption": "none",
      "fallbacks": [{"dest": 8080, "xver": 1}]
    },
    "streamSettings": {
      "network": "ws",
      "security": "tls",
      "wsSettings": {
        "path": "/api/v1/stream",
        "headers": {"Host": "example.com"}
      },
      "tlsSettings": {
        "serverName": "example.com",
        "certificates": [{
          "certificateFile": "/etc/letsencrypt/live/example.com/fullchain.pem",
          "keyFile": "/etc/letsencrypt/live/example.com/privkey.pem"
        }],
        "minVersion": "1.3",
        "alpn": ["h2", "http/1.1"]
      }
    }
  }]
}

В sing-box конфигурация аналогична, но использует другие ключи: type: "vless", users, tls, transport. Например:

{
  "inbounds": [{
    "type": "vless",
    "listen": ":443",
    "users": [{"uuid": "...", "flow": ""}],
    "tls": { ... },
    "transport": {"type": "ws", "path": "/vless"}
  }]
}

Outbound настраивается аналогично, с указанием сервера, порта, UUID, transport и security. Важно, чтобы параметры на клиенте и сервере совпадали, иначе соединение не установится.

Интеграция с CDN: зачем и как настроить

Запуск VLESS на голом IP-адресе делает сервер уязвимым для IP-блокировок. Даже если протокол не обнаруживается, DPI может заблокировать IP по другим признакам. Решение — использование CDN, например Cloudflare.

Архитектура: пользователь → Cloudflare CDN → origin-сервер (VLESS). Пользователь подключается к IP-адресам Cloudflare, которые используются миллионами легитимных сайтов, поэтому их блокировка невозможна без нарушения работы половины интернета. Cloudflare проксирует WebSocket-соединение к вашему серверу.

Для настройки необходимо:

  1. Подключить домен к Cloudflare и включить "оранжевое облако" (проксирование).
  2. Настроить Nginx на сервере для проксирования WebSocket-запросов к V2Ray.
  3. Убедиться, что path и Host совпадают с конфигурацией VLESS.

Пример конфигурации Nginx:

server {
    listen 8080;
    server_name example.com;

    location /api/v1/stream {
        proxy_pass http://127.0.0.1:10000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_read_timeout 3600s;
    }

    location / {
        root /var/www/html;
        index index.html;
    }
}

Fallback location отдаёт реальный сайт, поэтому при заходе на домен браузером виден легитимный контент. Только запросы к конкретному path проксируются к VLESS.

Диагностика ошибок: handshake, timeout, UUID

Типичные проблемы с VLESS включают ошибки handshake, timeout и неверный UUID. Рассмотрим основные причины и способы их устранения.

Ошибки handshake: возникают, когда клиент и сервер не могут согласовать параметры TLS или транспорта. Проверьте:

  • Совпадение serverName и SNI.
  • Правильность alpn (h2, http/1.1).
  • Версию TLS (должна быть 1.2 или 1.3).
  • Наличие сертификата и ключа на сервере.

Timeout: обычно связано с сетевыми проблемами или блокировкой порта. Проверьте:

  • Доступность порта с помощью telnet или nc.
  • Настройки firewall (iptables, ufw).
  • Работу CDN, если используется.
  • Наличие IPv6 и его корректную маршрутизацию.

Неверный UUID: если UUID не совпадает между клиентом и сервером, соединение будет отклонено. Убедитесь, что UUID в конфигурации клиента точно соответствует серверному.

Проблемы с flow: если используется Vision flow (только Xray), убедитесь, что клиент поддерживает его и параметр flow установлен правильно. В sing-box flow не поддерживается, поэтому его нужно оставить пустым.

Для диагностики используйте логи клиента и сервера. В Xray включите loglevel: "debug", в sing-box — "debug". Анализируйте ошибки на каждом этапе: TCP-соединение, TLS-рукопожатие, VLESS-аутентификация.

Практические рекомендации и ограничения

VLESS — мощный инструмент, но он не является серебряной пулей. Важно понимать его ограничения.

Что VLESS защищает: VLESS скрывает факт использования прокси от DPI, если настроен с TLS/REALITY. Он также обеспечивает аутентификацию пользователей по UUID.

Что VLESS не защищает: VLESS не шифрует данные сам по себе. Без TLS/REALITY трафик открыт. Кроме того, остаются метаданные соединения (IP-адреса, время, объём трафика), которые могут быть использованы для анализа. DNS-запросы также могут быть видны, если не настроен DNS-over-HTTPS.

Рекомендации:

  • Всегда используйте TLS или REALITY.
  • Настраивайте fallback на реальный сайт.
  • Используйте CDN для скрытия IP.
  • Регулярно обновляйте клиенты и серверы.
  • Не полагайтесь на один протокол — используйте мультипротокольные решения с автоматическим переключением.

Ограничения: VLESS не поддерживает Vision в sing-box, что может снизить производительность. Также некоторые клиенты не поддерживают все транспорты (например, XHTTP). Проверяйте совместимость перед настройкой.

Вопросы и ответы

Что такое header type в VLESS?

Header type в VLESS может означать два аспекта: внутренний заголовок протокола (структура с UUID, адресом и командой) и тип транспорта (WebSocket, gRPC, XHTTP). Внутренний заголовок определяет, как маршрутизировать пакеты, а транспорт — как упаковать данные для маскировки. Оба аспекта важны для обхода DPI.

Чем VLESS отличается от VMess?

VLESS — это упрощённая версия VMess, разработанная для лучшей маскировки. VMess имеет встроенное шифрование и характерные паттерны пакетов, которые DPI может обнаружить. VLESS не шифрует сам, а полагается на TLS/REALITY, что делает его менее заметным. Также VLESS добавляет меньше служебных данных (25-50 байт против более 100 у OpenVPN).

Какой транспорт лучше для VLESS: WebSocket или gRPC?

Выбор зависит от задач. WebSocket проще в настройке и хорошо работает с CDN, что скрывает IP. gRPC обеспечивает лучшую производительность и маскировку под современные API, но требует поддержки в клиенте. Для максимальной совместимости используйте WebSocket, для высокой скорости — gRPC или XHTTP.

Нужно ли шифрование, если используется VLESS?

Да, обязательно. VLESS сам по себе не шифрует трафик, поэтому без TLS или REALITY данные передаются открыто и могут быть прочитаны DPI. Используйте TLS с валидным сертификатом или REALITY для маскировки под реальный сайт.

Почему VLESS не работает на телефоне?

Частые причины: несовпадение UUID, неправильные настройки транспорта (path, host), проблемы с TLS (сертификат, SNI), блокировка порта оператором, ошибки DNS. Проверьте конфигурацию клиента, сравните с серверной, убедитесь, что клиент поддерживает выбранный транспорт и security.

Можно ли использовать VLESS без CDN?

Да, можно, но это увеличивает риск блокировки по IP. Без CDN ваш сервер будет иметь открытый IP, который DPI может заблокировать после обнаружения. Использование CDN (например, Cloudflare) скрывает IP за адресами CDN, что значительно повышает устойчивость.