7.6 KiB
Browser Dialer
Предыстория
Xray обычно использует uTLS для имитации поведения популярных браузеров, и им можно управлять с помощью настройки fingerprint
. Однако отпечатки, создаваемые uTLS, являются несовершенной копией реальных, и поскольку uTLS является популярной библиотекой, они сами могут стать целью.
Итак, идея Browser Dialer заключается в том, что Xray использует настоящий браузер для установления TLS-соединений. Это работает так: Xray запускает небольшой веб-сайт на localhost:8080
, пользователь открывает этот веб-сайт в выбранном им браузере, а JavaScript на этой странице будет действовать как сетевой стек Xray (HTTP-клиент, TLS-клиент).
Таким образом, поведение снятия отпечатков TLS является идеальным, и поэтому может быть возможно оживить серверы, которые отлично открываются как веб-сайты в браузере, но не подключаются с использованием какого-либо программного обеспечения для проксирования.
Однако есть много недостатков:
- Пользователь должен запускать браузер рядом с клиентом Xray только для открытия прокси-соединения.
- Browser Dialer не должен быть туннелирован через сам прокси, иначе возникнет петля. Пользователи TUN должны быть осторожны.
- Браузер может работать только со стандартным HTTP, что означает, что поддерживаются только WebSocket и SplitHTTP.
- CORS необходимо учитывать при выполнении запросов с одного веб-сайта (
localhost:8080
) на другой (proxy.example.com:443
). - Браузер туннелирует ваш трафик с помощью JavaScript, поэтому наблюдается значительное снижение производительности (или разрядка аккумулятора).
- Конфигурация, используемая с Browser Dialer, не может использовать собственные заголовки SNI или хоста.
SNI == host == address
. Пользовательские заголовки HTTP иtlsSettings
игнорируются полностью.
Конфигурация
- Подготовьте рабочую конфигурацию WebSocket или SplitHTTP. Помните о вышеуказанных ограничениях.
- Запустите 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
. - Откройте браузер, который не туннелирован через прокси, или измените маршрутизацию конфигурации таким образом, чтобы домен сервера Xray переходил к
freedom
непосредственно с клиента. Перейдите по адресуlocalhost:8080
и откройте консоль разработчика с помощьюF12
, чтобы отслеживать ошибки. - Для повышения производительности и обхода произвольных ограничений на подключение, применяемых браузером, рекомендуется включить
Mux.Cool
.
Внутренняя работа
- 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 гарантирует, что всегда доступно как минимум одно незанятое соединение.
WebSocket
В соответствии с потребностями браузера механизм ранних данных был скорректирован следующим образом:
- Заголовок ответа сервера будет содержать запрошенный
Sec-WebSocket-Protocol
, который также изначально obfuscates the length characteristic of the WSS handshake response. - Кодировка, используемая для ранних данных для браузеров, - это
base64.RawURLEncoding
вместоStdEncoding
, и сервер сделал ее совместимой. - Кроме того, в связи с Xray-core#375 рекомендациями по
?ed=2048
этот PR также увеличил серверMaxHeaderBytes
на 4096.(Хотя, похоже, это будет работать и без модификации.)
SplitHTTP
SplitHTTP поддерживает QUIC, но также может использоваться собственный стек QUIC браузера. В Chrome это можно сделать через chrome://flags
, в других браузерах он может быть уже включен или для него может потребоваться другой флаг.
В общем, tlsSettings
полностью игнорируются при использовании Browser Dialer. Xray никак не контролирует, какую версию HTTP выбирает браузер.