SOCKS4a Proxy
¿Qué es SOCKS4a?
SOCKS4a es una extensión del protocolo SOCKS4, propuesta por Ying-Da Lee. La diferencia clave con el SOCKS4 original es que el cliente puede enviar un nombre de dominio en lugar de una dirección IP, y la resolución DNS ocurre en el lado del servidor proxy.
En SOCKS4 estándar, el cliente debe resolver el nombre de dominio a una dirección IP por sí mismo antes de enviar la solicitud. Esto crea un problema: la consulta DNS va directamente desde el cliente, revelando información sobre los sitios web visitados. SOCKS4a resuelve este problema.
El Problema DNS de SOCKS4
Cómo Funciona SOCKS4
- El cliente quiere conectarse a example.com
- El cliente realiza una consulta DNS directamente (no a través del proxy)
- Recibe la IP 93.184.216.34
- Envía un comando al proxy: "conectar a 93.184.216.34:80"
- El proxy establece una conexión TCP
Problema: La consulta DNS en el paso 2 es visible para el ISP, el servidor DNS y cualquiera que monitoree el tráfico. Esto es una fuga de DNS.
Cómo Funciona SOCKS4a
- El cliente quiere conectarse a example.com
- El cliente envía un comando al proxy: "conectar a example.com:80"
- El propio proxy resuelve example.com a una IP
- El proxy establece una conexión TCP
La consulta DNS está completamente oculta detrás del proxy.
Implementación Técnica
Formato de Solicitud SOCKS4
| Campo | Tamaño | Descripción |
|---|---|---|
| VER | 1 byte | Versión (0x04) |
| CMD | 1 byte | Comando (0x01 = CONNECT) |
| DSTPORT | 2 bytes | Puerto de Destino |
| DSTIP | 4 bytes | IP de Destino |
| USERID | variable | Cadena de Identificador |
| NULL | 1 byte | 0x00 (terminación) |
Formato de Solicitud SOCKS4a
El formato es el mismo, pero con un truco: el campo DSTIP contiene una IP inválida de la forma 0.0.0.x (donde x > 0). Después del terminador NULL de USERID, se añade el nombre de dominio:
| Campo | Tamaño | Descripción |
|---|---|---|
| VER | 1 byte | 0x04 |
| CMD | 1 byte | 0x01 |
| DSTPORT | 2 bytes | Puerto de Destino |
| DSTIP | 4 bytes | 0.0.0.1 (marcador SOCKS4a) |
| USERID | variable | Cadena de Identificador |
| NULL | 1 byte | 0x00 |
| DOMAIN | variable | Nombre de Dominio (example.com) |
| NULL | 1 byte | 0x00 |
El proxy ve una IP de la forma 0.0.0.x y entiende que un nombre de dominio para resolución sigue después del USERID.
SOCKS4 vs SOCKS4a vs SOCKS5
| Parámetro | SOCKS4 | SOCKS4a | SOCKS5 |
|---|---|---|---|
| DNS en el lado del proxy | No | Sí | Sí |
| Autenticación | No | No | Sí |
| UDP | No | No | Sí |
| IPv6 | No | No | Sí |
| Comando BIND | Sí | Sí | Sí |
| Comando ASSOCIATE | No | No | Sí |
Ventajas de SOCKS4a
1. Elimina la Fuga de DNS
La principal ventaja es que el cliente no realiza consultas DNS directamente. Toda la actividad DNS está oculta detrás del proxy.
2. Simplicidad del Protocolo
SOCKS4a es más simple de implementar que SOCKS5. No hay fase de autenticación, ni soporte UDP, solo TCP CONNECT.
3. Compatibilidad con Versiones Anteriores
Un cliente SOCKS4a puede funcionar con un proxy SOCKS4a, y el formato de solicitud es compatible con versiones anteriores de SOCKS4.
4. Acceso a Dominios .onion e Internos
Dado que el DNS se resuelve en el lado del proxy, SOCKS4a puede usarse para acceder a dominios que no son resueltos por DNS públicos (por ejemplo, .onion a través de Tor).
Limitaciones
1. Sin Autenticación
SOCKS4a no admite autenticación. Cualquiera que conozca la dirección del proxy puede usarlo.
2. Sin UDP
Solo se admiten conexiones TCP. Las consultas DNS, VoIP y el tráfico de juegos a través de UDP no son compatibles.
3. Sin IPv6
El campo DSTIP es de 4 bytes, solo para IPv4.
4. Protocolo Obsoleto
SOCKS5 reemplazó a SOCKS4a, proporcionando todas sus capacidades más autenticación, UDP e IPv6.
Cuándo Usar SOCKS4a
- Sistemas heredados — software antiguo que no admite SOCKS5
- Escenarios simples — cuando no se necesita autenticación ni UDP
- Conexiones Tor — Tor admite SOCKS4a para la resolución de .onion
- Sobrecarga mínima — cuando la latencia mínima del protocolo es importante
Soporte de Software
| Programa | SOCKS4a |
|---|---|
| curl | Sí (--socks4a) |
| Tor | Sí (protocolo primario) |
| ProxyChains | Sí |
| Firefox | Vía network.proxy.socks_remote_dns |
| PuTTY | Sí |
Conclusión
SOCKS4a fue un paso evolutivo importante desde SOCKS4, resolviendo el problema de las fugas de DNS. Aunque SOCKS5 es el estándar hoy en día, comprender SOCKS4a es útil para trabajar con sistemas heredados y para comprender la evolución de los protocolos proxy.