# Браузерный Dialer ## Предыстория Основываясь на [идее, возникшей год назад](https://github.com/v2ray/discussion/issues/754#issuecomment-647934994), с помощью нативного JavaScript был реализован простой WSS-браузерный Dialer, который эмулирует TLS-отпечаток и поведенческие характеристики реального браузера. Однако WSS все еще имеет очевидные проблемы с ALPN, поэтому следующим шагом будет пересылка `HTTP/2` и `QUIC` через браузер. ## Xray и JS Был создан очень простой и элегантный механизм связи: - Xray прослушивает адрес и порт A в качестве HTTP-сервера. Браузер обращается к A и загружает JavaScript-код с веб-страницы. - JavaScript-код устанавливает WebSocket-соединение с A. После успешного установления соединения Xray передает соединение в канал. - При необходимости установить соединение Xray получает доступное соединение из канала и отправляет целевой URL-адрес и необязательные ранние данные (early data). - JavaScript-код сообщает Xray об успешном подключении к цели и продолжает использовать это соединение для двунаправленной передачи данных. Соединение закрывается синхронно. - Соединение закрывается после использования, но JavaScript-код гарантирует, что всегда есть доступные новые соединения. ## Ранние данные (Early data) Механизм ранних данных был скорректирован в соответствии с потребностями браузера: - Заголовок ответа сервера содержит заголовок `Sec-WebSocket-Protocol` запроса, что также частично скрывает характеристики длины ответа рукопожатия WSS. - Для кодирования ранних данных, отправляемых браузеру, используется `base64.RawURLEncoding`, а не `StdEncoding`. Сервер обеспечивает совместимость. - Кроме того, из-за [Xray-core#375](https://github.com/XTLS/Xray-core/pull/375) рекомендуется использовать `?ed=2048`. В этом PR также увеличен `MaxHeaderBytes` на сервере до 4096. ~~(Хотя, кажется, это не обязательно)~~ ## Конфигурация Это экспериментальный процесс. В настоящее время конфигурация выглядит следующим образом (Xray-core v1.4.1): - Подготовьте рабочую конфигурацию WSS. Обратите внимание, что в поле `address` нужно указать доменное имя. Если нужно указать IP-адрес, настройте DNS или добавьте запись в файл hosts. - Если трафик браузера также проходит через Xray-core, обязательно настройте прямое подключение для этого домена, чтобы избежать зацикливания трафика. - Установите переменную окружения, указывающую адрес и порт, который нужно прослушивать, например, `XRAY_BROWSER_DIALER = 127.0.0.1:8080`. - Сначала запустите Xray-core, а затем откройте указанный адрес и порт в любом браузере. Вы также можете открыть инструменты разработчика (F12) и посмотреть консоль и вкладку "Сеть". - Браузеры ограничивают количество WebSocket-соединений, поэтому рекомендуется включить `Mux.Cool`.