Configuras un proxy, abres una consulta de IP y muestra la IP del proxy. ¿Trabajo hecho? No siempre. Una página aún puede encontrar tu IP real a través de WebRTC, una función del navegador que ignora por diseño los ajustes de proxy del navegador. Si usas proxies residenciales para ver un sitio como lo vería un visitante local, una fuga de WebRTC puede deshacerlo sin ninguna señal visible.
Esta guía explica cómo funciona la fuga, cómo comprobarla en dos minutos y cómo cerrarla en Chrome, Firefox y navegadores automatizados.
Cómo se produce la fuga
WebRTC permite a los navegadores hacer llamadas y enviarse datos directamente entre sí. Para ello, cada navegador reúne “candidatos ICE”: direcciones en las que podría ser localizado. Uno de los pasos es preguntar a un servidor STUN, por UDP, “¿desde qué dirección pública ves que me conecto?”. La respuesta pasa a un candidato que el JavaScript de la página puede leer.
El problema es la ruta que sigue esa pregunta. Un proxy HTTP típico solo transporta tus solicitudes web, no UDP. Así que la petición STUN sale por tu propia conexión y la respuesta es tu IP pública real. RFC 8828, el estándar del IETF sobre el tratamiento de direcciones en WebRTC, lo dice claramente: las comprobaciones STUN pueden eludir un proxy y revelar la IP pública de un cliente si se permite el acceso directo a internet. También recomienda que el tráfico WebRTC no se envíe por proxies de forma predeterminada, por la calidad de las llamadas.
Dos detalles importan:
- Las direcciones locales ya se ocultan en su mayoría. Chrome y Firefox sustituyen tu dirección de red privada por un nombre
.localaleatorio en la mayoría de las páginas. En Firefox es el ajustemedia.peerconnection.ice.obfuscate_host_addresses, activado por defecto. Tu IP pública es el riesgo real. - La página no necesita ningún permiso. Reunir candidatos no requiere acceso a la cámara ni al micrófono, así que no aparece ningún aviso.
Compruébalo en dos minutos
No necesitas un sitio de pruebas de terceros. Abre la página que te interesa, o cualquiera, con el proxy activado, abre la consola de desarrollo (F12) y pega esto:
const pc = new RTCPeerConnection({ iceServers: [{ urls: "stun:stun.l.google.com:19302" }] });
pc.createDataChannel("t");
pc.onicecandidate = (e) => e.candidate && console.log(e.candidate.candidate);
pc.createOffer().then((o) => pc.setLocalDescription(o));
Fíjate en las líneas que contienen typ srflx. La dirección de esa línea es la IP pública que vio el servidor STUN.
- Si coincide con tu IP de casa o de la oficina, WebRTC está filtrando.
- Si coincide con la IP del proxy, o no hay ninguna línea
srflx, estás bien. - Las líneas con
typ hosty un nombre.localson tu dirección local oculta, y son lo esperado.
Después compara con una consulta de IP como IP Info en el mismo navegador. Debería mostrar la IP y la ubicación del proxy. Si la consulta muestra el proxy pero la línea srflx te muestra a ti, el proxy funciona y WebRTC lo esquiva.
Corrígelo en Chrome
Lo más fácil: usa una extensión que lo gestione. La extensión de navegador de Shifter activa por defecto la protección contra fugas de WebRTC mientras estás conectado. Por debajo, las extensiones de Chrome controlan esto mediante el ajuste de privacidad webRTCIPHandlingPolicy. Si otra extensión ya controla WebRTC, solo una de las dos puede prevalecer, y la extensión de Shifter te avisa cuando su protección no está activa. Elimina o desactiva la otra.
Ordenadores gestionados: Chrome tiene una política empresarial, WebRtcIPHandling, con cuatro valores:
| Valor | Qué usa WebRTC |
|---|---|
default | Todas las interfaces de red disponibles |
default_public_and_private_interfaces | La interfaz de cara al público, con direcciones privadas permitidas |
default_public_interface_only | Solo la interfaz de cara al público, sin direcciones privadas |
disable_non_proxied_udp | TCP a través del proxy; UDP solo si el proxy lo admite |
Solo disable_non_proxied_udp detiene la fuga de la IP pública detrás de un proxy. Los dos valores de “interfaz pública” siguen consultando al servidor STUN por tu propia conexión.
Corrígelo en Firefox
La extensión de Shifter también lo gestiona en Firefox. Para hacerlo a mano, abre about:config y establece:
media.peerconnection.ice.proxy_only_if_behind_proxyentrue: WebRTC solo usa el proxy cuando hay uno configurado. Es la solución dirigida.media.peerconnection.ice.default_address_onlyentrue: solo se usa la ruta predeterminada. Oculta direcciones locales adicionales, pero por sí sola no evita la fuga de la IP pública.media.peerconnection.enabledenfalse: desactiva WebRTC por completo. Es la opción más drástica y rompe las llamadas en ese navegador.
Después, vuelve a ejecutar la prueba en la consola: la línea srflx debería desaparecer o mostrar la IP del proxy.
Corrígelo en navegadores automatizados
Playwright, Puppeteer y Selenium inician un navegador real, así que filtran de la misma manera. Para Chromium, inícialo con:
--force-webrtc-ip-handling-policy=disable_non_proxied_udp
Para Firefox, establece las mismas preferencias de about:config en el perfil que lanza tu framework. Después ejecuta desde tu script la prueba de consola anterior y revisa el resultado srflx como parte de tus comprobaciones de configuración. Nuestra guía sobre proxies residenciales en Selenium y Playwright muestra dónde van estas opciones.
WebRTC no es la única fuga
Cierra de paso las demás brechas relacionadas:
- DNS. Las resoluciones de nombres pueden eludir el proxy y resolverse desde tu propia red. Nuestra guía sobre cómo evitar fugas de DNS explica
socks5hy cómo comprobarlo. - IPv6. Si la ruta de tu proxy es solo IPv4, un navegador que también tenga IPv6 puede usarla en algunas solicitudes.
- Zona horaria e idioma. No revelan tu IP, pero pueden contradecir la ubicación de tu proxy.
En resumen
Una fuga de WebRTC se produce porque el navegador pide a un servidor STUN tu dirección por UDP, y la mayoría de los proxies solo transportan tráfico web. Compruébalo con el fragmento de consola: si la dirección srflx es la tuya, la página también puede verla. Activa la protección contra fugas en la extensión de Shifter, o establece disable_non_proxied_udp en Chrome y proxy_only_if_behind_proxy en Firefox, y vuelve a comprobarlo.