# socks5 vs socks5h: qué envían realmente seis clientes al proxy

Source: https://ipvolt.com/es/blog/socks5-vs-socks5h
Markdown: https://ipvolt.com/es/blog/socks5-vs-socks5h.md
Language: es

[Inicio de ipvolt](https://ipvolt.com/es.md) / [Blog](https://ipvolt.com/es/blog.md) / SOCKS5 vs SOCKS5h: diferencias y qué envían 6 clientes (probado)

Comparativa
Publicado: 2026-10-04
Actualizado: 2026-10-04
Por ipvolt
8 min de lectura

socks5:// no significa DNS local en todos los clientes. Registramos qué envían curl, Requests, HTTPX, aiohttp, Playwright y Node a un proxy SOCKS5 con cada esquema.

En curl, `socks5://` resuelve el nombre de host del destino en tu máquina y `socks5h://` le entrega el nombre al proxy. Otros clientes no siguen esa regla: en esta prueba, tres de seis enviaron el nombre de host con un `socks5://` normal, y dos de ellos rechazaron `socks5h://` antes de conectarse.

| Cliente (versión probada) | `socks5://` envía al proxy | `socks5h://` |
| --- | --- | --- |
| curl 8.22.0 | una dirección IPv4 (resuelta en local) | el nombre de host |
| Requests 2.34.2 + PySocks 1.7.1 | una dirección IPv4 (resuelta en local) | el nombre de host |
| HTTPX 0.28.1 + socksio 1.0.0 | el nombre de host | el nombre de host |
| aiohttp 3.14.3 + aiohttp-socks 0.12.0 | el nombre de host | `ValueError`, sin conexión |
| Playwright 1.63.0 (Chromium 153.0.8010.12) | el nombre de host | `net::ERR_NO_SUPPORTED_PROXIES`, sin conexión |
| Node.js 24.20.0 + socks-proxy-agent 10.1.0 | una dirección IPv4 (resuelta en local) | el nombre de host |

Cada celda es lo que recibió un servidor SOCKS5 con registro en `127.0.0.1` cuando se le pidió al cliente `http://dnsprobe.example/`, un nombre que solo existe en el archivo hosts local como `127.0.0.2`. «Una dirección IPv4» significa que el proxy vio `127.0.0.2` y nunca conoció el nombre. «El nombre de host» significa que recibió `dnsprobe.example` y tendría que resolverlo él. Todos los clientes dieron el mismo resultado con un destino `https://`.

## Por qué importa el tipo de dirección

Una petición SOCKS5 lleva una sola dirección de destino, y su byte `ATYP` indica de qué tipo es: `X'01'` para IPv4, `X'03'` para un nombre de dominio, `X'04'` para IPv6. [RFC 1928, sección 4](https://www.rfc-editor.org/rfc/rfc1928#section-4) Un cliente que envía un nombre de dominio deja el DNS en manos del proxy. Un cliente que envía una dirección IP ya hizo la consulta por su cuenta. Eso tiene tres consecuencias:

1. **Tu propio resolvedor ve la consulta.** La consulta DNS del destino va al resolvedor configurado en tu máquina, fuera de la conexión con el proxy. La documentación de Requests lo dice directamente: `socks5` «causes the DNS resolution to happen on the client, rather than on the proxy server». [Requests: SOCKS](https://requests.readthedocs.io/en/latest/user/advanced/#socks)
2. **La respuesta puede ser para otro lugar.** El RFC 7871 señala que muchos servidores de nombres autoritativos «return different responses based on the perceived topological location of the user», y la deducen de la dirección desde la que llega la consulta, que normalmente es tu resolvedor. [RFC 7871, sección 1](https://www.rfc-editor.org/rfc/rfc7871#section-1) Por eso un nombre de CDN resuelto en local puede apuntar a un servidor elegido para tu red, y el proxy se conecta exactamente a esa dirección. La IP de salida está en la región que pediste, pero el servidor al que llegó se eligió para la tuya, así que el contenido puede ser el de otra región. Esto se deduce de cómo se construye la petición; la prueba en loopback no midió ninguna CDN.
3. **Los nombres que solo el proxy puede resolver fallan.** Con un nombre que no se resuelve en local, curl 8.22.0 se detuvo en `curl: (6) Could not resolve host: dnsprobe-missing.example`, Requests lanzó un `ConnectionError` que contenía `[Errno -2] Name or service not known`, y socks-proxy-agent falló con `getaddrinfo ENOTFOUND dnsprobe-missing.example`. Ninguno envió una petición al proxy. Con `socks5h://`, los tres enviaron el nombre al proxy.

La [guía de HTTP frente a SOCKS5](/es/guides/http-vs-socks5-proxies) explica dónde encaja la ubicación del DNS al elegir un protocolo de proxy. El resto de este artículo trata de acertar con el esquema en cada cliente.

## Qué poner en tu configuración

| Cliente | Envía el nombre de host al proxy | Evita |
| --- | --- | --- |
| curl | `socks5h://` o `--socks5-hostname` | `socks5://` y `--socks5` resuelven en local |
| Requests + PySocks | `socks5h://` | `socks5://` resuelve en local |
| HTTPX + socksio | `socks5://` o `socks5h://` | `socks://` lanza `ValueError` |
| aiohttp + aiohttp-socks | `socks5://` | `socks5h://` lanza `ValueError` |
| Playwright Chromium | `socks5://` | `socks5h://` falla al navegar |
| Node socks-proxy-agent | `socks5h://` o `socks://` | `socks5://` resuelve en local |

No hay una única URL correcta para los seis. Si un mismo ajuste `PROXY_URL` alimenta varias herramientas, `socks5h://` rompe aiohttp-socks y Playwright, y `socks5://` hace que curl, Requests y socks-proxy-agent resuelvan en local. Define el esquema por cliente.

Los dos clientes que rechazan `socks5h://` fallan en momentos distintos. aiohttp-socks lanza la excepción desde `ProxyConnector.from_url()`, antes de abrir ningún socket:

```text
ValueError: Invalid scheme component: socks5h
```

Playwright acepta el proxy en `chromium.launch()` y falla en la primera navegación, sin contactar con el proxy:

```text
page.goto: net::ERR_NO_SUPPORTED_PROXIES at http://dnsprobe.example/
```

La documentación de Playwright da `socks5://myproxy.com:3128` como la forma SOCKS de la opción `server`. [Playwright: opción proxy](https://playwright.dev/docs/api/class-browsertype#browser-type-launch-option-proxy) La [guía de proxy en Playwright](/es/guides/playwright-proxy-setup) recoge el resto de ajustes de lanzamiento y de contexto.

El esquema `socks://` a secas es igual de inconsistente. Chromium y socks-proxy-agent lo trataron como SOCKS5 y enviaron el nombre de host. curl abrió con un saludo SOCKS4 (primer byte `0x04`), que un servidor solo SOCKS5 no puede responder. Requests lanzó `ValueError: Unable to determine SOCKS version from socks://127.0.0.1:11080`, HTTPX lanzó `ValueError: Unknown scheme for proxy URL URL('socks://127.0.0.1:11080')` y aiohttp-socks lanzó `ValueError: Invalid scheme component: socks`.

Dos detalles de instalación en Python: Requests necesita el extra `requests[socks]` y HTTPX necesita `httpx[socks]`. Sin ellos Requests lanza `Missing dependencies for SOCKS support` y HTTPX lanza un `ImportError` que nombra socksio; [la solución para ambos](/es/guides/fix-missing-dependencies-for-socks-support) cubre también el caso en que la URL del proxy viene de `ALL_PROXY`. La [guía de proxy con Python Requests](/es/guides/python-requests-proxy) y la [guía de proxy asíncrono con HTTPX](/es/guides/httpx-async-proxy) muestran el código completo del cliente.

En esta prueba la URL del proxy se pasó a cada cliente de forma explícita. Si la tuya viene de `ALL_PROXY` o `HTTPS_PROXY`, confirma primero qué variable lee el cliente; la [guía de variables de entorno de proxy](/es/guides/proxy-environment-variables) lo detalla por cliente, y [NO_PROXY matching, tested](/es/blog/no-proxy-matching-tested) muestra que las reglas de exclusión también difieren entre clientes.

## Cómo comprobar tu propia configuración

No necesitas una cuenta de proxy para ver qué envía tu cliente. Descarga [socks5_log.py](/downloads/socks5-vs-socks5h/socks5_log.py), un script de Python de 42 líneas sin dependencias. Completa el saludo SOCKS5, imprime el tipo de dirección y la dirección de cada petición y después responde «general SOCKS server failure», así que no se reenvía nada.

Dale a tu máquina un nombre de prueba que solo conozca el archivo hosts. No uses `localhost`: Chromium envía las peticiones a nombres de localhost directamente en lugar de pasarlas por el proxy. [Chromium: implicit bypass rules](https://chromium.googlesource.com/chromium/src/+/HEAD/net/docs/proxy.md#Implicit-bypass-rules) Añade esta línea a `/etc/hosts`:

```text
127.0.0.2 dnsprobe.example
```

Arranca el servidor en una terminal y envía una petición por esquema desde otra:

```sh
python3 socks5_log.py 1080
curl -x socks5://127.0.0.1:1080 http://dnsprobe.example/
curl -x socks5h://127.0.0.1:1080 http://dnsprobe.example/
```

Con curl 8.18.0 el servidor imprimió:

```text
LISTENING 127.0.0.1:1080
CMD=1 IPv4 127.0.0.2 port=80
CMD=1 DOMAIN dnsprobe.example port=80
```

La primera petición llegó como dirección IP, así que curl resolvió el nombre en local. La segunda llegó como nombre. Los dos comandos de curl terminan con `curl: (97) cannot complete SOCKS5 connection to dnsprobe.example. (1)`, que es la negativa del servidor y es lo esperado. Sustituye curl por tu propio cliente y tu ajuste de proxy, y lee los mismos dos campos. Si no aparece ninguna línea, el cliente rechazó el esquema o se saltó el proxy.

## Opciones de DNS remoto además del esquema

Algunos clientes ofrecen la misma elección como opción, normalmente llamada `rdns`:

- **curl**: en la prueba, `--socks5-hostname host:port` se comportó como `socks5h://` y `--socks5 host:port` como `socks5://`. [curl man page](https://curl.se/docs/manpage.html#-x)
- **Requests**: no hay una opción aparte. El gestor SOCKS de urllib3 fija el indicador `rdns` de PySocks según el esquema: `False` para `socks5`, `True` para `socks5h`. [Código fuente de urllib3](https://github.com/urllib3/urllib3/blob/2.8.0/src/urllib3/contrib/socks.py) El propio PySocks, usado directamente, acepta `rdns` en `set_proxy()` y documenta `True` como valor por defecto. [PySocks README](https://github.com/Anorov/PySocks)
- **aiohttp-socks**: `ProxyConnector` acepta `rdns`, y su README indica «default is True for socks5». [aiohttp-socks README](https://github.com/romis2012/aiohttp-socks/blob/v0.12.0/README.md) En la prueba, `ProxyConnector.from_url("socks5://127.0.0.1:11080", rdns=False)` envió `127.0.0.2` y `rdns=True` envió el nombre de host.
- **HTTPX**: la versión 0.28.1 dirige `socks5` y `socks5h` al mismo transporte SOCKS, así que el esquema no cambia nada. [Código fuente de HTTPX](https://github.com/encode/httpx/blob/0.28.1/httpx/_transports/default.py)
- **socks-proxy-agent**: solo el esquema fija su indicador `lookup`: `socks5` y `socks4` resuelven en local; `socks5h`, `socks4a` y `socks` no. [Código fuente de socks-proxy-agent](https://github.com/TooTallNate/proxy-agents/blob/main/packages/socks-proxy-agent/src/index.ts)
- **Chromium**: no hay opción. Su documentación dice que para SOCKSv5 «name resolution is always done proxy side». [Documentación de red de Chromium](https://chromium.googlesource.com/chromium/src/+/HEAD/net/docs/proxy.md#SOCKSv5-proxy-scheme)

## Método y límites

Registrado el 4 de octubre de 2026 en Ubuntu 26.04 (x86_64) con Python 3.14.4 y Node.js 24.20.0. Las versiones son las de la primera tabla, más urllib3 2.8.0, httpcore 1.0.9, python-socks 3.1.1 y el paquete `socks` 2.8.10. curl 8.18.0 se ejecutó junto a 8.22.0 y envió las mismas direcciones. Un nombre que solo se resuelve a IPv6 llegó como dirección `IPv6` desde curl, Requests y socks-proxy-agent, y como nombre de host desde los otros tres.

El laboratorio es un único servidor en loopback que rechaza todas las peticiones. No dice nada sobre ningún servicio de proxy, sobre SOCKS5 con autenticación o UDP, ni sobre macOS, Windows, Firefox o WebKit. Los valores por defecto de las bibliotecas cambian, así que comprueba las versiones que uses. El [archivo del laboratorio](/downloads/socks5-vs-socks5h/socks5-vs-socks5h-lab.zip) contiene el servidor, los seis scripts de cliente, el ejecutor y un [README](/downloads/socks5-vs-socks5h/README.md); la salida en bruto de los 62 casos está en [results.json](/downloads/socks5-vs-socks5h/results.json).

## Relacionado

- [HTTP frente a SOCKS5](/es/guides/http-vs-socks5-proxies), para elegir el protocolo y decidir dónde se ejecuta el DNS.
- [Variables de entorno de proxy](/es/guides/proxy-environment-variables), para saber qué variable lee cada cliente.
- [NO_PROXY matching, tested](/es/blog/no-proxy-matching-tested), el mismo tipo de prueba para las reglas de exclusión.
- [Proxy en Playwright](/es/guides/playwright-proxy-setup), [proxy asíncrono con HTTPX](/es/guides/httpx-async-proxy) y [proxy con Python Requests](/es/guides/python-requests-proxy), para la configuración completa de cada cliente.

ipvolt está construyendo infraestructura de proxies para desarrolladores y agentes. [Únete a la lista de espera](https://ipvolt.com/#waitlist-hero) para recibir un correo cuando se abra el acceso.

## Fuentes

- [curl man page: --proxy (socks5:// and socks5h://)](https://curl.se/docs/manpage.html#-x)
- [RFC 1928: SOCKS Protocol Version 5, section 4 (address types)](https://www.rfc-editor.org/rfc/rfc1928#section-4)
- [Requests: SOCKS proxies](https://requests.readthedocs.io/en/latest/user/advanced/#socks)
- [urllib3 2.8.0 source: contrib/socks.py (scheme to rdns)](https://github.com/urllib3/urllib3/blob/2.8.0/src/urllib3/contrib/socks.py)
- [PySocks README: set_proxy and rdns](https://github.com/Anorov/PySocks)
- [HTTPX: SOCKS proxies](https://www.python-httpx.org/advanced/proxies/#socks)
- [HTTPX 0.28.1 source: proxy schemes in _transports/default.py](https://github.com/encode/httpx/blob/0.28.1/httpx/_transports/default.py)
- [aiohttp-socks 0.12.0 README: ProxyConnector and rdns](https://github.com/romis2012/aiohttp-socks/blob/v0.12.0/README.md)
- [python-socks 3.1.1 source: parse_proxy_url schemes](https://github.com/romis2012/python-socks/blob/v3.1.1/python_socks/_helpers.py)
- [socks-proxy-agent source: parseSocksURL](https://github.com/TooTallNate/proxy-agents/blob/main/packages/socks-proxy-agent/src/index.ts)
- [Chromium network docs: SOCKSv5 proxy scheme and implicit bypass rules](https://chromium.googlesource.com/chromium/src/+/HEAD/net/docs/proxy.md#SOCKSv5-proxy-scheme)
- [Playwright: browserType.launch proxy option](https://playwright.dev/docs/api/class-browsertype#browser-type-launch-option-proxy)
- [RFC 7871: Client Subnet in DNS Queries, section 1](https://www.rfc-editor.org/rfc/rfc7871#section-1)

## Entérate cuando se abra el acceso a ipvolt.

Ya que estás aquí

ipvolt está en desarrollo. Deja tu correo y te avisaremos una sola vez cuando se abra el acceso.

Un correo cuando se abra el acceso. Nada más.

[Solicitar acceso anticipado](https://ipvolt.com/es/blog/socks5-vs-socks5h#waitlist-blog-end)

[Privacidad](https://ipvolt.com/privacy)


## Artículos relacionados

- [Parsear precios japoneses: yenes, ancho completo y etiquetas fiscales](https://ipvolt.com/es/blog/japanese-price-parsing.md) (Análisis, 6 oct 2026, 7 min de lectura): Parsea precios japoneses sin perder la divisa ni la base fiscal, con un fixture de Python probado: yen de ancho completo, precios mixtos y casos de revisión deliberados.
- [CONNECT tunnel failed, response 403: por qué afecta a agentes de IA](https://ipvolt.com/es/blog/connect-tunnel-failed-403.md) (Análisis, 2 oct 2026, 8 min de lectura): El curl de tu agente falla con CONNECT tunnel failed, response 403 mientras otros hosts funcionan. El proxy rechazó el túnel. Cómo saber quién lo bloqueó y qué arreglar.
- [API de cuotas de apuestas o scraping: hoja de costes](https://ipvolt.com/es/blog/betting-odds-api-vs-scraping.md) (Comparativa, 28 sept 2026, 9 min de lectura): Compara las API de cuotas y el scraping autorizado por cobertura, frescura y coste de recogida modelado con una hoja editable y supuestos de carga explícitos.

## Guías relacionadas

- [Proxies HTTP vs SOCKS5: elige según la conexión](https://ipvolt.com/es/guides/http-vs-socks5-proxies.md): Compara HTTP CONNECT y SOCKS5, entiende dónde se resuelve el DNS y los límites de TLS, y elige un protocolo que tu cliente y tu proveedor realmente soporten.
- [Variables de entorno de proxy: HTTP_PROXY y NO_PROXY](https://ipvolt.com/es/guides/proxy-environment-variables.md): Diagnostica las diferencias de enrutamiento de HTTP_PROXY, HTTPS_PROXY, ALL_PROXY y NO_PROXY en curl, Python Requests y Node.js con una comprobación local aislada.
- [Configurar un proxy en Playwright](https://ipvolt.com/es/guides/playwright-proxy-setup.md): Configura un proxy HTTP autenticado en un contexto de navegador de Playwright, aísla el estado de la prueba y diagnostica la navegación por separado de los subrecursos.

## Sobre ipvolt

Análisis técnico del equipo de ipvolt.

El acceso a ipvolt aún no está abierto.

[Leer el original en inglés](https://ipvolt.com/blog/socks5-vs-socks5h.md)
