И SOCKS5, и открытый HTTP CONNECT кладут на провод фиксированное, узнаваемое рукопожатие ещё до того, как пойдёт хоть один байт вашего трафика - обернуть это в TLS значит спрятать байты от пассивного наблюдателя, но не от того, что само терминирует этот TLS. AntiBrow relay устроен иначе: движок браузера открывает одно зашифрованное WebSocket-соединение и говорит внутри него протоколом кадров с AEAD-запечатыванием, а на другом конце - ваш собственный вышестоящий прокси. Это открытый исходный код под лицензией MIT, рассчитанный на то, что вы развернёте его на своём собственном домене.
Каждая ячейка ниже - то, что протокол делает уже сегодня. Полный формат кадров и схема ключей - в whitepaper (доступен только на английском).
| SOCKS5 | HTTPS-прокси | AntiBrow relay | |
|---|---|---|---|
| Что видит пассивный наблюдатель | Рукопожатие SOCKS5 | Открытый CONNECT с именем цели | WebSocket-соединение с хостом, на котором стоит relay |
| Имя хоста-цели на проводе | В рукопожатии | В строке CONNECT | Внутри зашифрованного кадра |
| Заголовок протокола фиксированной длины | Да | Да | Нет |
| Учётные данные прокси доходят до процесса страницы | Нет | Нет | Нет |
| Работает без локального вспомогательного процесса | Да | Да | Да |
Engine runtime говорит на этом протоколе нативно - нет ни локального процесса-форвардера, ни браузерного расширения, поэтому chrome://extensions остаётся пустым. Учётные данные прокси доходят до процесса сетевой службы и никогда не попадают в процесс рендеринга страницы.
Каждое соединение выводит две независимые по направлению пары ключей из выбранной клиентом соли через HKDF-SHA256, и каждый кадр запечатывается отдельно AES-256-GCM под строго возрастающим счётчиком-нонсом. Это тот же примитив, на котором строятся WireGuard и OpenVPN, только упакованный в WebSocket поверх TLS вместо собственного транспорта.
При развёртывании как Cloudflare Worker браузер подключается к ближайшей точке присутствия Cloudflare, а дальний участок до вашего собственного вышестоящего прокси идёт по магистрали Cloudflare. Это свойство именно такого развёртывания, а не протокола - разверните relay как обычный процесс Node, и браузер просто держит открытым WebSocket до того хоста, на который вы его поставили.
Нет открытой строки CONNECT, нет байтов рукопожатия SOCKS5, нет заголовка протокола фиксированной длины, а SNI в TLS называет ваш собственный домен. Сигнатурному и эвристическому сопоставлению трафика прокси или анонимайзера - тому, что встроено в корпоративные файрволы и DPI-устройства - здесь просто не с чем сопоставлять.
Два ограничения, о которых стоит знать заранее. Управляемое устройство, выполняющее перехват TLS с помощью внутрикорпоративного корневого сертификата, видит апгрейд WebSocket и зашифрованные кадры под ним. Сигнатуры протокола прокси там всё равно нет, но с этой точки соединение уже не полностью скрыто. Фильтрация по категориям доменов вообще не зависит от протокола - она блокирует хост ещё до того, как проверяется хоть один байт, и именно поэтому важно разворачивать relay на собственном домене, а не на общем для всех.
Три команды поднимают развёртывание: сгенерировать ключ, задеплоить, создать аккаунт.
npx antibrow-relay keygen печатает предустановленный ключ для развёртывания. Сохраните его - сам relay его нигде не хранит.
wrangler deploy разворачивает его как Cloudflare Worker, либо запустите его как обычный процесс Node. Привяжите свой домен до того, как пускать через него реальный трафик.
Откройте /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.
Формат кадров, схема ключей и то, что именно видит каждый из трёх наблюдателей из модели угроз - и чего не видит.