Relay с шифрованием

Прокси демаскирует не то, что он передаёт, а собственное рукопожатие.

И SOCKS5, и открытый HTTP CONNECT кладут на провод фиксированное, узнаваемое рукопожатие ещё до того, как пойдёт хоть один байт вашего трафика - обернуть это в TLS значит спрятать байты от пассивного наблюдателя, но не от того, что само терминирует этот TLS. AntiBrow relay устроен иначе: движок браузера открывает одно зашифрованное WebSocket-соединение и говорит внутри него протоколом кадров с AEAD-запечатыванием, а на другом конце - ваш собственный вышестоящий прокси. Это открытый исходный код под лицензией MIT, рассчитанный на то, что вы развернёте его на своём собственном домене.

Три транспорта, что видно на проводе.

Каждая ячейка ниже - то, что протокол делает уже сегодня. Полный формат кадров и схема ключей - в whitepaper (доступен только на английском).

SOCKS5HTTPS-проксиAntiBrow relay
Что видит пассивный наблюдатель Рукопожатие SOCKS5 Открытый CONNECT с именем цели WebSocket-соединение с хостом, на котором стоит relay
Имя хоста-цели на проводе В рукопожатии В строке CONNECT Внутри зашифрованного кадра
Заголовок протокола фиксированной длины Да Да Нет
Учётные данные прокси доходят до процесса страницы Нет Нет Нет
Работает без локального вспомогательного процесса Да Да Да

Шифрование прямо в браузере

Engine runtime говорит на этом протоколе нативно - нет ни локального процесса-форвардера, ни браузерного расширения, поэтому chrome://extensions остаётся пустым. Учётные данные прокси доходят до процесса сетевой службы и никогда не попадают в процесс рендеринга страницы.

HKDF + AES-256-GCM на каждый кадр

Каждое соединение выводит две независимые по направлению пары ключей из выбранной клиентом соли через HKDF-SHA256, и каждый кадр запечатывается отдельно AES-256-GCM под строго возрастающим счётчиком-нонсом. Это тот же примитив, на котором строятся WireGuard и OpenVPN, только упакованный в WebSocket поверх TLS вместо собственного транспорта.

Edge-переход - если вы так развернули

При развёртывании как Cloudflare Worker браузер подключается к ближайшей точке присутствия Cloudflare, а дальний участок до вашего собственного вышестоящего прокси идёт по магистрали Cloudflare. Это свойство именно такого развёртывания, а не протокола - разверните relay как обычный процесс Node, и браузер просто держит открытым WebSocket до того хоста, на который вы его поставили.

Без сигнатуры протокола прокси

Нет открытой строки CONNECT, нет байтов рукопожатия SOCKS5, нет заголовка протокола фиксированной длины, а SNI в TLS называет ваш собственный домен. Сигнатурному и эвристическому сопоставлению трафика прокси или анонимайзера - тому, что встроено в корпоративные файрволы и DPI-устройства - здесь просто не с чем сопоставлять.

Два ограничения, о которых стоит знать заранее. Управляемое устройство, выполняющее перехват TLS с помощью внутрикорпоративного корневого сертификата, видит апгрейд WebSocket и зашифрованные кадры под ним. Сигнатуры протокола прокси там всё равно нет, но с этой точки соединение уже не полностью скрыто. Фильтрация по категориям доменов вообще не зависит от протокола - она блокирует хост ещё до того, как проверяется хоть один байт, и именно поэтому важно разворачивать relay на собственном домене, а не на общем для всех.

Разверните на своём домене.

Три команды поднимают развёртывание: сгенерировать ключ, задеплоить, создать аккаунт.

1. Сгенерировать ключ

npx antibrow-relay keygen печатает предустановленный ключ для развёртывания. Сохраните его - сам relay его нигде не хранит.

2. Задеплоить

wrangler deploy разворачивает его как Cloudflare Worker, либо запустите его как обычный процесс Node. Привяжите свой домен до того, как пускать через него реальный трафик.

3. Создать аккаунт

Откройте /admin и создайте вышестоящий прокси и аккаунт для него. Учётные данные аккаунта - это то, что клиент передаёт в URL relay:// ниже.

Это использование через SDK, а не поле для прокси в интерфейсе клиента. launch() в JavaScript SDK принимает URL напрямую:

import { AntiDetectBrowser } from 'anti-detect-browser'

const browser = await new AntiDetectBrowser({ apiKey }).launch({
  proxy: 'relay://alice:s3cret@relay.yourdomain.com?key=<relay key>',
})

?key= - это общий ключ развёртывания из шага 1, и именно он включает зашифрованный протокол: и для браузера, и для запроса выходного IP, который SDK делает перед запуском, чтобы часовой пояс и WebRTC следовали за выходом relay. Без него URL означает старый незашифрованный протокол, который relay отдаёт, только если оператор его включил.

Python SDK принимает тот же URL relay:// в своём launch() - оба SDK находятся на github.com/antibrow/antibrow. Полный формат кадров, схема ключей и шаги развёртывания - в whitepaper (только на английском); исходный код самого relay-сервера - на github.com/antibrow/relay.

Не хотите разворачивать сами? Готовый relay доступен на bastion.antibrow.com.

Прочитайте whitepaper.

Формат кадров, схема ключей и то, что именно видит каждый из трёх наблюдателей из модели угроз - и чего не видит.