Утечка IP через WebRTC: что это такое и как ее предотвратить
Как WebRTC раскрывает ваш реальный IP-адрес через ICE-кандидатов и как предотвратить утечки WebRTC, сохраняя функциональность.
Нужна поддерживаемая продуктовая документация?
У этой статьи есть соответствующая страница в центре документации. Используйте docs для каноничного сценария настройки, актуальных флагов и долгосрочной справки.
Введение
WebRTC - это технология браузера для коммуникации в реальном времени: видеозвонков, голосового чата, P2P-обмена файлами. Для установления этих соединений браузеры используют протокол ICE (Interactive Connectivity Establishment), который собирает адреса сетевых интерфейсов и обменивается ими с пирами. Проблема в том, что ICE собирает ваши реальные IP-адреса, включая локальные сетевые IP и ваш публичный IP, и делает их доступными через JavaScript. Это происходит вне обычного пути HTTP-прокси, что означает, что прокси сам по себе вас не защищает.
BotBrowser контролирует поведение ICE WebRTC на уровне движка браузера. Вместо полного отключения WebRTC (что само по себе является обнаруживаемым сигналом), BotBrowser обеспечивает, чтобы ICE-кандидаты содержали только IP-адреса, согласованные с вашей прокси-идентичностью.
Влияние на конфиденциальность
Утечки IP через WebRTC являются одной из наиболее известных проблем конфиденциальности в технологиях браузера. Когда веб-страница инициирует пиринговое соединение WebRTC, браузер собирает ICE-кандидатов от каждого доступного сетевого интерфейса. Эти кандидаты содержат:
- Локальные IP-адреса: Приватный IP вашей машины в локальной сети (например, 192.168.1.100)
- Публичный IP-адрес: Ваш реальный публичный IP из ответов STUN-сервера
- IPv6-адреса: При наличии, ваш полный IPv6-адрес
Веб-сайт может собирать эти кандидаты через API RTCPeerConnection без какого-либо взаимодействия с пользователем или запросов разрешений. Даже если вы направляете весь HTTP-трафик через прокси, запросы STUN WebRTC идут напрямую к STUN-серверу, раскрывая ваш реальный публичный IP.
Это создает прямой путь к деанонимизации. Система отслеживания, видящая IP вашего прокси в HTTP-запросах, но ваш реальный IP в ICE-кандидатах WebRTC, точно знает, что происходит. Само несоответствие является сильным сигналом.
Техническая основа
Как работает сбор ICE-кандидатов
Когда JavaScript создает RTCPeerConnection, браузер начинает сбор ICE-кандидатов. Этот процесс включает:
-
Host-кандидаты: Браузер перечисляет локальные сетевые интерфейсы и собирает их IP-адреса. Они становятся "host"-кандидатами.
-
Server-reflexive кандидаты: Браузер отправляет STUN (Session Traversal Utilities for NAT) binding-запросы к настроенным STUN-серверам. STUN-сервер отвечает с публичным IP-адресом, который он видит, создавая "srflx"-кандидатов.
-
Relay-кандидаты: Если настроены TURN (Traversal Using Relays around NAT) серверы, браузер устанавливает пути ретрансляции через них, создавая "relay"-кандидатов.
Каждый тип кандидата раскрывает разную сетевую информацию. Host-кандидаты раскрывают локальные IP. Server-reflexive кандидаты раскрывают ваш публичный IP. Комбинация всех трех предоставляет детальную карту вашей сетевой топологии.
Почему расширения не могут полностью решить проблему
Расширения браузера, пытающиеся контролировать WebRTC, имеют фундаментальные ограничения:
- Полное отключение WebRTC предотвращает сбор ICE, но создает обнаруживаемый отпечаток. Сайты могут проверить отсутствие
RTCPeerConnectionи отметить это. - Блокировка STUN-запросов на уровне расширения может пропустить запросы, инициированные до загрузки расширения или из service workers.
- Модификация ICE-кандидатов через monkey-patching JavaScript ненадежна. Реальные кандидаты генерируются в нативном коде до того, как JavaScript может их перехватить.
Контроль на уровне движка - единственный подход, способный модифицировать генерацию ICE-кандидатов у источника, до того как любой JavaScript на странице сможет наблюдать оригинальные значения.
Распространенные подходы и их ограничения
Отключение WebRTC в настройках браузера
Некоторые браузеры позволяют отключить WebRTC через флаги (например, media.peerconnection.enabled в Firefox). Это останавливает весь сбор ICE, но также ломает легитимные функции WebRTC, такие как видеоконференции. Более того, отсутствие API WebRTC является отличительным сигналом отпечатка. Браузер без RTCPeerConnection выделяется.
Расширения контроля WebRTC
Расширения вроде WebRTC Leak Prevent или uBlock Origin могут ограничить WebRTC определенными диапазонами IP. Однако расширения работают на уровне JavaScript после того, как движок браузера уже собрал кандидатов. Они могут перехватить обратный вызов onicecandidate, но оригинальные кандидаты существуют в памяти. Некоторые подходы расширений также создают обнаруживаемые побочные эффекты: модифицированные цепочки прототипов, измененные паттерны тайминга или отсутствующие свойства объекта RTCPeerConnection.
Защита на уровне VPN
VPN направляет весь системный трафик, включая STUN-запросы, через VPN-туннель. Это предотвращает обнаружение вашего реального IP STUN-сервером. Однако VPN не контролируют локальные (host) ICE-кандидаты. Ваш локальный сетевой IP (например, 192.168.x.x) все равно собирается и раскрывается. Для некоторых сценариев отслеживания локальные IP вносят вклад в стабильный идентификатор.
Подход BotBrowser на уровне движка
BotBrowser модифицирует генерацию ICE-кандидатов внутри сетевого стека Chromium. Это принципиально отличается от всех подходов выше:
- WebRTC остается полностью функциональным.
RTCPeerConnectionсуществует и работает нормально. - ICE-кандидаты генерируются с контролируемой IP-информацией с самого начала.
- Нет JavaScript-видимых модификаций объектов WebRTC.
- Поведение STUN/TURN контролируется на сетевом уровне, а не перехватывается после факта.
Подход BotBrowser
Флаг --bot-webrtc-ice
Флаг --bot-webrtc-ice BotBrowser (ENT Tier1) контролирует, какие ICE-серверы используются и какая IP-информация появляется в кандидатах:
# Использовать STUN-сервер Google (пресет)
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server="socks5://user:pass@proxy:1080" \
--bot-webrtc-ice="google"
# Использовать пользовательские STUN и TURN серверы
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server="socks5://user:pass@proxy:1080" \
--bot-webrtc-ice="custom:stun:stun.example.com:3478,turn:turn.example.com:3478"
Пресет google настраивает stun:stun.l.google.com:19302, который является наиболее часто наблюдаемой конфигурацией STUN в обычных браузерах Chrome.
Как это работает совместно с прокси
В сочетании с --proxy-server BotBrowser обеспечивает:
- STUN-запросы маршрутизируются через прокси, и STUN-сервер видит IP прокси
- ICE-кандидаты содержат только IP прокси как публичный адрес
- Локальные сетевые IP не появляются в host-кандидатах
- Отпечаток WebRTC соответствует тому, что произвел бы обычный пользователь за этим прокси
UDP через SOCKS5 (ENT Tier3)
Для пользователей ENT Tier3 BotBrowser поддерживает SOCKS5 UDP ASSOCIATE. Это автоматически туннелирует QUIC-трафик и STUN-зонды через SOCKS5-прокси, когда прокси поддерживает UDP:
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server="socks5://user:pass@proxy:1080"
Дополнительные флаги не нужны. Если SOCKS5-прокси поддерживает UDP ASSOCIATE, BotBrowser автоматически туннелирует STUN-трафик через него.
Настройка WebRTC через профиль
Поведение WebRTC также может контролироваться через конфигурацию профиля:
# Использовать настройки WebRTC из профиля
chrome --bot-profile="/path/to/profile.enc" \
--bot-config-webrtc=profile
# Полностью отключить WebRTC (не рекомендуется для согласованности)
chrome --bot-profile="/path/to/profile.enc" \
--bot-config-webrtc=disabled
Настройка profile использует конфигурацию WebRTC, определенную профилем. Настройка disabled отключает WebRTC, но создает обнаруживаемый сигнал и должна использоваться только когда функциональность WebRTC действительно не нужна.
Настройка и использование
Полная настройка конфиденциальности (CLI)
Сочетайте защиту WebRTC с прокси, DNS и настройками отпечатков:
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server="socks5://user:pass@proxy:1080" \
--bot-webrtc-ice="google" \
--bot-local-dns \
--bot-config-timezone="America/New_York" \
--bot-config-locale="en-US"
Интеграция с Playwright
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--proxy-server=socks5://user:pass@proxy:1080',
'--bot-webrtc-ice=google',
'--bot-local-dns',
],
headless: true,
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
await browser.close();
})();
Интеграция с Puppeteer
const puppeteer = require('puppeteer-core');
(async () => {
const browser = await puppeteer.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--proxy-server=socks5://user:pass@proxy:1080',
'--bot-webrtc-ice=google',
'--bot-local-dns',
],
headless: true,
defaultViewport: null,
});
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
})();
Проверка
После запуска BotBrowser с защитой WebRTC:
- Посетите сайт тестирования утечек WebRTC (например, browserleaks.com/webrtc)
- Проверьте, что никакие локальные IP-адреса (192.168.x.x, 10.x.x.x) не появляются в ICE-кандидатах
- Убедитесь, что только IP прокси отображается как публичный адрес
- Подтвердите, что ваш реальный публичный IP не виден ни в одном кандидате
- Проверьте, что функции WebRTC все еще работают (API должен быть доступен и функционален)
Вы также можете проверить программно:
const candidates = await page.evaluate(() => {
return new Promise((resolve) => {
const ips = [];
const pc = new RTCPeerConnection({
iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]
});
pc.createDataChannel('test');
pc.onicecandidate = (e) => {
if (e.candidate) {
const match = e.candidate.candidate.match(/([0-9]{1,3}\.){3}[0-9]{1,3}/);
if (match) ips.push(match[0]);
} else {
resolve(ips);
}
};
pc.createOffer().then(o => pc.setLocalDescription(o));
});
});
console.log('ICE candidate IPs:', candidates);
Лучшие практики
-
Всегда сочетайте --bot-webrtc-ice с --proxy-server. Защита WebRTC имеет смысл только при маршрутизации трафика через прокси. Без прокси ваш реальный IP уже виден в HTTP-запросах.
-
Используйте пресет "google", если нет специальных требований. STUN-сервер Google является наиболее часто наблюдаемой конфигурацией и создает наиболее естественно выглядящие ICE-кандидаты.
-
Добавьте --bot-local-dns для полной сетевой конфиденциальности. WebRTC и DNS - два наиболее распространенных пути сетевых утечек. Закрытие обоих обеспечивает комплексную защиту.
-
Не отключайте WebRTC без необходимости. Отключение WebRTC создает обнаруживаемый сигнал отпечатка. Контролируемый подход BotBrowser сохраняет WebRTC функциональным, защищая ваш IP.
-
Тестируйте после каждого изменения конфигурации. Поведение WebRTC зависит от взаимодействия прокси, ICE-сервера и сетевой конфигурации. Всегда проверяйте после изменений.
Часто задаваемые вопросы
Ломает ли BotBrowser видеозвонки WebRTC? Нет. WebRTC остается полностью функциональным. Видеозвонки, голосовой чат и P2P-соединения работают нормально. BotBrowser контролирует только то, какие IP-адреса появляются в ICE-кандидатах.
В чем разница между --bot-webrtc-ice и --bot-config-webrtc?
Флаг --bot-webrtc-ice контролирует конфигурацию ICE-серверов и раскрытие IP. Флаг --bot-config-webrtc контролирует, использует ли WebRTC настройки профиля, реальные системные настройки или полностью отключен.
Нужен ли --bot-webrtc-ice, если я использую VPN? VPN предотвращает обнаружение вашего реального публичного IP STUN-серверами, но локальные host-кандидаты могут быть раскрыты. BotBrowser обеспечивает более полный контроль над всеми типами кандидатов.
Могут ли веб-сайты обнаружить, что ICE-кандидаты контролируются? BotBrowser модифицирует генерацию кандидатов на уровне движка. ICE-кандидаты выглядят идентично тем, которые создает браузер за прокси с этим IP. Нет JavaScript-видимых артефактов.
А как насчет утечек IPv6 через WebRTC? BotBrowser контролирует генерацию как IPv4, так и IPv6 кандидатов. IPv6-адреса ваших реальных сетевых интерфейсов не появляются в ICE-кандидатах.
Требует ли UDP через SOCKS5 специальной настройки прокси?
Прокси должен поддерживать SOCKS5 UDP ASSOCIATE (RFC 1928). BotBrowser автоматически определяет эту возможность. Никаких дополнительных флагов помимо --proxy-server не требуется.
Итоги
Утечки IP через WebRTC являются серьезной проблемой конфиденциальности, которую прокси сами по себе не решают. BotBrowser контролирует генерацию ICE-кандидатов на уровне движка браузера, обеспечивая появление в кандидатах WebRTC только IP-адресов, согласованных с прокси, при сохранении полной функциональности WebRTC.
Для полной настройки сетевой конфиденциальности сочетайте защиту WebRTC с Настройкой прокси и Предотвращением утечек DNS. Для управления несколькими идентичностями с разными сетевыми конфигурациями см. Изоляция мультиаккаунтного браузера.
Похожие статьи
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.