You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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 игнорируются полностью.

Конфигурация

  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.

Внутренняя работа

  • 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 выбирает браузер.