From 31c82eb81aa0500b4255a55358252a0586ff0bc1 Mon Sep 17 00:00:00 2001 From: Nikita Korotaev <104270279+iambabyninja@users.noreply.github.com> Date: Thu, 18 Jul 2024 18:16:36 +0500 Subject: [PATCH] Update browser_dialer.md https://github.com/XTLS/Xray-docs-next/pull/533 --- docs/ru/config/features/browser_dialer.md | 73 +++++++++++++---------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/docs/ru/config/features/browser_dialer.md b/docs/ru/config/features/browser_dialer.md index 6848aaf..67588a1 100644 --- a/docs/ru/config/features/browser_dialer.md +++ b/docs/ru/config/features/browser_dialer.md @@ -1,47 +1,54 @@ -# Браузерный Dialer +# Browser Dialer - + ## Предыстория -Основываясь на [идее, возникшей год назад](https://github.com/v2ray/discussion/issues/754#issuecomment-647934994), с помощью нативного JavaScript был реализован простой WSS-браузерный Dialer, который эмулирует TLS-отпечаток и поведенческие характеристики реального браузера. +Xray обычно использует uTLS для имитации поведения популярных браузеров, и им можно управлять с помощью настройки `fingerprint`. Однако отпечатки, создаваемые uTLS, являются несовершенной копией реальных, и поскольку uTLS является популярной библиотекой, они сами могут стать целью. -Однако WSS все еще имеет очевидные проблемы с ALPN, поэтому следующим шагом будет пересылка `HTTP/2` и `QUIC` через браузер. +Итак, [идея Browser Dialer](https://github.com/v2ray/discussion/issues/754#issuecomment-647934994) заключается в том, что Xray использует настоящий браузер для установления TLS-соединений. Это работает так: Xray запускает небольшой веб-сайт на `localhost:8080`, пользователь открывает этот веб-сайт в выбранном им браузере, а JavaScript на этой странице будет действовать как сетевой стек Xray (HTTP-клиент, TLS-клиент). -## Xray и JS +Таким образом, поведение снятия отпечатков TLS является идеальным, и поэтому может быть возможно оживить серверы, которые отлично открываются как веб-сайты в браузере, но не подключаются с использованием какого-либо программного обеспечения для проксирования. -Был создан очень простой и элегантный механизм связи: +Однако есть много недостатков: -- Xray прослушивает адрес и порт A в качестве HTTP-сервера. - Браузер обращается к A и загружает JavaScript-код с веб-страницы. -- JavaScript-код устанавливает WebSocket-соединение с A. - После успешного установления соединения Xray передает соединение в канал. -- При необходимости установить соединение Xray получает доступное соединение из канала и отправляет целевой URL-адрес и необязательные ранние данные (early data). -- JavaScript-код сообщает Xray об успешном подключении к цели и продолжает использовать это соединение для двунаправленной передачи данных. - Соединение закрывается синхронно. -- Соединение закрывается после использования, но JavaScript-код гарантирует, что всегда есть доступные новые соединения. +* Пользователь должен запускать браузер рядом с клиентом Xray только для открытия прокси-соединения. +* Browser Dialer не должен быть туннелирован через сам прокси, иначе возникнет петля. Пользователи TUN должны быть осторожны. +* Браузер может работать только со стандартным HTTP, что означает, что поддерживаются только [WebSocket](../../transports/websocket.md) и [SplitHTTP](../../transports/splithttp.md). +* [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) необходимо учитывать при выполнении запросов с одного веб-сайта (`localhost:8080`) на другой (`proxy.example.com:443`). +* Браузер туннелирует ваш трафик с помощью JavaScript, поэтому наблюдается значительное снижение производительности (или разрядка аккумулятора). +* Конфигурация, используемая с Browser Dialer, не может использовать собственные заголовки SNI или хоста. `SNI == host == address`. Пользовательские заголовки HTTP и `tlsSettings` игнорируются полностью. -## Ранние данные (Early data) +## Конфигурация -Механизм ранних данных был скорректирован в соответствии с потребностями браузера: +1. Подготовьте рабочую конфигурацию WebSocket или SplitHTTP. Помните о вышеуказанных ограничениях. +2. Запустите Xray с помощью `XRAY_BROWSER_DIALER=127.0.0.1:8080`. В Windows это можно сделать как `set XRAY_BROWSER_DIALER=...`, а затем запустить ядро из консоли, в Linux ядро можно запустить как `XRAY_BROWSER_DIALER=127.0.0.1:8080 ./xray -c config.json`. +3. Откройте браузер, который не туннелирован через прокси, или измените маршрутизацию конфигурации таким образом, чтобы домен сервера Xray переходил к `freedom` непосредственно с клиента. Перейдите по адресу `localhost:8080` и откройте консоль разработчика с помощью `F12`, чтобы отслеживать ошибки. +4. Для повышения производительности и обхода произвольных ограничений на подключение, применяемых браузером, рекомендуется включить `Mux.Cool`. -- Заголовок ответа сервера содержит заголовок `Sec-WebSocket-Protocol` запроса, что также частично скрывает характеристики длины ответа рукопожатия WSS. -- Для кодирования ранних данных, отправляемых браузеру, используется `base64.RawURLEncoding`, а не `StdEncoding`. - Сервер обеспечивает совместимость. -- Кроме того, из-за [Xray-core#375](https://github.com/XTLS/Xray-core/pull/375) рекомендуется использовать `?ed=2048`. - В этом PR также увеличен `MaxHeaderBytes` на сервере до 4096. - ~~(Хотя, кажется, это не обязательно)~~ +## Внутренняя работа -## Конфигурация +- Xray прослушивает `http://127.0.0.1:8080`, а браузер обращается к `http://127.0.0.1:8080`, чтобы загрузить `JS` на веб-страницу. +- `JS` активно устанавливает соединение WebSocket с `http://127.0.0.1:8080`. Xray будет использовать это соединение для отправки инструкций, но пока оно попадает в пул соединений (реализованный как канал Go). +- Когда необходимо установить соединение, Xray получает доступное соединение из пула и отправляет имя протокола, целевой URL-адрес и необязательные ранние данные. +- Как только `JS` успешно подключается к цели, он сообщает об этом Xray и продолжает использовать это соединение для двунаправленной пересылки данных. +- После закрытия соединения с сервером соединение с localhost также закрывается, но JS гарантирует, что всегда доступно как минимум одно незанятое соединение. -Это экспериментальный процесс. -В настоящее время конфигурация выглядит следующим образом (Xray-core v1.4.1): +## WebSocket + + + +В соответствии с потребностями браузера механизм ранних данных был скорректирован следующим образом: + +- Заголовок ответа сервера будет содержать запрошенный `Sec-WebSocket-Protocol`, который также изначально obfuscates the length characteristic of the WSS handshake response. +- Кодировка, используемая для ранних данных для браузеров, - это `base64.RawURLEncoding` вместо `StdEncoding`, и сервер сделал ее совместимой. +- Кроме того, в связи с [Xray-core#375](https://github.com/XTLS/Xray-core/pull/375) рекомендациями по `?ed=2048` этот PR также увеличил сервер `MaxHeaderBytes` на 4096. ~~(Хотя, похоже, это будет работать и без модификации.)~~ + +## SplitHTTP + + + +SplitHTTP поддерживает QUIC, но также может использоваться собственный стек QUIC браузера. В Chrome это можно сделать через `chrome://flags`, в других браузерах он может быть уже включен или для него может потребоваться другой флаг. + +В общем, `tlsSettings` полностью игнорируются при использовании Browser Dialer. Xray никак не контролирует, какую версию HTTP выбирает браузер. -- Подготовьте рабочую конфигурацию WSS. - Обратите внимание, что в поле `address` нужно указать доменное имя. - Если нужно указать IP-адрес, настройте DNS или добавьте запись в файл hosts. -- Если трафик браузера также проходит через Xray-core, обязательно настройте прямое подключение для этого домена, чтобы избежать зацикливания трафика. -- Установите переменную окружения, указывающую адрес и порт, который нужно прослушивать, например, `XRAY_BROWSER_DIALER = 127.0.0.1:8080`. -- Сначала запустите Xray-core, а затем откройте указанный адрес и порт в любом браузере. - Вы также можете открыть инструменты разработчика (F12) и посмотреть консоль и вкладку "Сеть". -- Браузеры ограничивают количество WebSocket-соединений, поэтому рекомендуется включить `Mux.Cool`. \ No newline at end of file