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