SOCKS es un protocolo de Internet que intercambia paquetes de red entre un cliente y un servidor a través de un servidor proxy . SOCKS5 proporciona autenticación opcionalmente , de modo que solo los usuarios autorizados pueden acceder a un servidor. En la práctica, un servidor SOCKS actúa como proxy para las conexiones TCP a una dirección IP arbitraria y proporciona un medio para que se reenvíen los paquetes UDP. El protocolo SOCKS opera entre la capa de aplicación y la capa de transporte . [ 1 ] Un servidor SOCKS acepta conexiones de clientes entrantes en el puerto TCP 1080. [ 1 ] [ 2 ]
Historia
El protocolo fue diseñado y desarrollado originalmente por David Koblas, administrador de sistemas de MIPS Computer Systems . Después de que MIPS fuera adquirida por Silicon Graphics en 1992, Koblas presentó un artículo sobre SOCKS en el Simposio de Seguridad Usenix de ese año, [ 3 ] haciendo que SOCKS estuviera disponible públicamente. [ 4 ] El protocolo fue extendido a la versión 4 por Ying-Da Lee de NEC .
La arquitectura de referencia y el cliente SOCKS son propiedad de Permeo Technologies , [ 5 ] una empresa derivada de NEC . ( Blue Coat Systems compró Permeo Technologies y a su vez fue adquirida por Symantec ).
El protocolo SOCKS5 fue originalmente un protocolo de seguridad que facilitaba la administración de cortafuegos y otros productos de seguridad. Fue aprobado por la IETF en 1996. [ 1 ] El protocolo se desarrolló en colaboración con Aventail Corporation , que comercializa la tecnología fuera de Asia. [ 6 ]
Acrónimo
SOCKS se define a veces como un acrónimo de "socket secure" desde al menos 2001, [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] aunque no se definió originalmente como tal en el RFC de la versión 5 del protocolo SOCKS en 1996 [ 1 ] o en el documento del Simposio de Seguridad UNIX III en 1992 [ 3 ] sino que simplemente se refería a un protocolo proxy específico diseñado para facilitar la comunicación entre clientes y servidores a través de un cortafuegos.
Uso
SOCKS es un estándar de facto para pasarelas de nivel de circuito (pasarelas de nivel 5). [ 12 ]
La naturaleza de nivel de circuito/sesión de SOCKS lo convierte en una herramienta versátil para reenviar cualquier tráfico TCP (o UDP desde SOCKS5), creando una interfaz para todo tipo de herramientas de enrutamiento. Se puede utilizar como:
- Una herramienta de elusión que permite que el tráfico evite el filtrado de Internet para acceder a contenido que de otro modo estaría bloqueado, por ejemplo, por gobiernos, lugares de trabajo, escuelas y servicios web específicos de cada país. [ 13 ] Dado que SOCKS es muy detectable, un enfoque común es presentar una interfaz SOCKS para protocolos más sofisticados:
- Proporciona una funcionalidad similar a la de una red privada virtual , permitiendo que las conexiones se reenvíen a la red "local" de un servidor:
Protocolo
CALCETINES4
Una solicitud de conexión SOCKS4 típica tiene este aspecto:
- VER : 8 bits
- Número de versión de SOCKS, 0x04 para esta versión.
- CMD : 8 bits
- Código de comando:
- 0x01: Establecer una conexión de flujo TCP/IP .
- 0x02: Establece una vinculación de puerto TCP/IP.
- DSTPORT : 16 bits
- Número de puerto de destino, en orden de bytes de red .
- DESTIP : 32 bits
- Dirección IPv4 de destino , en orden de bytes de red.
- ID : variable
- La cadena de ID de usuario, terminada en nulo .
El servidor responde con:
- VN : 8 bits
- Versión de respuesta (un byte nulo).
- REP : 8 bits
- Código de respuesta:
- 0x5a: Solicitud concedida.
- 0x5b: Solicitud rechazada o fallida.
- 0x5c: La solicitud falló porque el cliente no está ejecutando identd (o no es accesible desde el servidor).
- 0x5d: La solicitud falló porque el identd del cliente no pudo confirmar el ID de usuario en la solicitud.
- DSTPORT : 16 bits
- El número de puerto de destino, que tiene sentido si se proporciona en BIND, debe ignorarse en caso contrario.
- DESTIP : 32 bits
- Dirección IPv4 de destino . Junto con DSTPORT, la dirección IP:puerto a la que debe vincularse el cliente.
Por ejemplo, esta es una solicitud SOCKS4 para conectar a Fred a 66.102.7.99:80 , el servidor responde con un "OK":
- Cliente:
0x04 | 0x01 | 0x00 0x50 | 0x42 0x66 0x07 0x63 | 0x46 0x72 0x65 0x64 0x00- El último campo es "Fred" en ASCII , seguido de un byte nulo.
- Servidor:
0x00 | 0x5A | 0xXX 0xXX | 0xXX 0xXX 0xXX 0xXX- 0xXX puede ser cualquier valor de byte. El protocolo SOCKS4 especifica que los valores de estos bytes deben ignorarse.
A partir de este momento, cualquier dato enviado desde el cliente SOCKS al servidor SOCKS se reenvía a 66.102.7.99 , y viceversa.
El campo de comando puede ser 0x01 para "connect" o 0x02 para "bind"; el comando "bind" permite conexiones entrantes para protocolos como FTP activo .
CALCETINES4a
SOCKS4a extiende el protocolo SOCKS4 para permitir que un cliente especifique un nombre de dominio de destino en lugar de una dirección IP; esto es útil cuando el propio cliente no puede resolver el nombre de dominio del host de destino a una dirección IP. Fue propuesto por Ying-Da Lee, autor de SOCKS4. [ 16 ]
El cliente debe establecer los tres primeros bytes de DSTIP en NULL y el último byte en un valor distinto de cero. (Esto corresponde a la dirección IP 0.0.0.x, donde x es distinto de cero, una dirección de destino inadmisible que, por lo tanto, nunca debería aparecer si el cliente puede resolver el nombre de dominio). Tras el byte NULL que finaliza USERID, el cliente debe enviar el nombre de dominio de destino y finalizarlo con otro byte NULL. Esto se utiliza tanto para las solicitudes de "conexión" como de "enlace".
Cliente al servidor SOCKS:
- CALCETINES4_C
- Paquete de protocolo de enlace del cliente SOCKS4 (arriba)
- DOMINIO
- el nombre de dominio del host al que contactar, nulo (0x00) terminado
Servidor a cliente SOCKS: (Igual que SOCKS4)
Un servidor que utiliza el protocolo SOCKS4a debe verificar la dirección DSTIP en el paquete de solicitud . Si representa la dirección 0.0.0.x con x distinto de cero, el servidor debe leer el nombre de dominio que el cliente envía en el paquete. El servidor debe resolver el nombre de dominio y establecer la conexión con el host de destino si es posible.
CALCETINES5
El protocolo SOCKS5 se define en el RFC 1928. Es una extensión incompatible del protocolo SOCKS4; ofrece más opciones de autenticación y añade compatibilidad con IPv6 y UDP , este último utilizable para consultas DNS . El protocolo de enlace inicial consta de lo siguiente:
- El cliente se conecta y envía un saludo que incluye una lista de los métodos de autenticación compatibles.
- El servidor elige uno de los métodos (o envía una respuesta de error si ninguno de ellos es aceptable).
- En función del método de autenticación elegido, ahora pueden intercambiarse varios mensajes entre el cliente y el servidor.
- El cliente envía una solicitud de conexión similar a SOCKS4.
- El servidor responde de forma similar a SOCKS4.
El saludo inicial del cliente es:
- VER
- Versión SOCKS (0x05)
- NAUTH
- Número de métodos de autenticación admitidos, uint8
- AUTORIZACIÓN
- Métodos de autenticación, se admite 1 byte por método.
- Los métodos de autenticación admitidos se numeran de la siguiente manera:
- 0x00: Sin autenticación
- 0x01: GSSAPI ( RFC 1961 )
- 0x02: Nombre de usuario/contraseña ( RFC 1929 )
- 0x03–0x7F: métodos asignados por IANA [ 17 ]
- 0x03: Protocolo de autenticación de desafío-respuesta
- 0x04: Sin asignar
- 0x05: Método de autenticación de desafío-respuesta
- 0x06: Capa de sockets seguros
- 0x07: Autenticación NDS
- 0x08: Marco de autenticación múltiple
- 0x09: Bloque de parámetros JSON
- 0x0A–0x7F: Sin asignar
- 0x80–0xFE: métodos reservados para uso privado
- VER
- Versión SOCKS (0x05)
- CAUTH
- método de autenticación elegido, o 0xFF si no se ofrecieron métodos aceptables.
La autenticación posterior depende del método. La autenticación de nombre de usuario y contraseña (método 0x02) se describe en RFC 1929 :
- VER
- 0x01 para la versión actual de autenticación de nombre de usuario/contraseña
- IDLEN, ID
- Longitud del nombre de usuario, uint8; nombre de usuario como cadena de bytes
- PWLEN, PW
- Longitud de la contraseña, uint8; contraseña como cadena de bytes
- VER
- 0x01 para la versión actual de autenticación de nombre de usuario/contraseña
- ESTADO
- 0x00 éxito, de lo contrario fallo, la conexión debe cerrarse.
Tras la autenticación, la conexión puede continuar. Primero definimos un tipo de datos de dirección como:
- TIPO
- tipo de dirección. Una de las siguientes:
- 0x01: Dirección IPv4
- 0x03: Nombre de dominio
- 0x04: Dirección IPv6
- ADDR
- Los datos de la dirección que se muestran a continuación. Según el tipo:
- 4 bytes para la dirección IPv4
- 1 byte de longitud del nombre seguido de 1–255 bytes para el nombre de dominio.
- 16 bytes para la dirección IPv6
- VER
- Versión SOCKS (0x05)
- CMD
- código de comando:
- 0x01: establecer una conexión de flujo TCP/IP
- 0x02: establecer una vinculación de puerto TCP/IP
- 0x03: asociar un puerto UDP
- VSR
- Reservado, debe ser 0x00
- DSTADDR
- Dirección de destino, consulte la estructura de direcciones anterior.
- DSTPORT
- Número de puerto en orden de bytes de red
- VER
- Versión SOCKS (0x05)
- ESTADO
- código de estado:
- 0x00: solicitud concedida
- 0x01: fallo general
- 0x02: conexión no permitida por el conjunto de reglas
- 0x03: red inaccesible
- 0x04: host inaccesible
- 0x05: conexión rechazada por el host de destino
- 0x06: TTL expirado
- 0x07: comando no compatible / error de protocolo
- 0x08: tipo de dirección no compatible
- VSR
- Reservado, debe ser 0x00
- BNDADDR
- Dirección vinculada al servidor en el formato de "dirección SOCKS5" especificado anteriormente
- Puerto de enlace
- Número de puerto vinculado al servidor en orden de bytes de red
Dado que los clientes pueden usar direcciones resueltas o nombres de dominio, existe una convención en cURL para etiquetar la variante de nombre de dominio de SOCKS5 como "socks5h" y la otra simplemente como "socks5". Existe una convención similar entre SOCKS4a y SOCKS4. [ 18 ]
Software
Servidores
Implementaciones de servidores proxy SOCKS
- Sun Java System Web Proxy Server es un servidor proxy de almacenamiento en caché que se ejecuta en servidores Solaris, Linux y Windows y que admite HTTPS, filtros de E/S NSAPI, reconfiguración dinámica, SOCKSv5 y proxy inverso .
- WinGate es un servidor proxy multiprotocolo y servidor SOCKS para Microsoft Windows que admite SOCKS4, SOCKS4a y SOCKS5 (incluida la autenticación UDP-ASSOCIATE y GSSAPI). También permite transferir conexiones SOCKS al proxy HTTP, por lo que puede almacenar en caché y analizar el tráfico HTTP a través de SOCKS.
- SocksGate5 es un firewall SOCKS de aplicación con función de inspección en la capa 7 del modelo OSI, la capa de aplicación. Dado que los paquetes se inspeccionan en la capa 7 del modelo OSI, el firewall SOCKS de aplicación puede detectar incumplimientos de protocolo y bloquear contenido específico.
- Dante es un servidor SOCKS a nivel de circuito que puede utilizarse para proporcionar conectividad de red conveniente y segura, requiriendo únicamente que el host en el que se ejecuta Dante tenga conectividad de red externa. [ 19 ]
- HevSocks5Server es un servidor SOCKS de alto rendimiento y bajo consumo de recursos para Unix (Linux/BSD/macOS). Admite los métodos estándar TCP-CONNECT y UDP-ASSOCIATE, así como la autenticación con múltiples nombres de usuario y contraseñas.
- uSOCKS5 es un servidor SOCKS5 mínimo escrito en Python que admite TCP-CONNECT estándar, útil para la lectura educativa.
Otros programas que proporcionan una interfaz de servidor SOCKS
- OpenSSH permite la creación dinámica de túneles, especificados mediante un subconjunto del protocolo SOCKS, que admite el comando CONNECT.
- PuTTY es un cliente SSH para Win32 que admite la creación local de túneles SOCKS (dinámicos) a través de servidores SSH remotos.
- Secure ShellFish es un cliente SSH para iOS y macOS que incluye un servidor SOCKS.
- ShimmerCat [ 20 ] es un servidor web que utiliza SOCKS5 para simular una red interna, lo que permite a los desarrolladores web probar sus sitios locales sin modificar su archivo /etc/hosts .
- Tor es un sistema diseñado para permitir el anonimato en línea. Tor ofrece a sus clientes una interfaz de servidor SOCKS que solo utiliza el protocolo TCP.
- Shadowsocks es una herramienta para eludir la censura. Proporciona una interfaz SOCKS5.
- Implementaciones de netcat , como Ncat y socat.
Clientela
El software cliente debe tener soporte nativo para SOCKS para poder conectarse a través de SOCKS.
Navegador
- Chrome: admite SOCKS4 y SOCKS4a. [ 21 ] [ 22 ]
- Firefox: compatible con SOCKS4, SOCKS4a y SOCKS5.
- Internet Explorer y Microsoft Edge basado en EdgeHTML: solo admiten SOCKS4.
- Microsoft Edge basado en Chromium: compatible con SOCKS4 y SOCKS4a.
Existen programas que permiten a los usuarios sortear dichas limitaciones:
Calcetines
Los Socksifiers permiten que las aplicaciones accedan a las redes mediante un proxy sin necesidad de admitir ningún protocolo de proxy. La forma más común es configurar un adaptador de red virtual y las tablas de enrutamiento adecuadas para enviar el tráfico a través de dicho adaptador.
- Proxifier , un programa propietario de pago para Windows y macOS que puede forzar a los programas a usar un proxy SOCKS, HTTPS o HTTP mediante la Plataforma de filtrado de Windows (en Windows) [ 23 ] o el Marco de extensión de red (en macOS). [ 24 ]
- tun2socks, una herramienta de código abierto que crea adaptadores TUN TCP virtuales a partir de un proxy SOCKS, con capacidad UDP si el otro extremo lo admite. Funciona en Linux y Windows, [ 25 ] tiene una versión para macOS y una reimplementación en Golang . [ 26 ] Otra implementación, escrita en C con buen rendimiento, funciona en Linux/Android/BSD/macOS e iOS. [ 27 ]
- proxychains, un programa de Unix que fuerza el tráfico TCP a través de proxies SOCKS o HTTP en los programas (vinculados dinámicamente) que ejecuta. Funciona en varios sistemas tipo Unix . [ 28 ]
Traducción de proxies
- Polipo , un servidor proxy HTTP/1.1 descontinuado para reenvío y almacenamiento en caché con soporte para IPv4 . De código abierto y compatible con Linux , OpenWrt , Windows , Mac OS X y FreeBSD . Casi cualquier navegador web puede usarlo.
- Privoxy , un proxy SOCKS a HTTP sin almacenamiento en caché.
- Tinyproxy es un demonio proxy HTTP/HTTPS ligero para sistemas operativos POSIX. Diseñado desde cero para ser rápido y compacto, ofrece una interfaz de proxy HTTP y puede conectarse a proxies ascendentes SOCKS4/5 y HTTP.
Seguridad
La falta de cifrado en el intercambio de solicitudes y paquetes hace que SOCKS sea prácticamente vulnerable a ataques de intermediario y a la interceptación de direcciones IP, lo que, en consecuencia, abre la puerta a la censura por parte de los gobiernos.
Rendimiento y limitaciones
Los proxies SOCKS, en particular SOCKS5, generalmente ofrecen un rendimiento mejorado y una compatibilidad de protocolo más amplia en comparación con SOCKS4, lo que los hace adecuados para casos de uso que implican alta concurrencia y tráfico UDP. A diferencia de los proxies HTTP, SOCKS5 opera en la capa de sesión y no inspecciona ni filtra datos, lo que reduce la sobrecarga y puede resultar en una menor latencia, beneficiosa para aplicaciones sensibles a la latencia como los juegos o la transmisión de contenido. Las pruebas de rendimiento de varias implementaciones de SOCKS5 muestran que puede manejar miles de conexiones simultáneas con tiempos de respuesta a menudo en milisegundos, lo que demuestra un alto potencial de rendimiento bajo carga. [ 29 ]
Sin embargo, SOCKS carece de cifrado integrado, lo que deja el tráfico vulnerable a la interceptación y lo hace menos seguro que las redes privadas virtuales (VPN) o los proxies HTTPS que proporcionan encapsulación e integridad de datos. Además, el uso de un proxy SOCKS añade un salto de red adicional, lo que puede aumentar la latencia y afectar a escenarios donde el rendimiento es crucial. Si bien SOCKS5 admite UDP mediante el UDP ASSOCIATEcomando, el uso de un proxy UDP complica la superación del firewall y puede resultar poco fiable en algunos entornos de red. [ 30 ]
Estas características determinan las capacidades y limitaciones prácticas de rendimiento de SOCKS, definiendo su uso apropiado en muchos escenarios de proxy, pero limitando su idoneidad cuando se requiere cifrado o una latencia mínima.
Véase también
Referencias
- 1 2 3 4 M. Leech; M. Ganis; Y. Lee; R. Kuris; D. Koblas; L. Jones (marzo de 1996). Protocolo SOCKS Versión 5. Grupo de Trabajo de Redes. doi : 10.17487/RFC1928 . RFC 1928 .Norma propuesta.
- ↑ "Registro de nombres de servicio y números de puerto de protocolo de transporte" . Autoridad de Números Asignados de Internet . 19 de mayo de 2017. Consultado el 23 de mayo de 2017 .
- 1 2 Koblas, David; Koblas, Michelle R. SOCKS (PDF) . Simposio de seguridad UNIX de USENIX III . Recuperado el 16 de noviembre de 2019 .
- ↑ Darmohray, Tina (febrero de 2005). "Cortafuegos y cuentos de hadas" (PDF) . ;login: . Vol. 30, n.º 1. Berkeley, California : USENIX Association. pág. 21. ISSN 1044-6397 . Archivado (PDF) del original el 16 de agosto de 2025. Recuperado el 3 de marzo de 2025 .
- ↑ Índice del archivo en la Wayback Machine
- ↑ CNET: El ciberespacio desde el espacio exterior .
- ↑ EE. UU. US8984268B2
- ↑ EE. UU. US20210058367A1
- ↑ EE. UU. US11190374B2
- ↑ JP JP6761452B2
- ↑ EE. UU. US11425565B2
- ↑ Oppliger, Rolf (2003). «Puertas de enlace a nivel de circuito». Tecnologías de seguridad para la World Wide Web (2.ª ed.). Artech House. ISBN 1580533485Consultado el 21 de enero de 2020 .
- ↑ "Informe de uso de herramientas de elusión de 2010" (PDF) . Centro Berkman para Internet y la Sociedad de la Universidad de Harvard. Octubre de 2010.
- ↑ "Preguntas frecuentes sobre Tor" .
- ↑ "Preguntas frecuentes sobre OpenSSH" . Archivado del original el 1 de febrero de 2002.
- ↑ Ying-Da Lee. "SOCKS 4A: Una extensión simple del protocolo SOCKS 4" . OpenSSH . Consultado el 3 de abril de 2013 .
- ↑ IANA.org
- ↑ "CURLOPT_PROXY" . curl.se . Consultado el 20 de enero de 2020 .
- ↑ "Productos desarrollados por Inferno Nettverk A/S" . www.inet.no. Consultado el 20 de marzo de 2021 .
- ↑ "Red fácil con SOCKS5" . shimmercat.com . ShimmerCat. Archivado del original el 13 de septiembre de 2018. Consultado el 20 de abril de 2016 .
- ↑ "Configuración de un servidor proxy SOCKS en Chrome" . www.chromium.org . Consultado el 19 de marzo de 2024 .
- ↑ "Chromium" . issues.chromium.org . Consultado el 3 de octubre de 2025 .
- ↑ "Proxifier para Windows v4" . www.proxifier.com . Consultado el 8 de agosto de 2025 .
- ↑ "Proxifier para Mac v3" . www.proxifier.com . Consultado el 8 de agosto de 2025 .
- ↑ Bizjak, Ambroz (20 de enero de 2020). "ambrop72/badvpn: lenguaje de scripting NCD, proxy tun2socks, VPN P2P" . GitHub . Recuperado el 20 de enero de 2020 .
- ↑ "xjasonlyu/tun2socks: tun2socks – impulsado por la pila TCP/IP gVisor" . GitHub .
- ↑ "heiher/hev-socks5-tunnel: Un tun2socks de alto rendimiento" . GitHub .
- ↑ Hamsik, Adam (20 de enero de 2020). "proxychains: una herramienta que obliga a que cualquier conexión TCP realizada por una aplicación determinada pase por un proxy como TOR o cualquier otro proxy SOCKS4, SOCKS5 o HTTP(S)" . GitHub . Consultado el 20 de enero de 2020 .
- ↑ Nonik, Oleksandr (2024). Enfoques para resolver problemas de rendimiento de proxy para los protocolos HTTP y SOCKS5 (PDF) . Actas del taller CEUR.
- ↑ "Investigación de mercado por delegación 2025" . Proxyway . 5 de mayo de 2025.
Enlaces externos
- RFC 1929 : Autenticación de nombre de usuario/contraseña para SOCKS V5
- RFC 1961 : Método de autenticación GSS-API para SOCKS versión 5
- RFC 3089 : Un mecanismo de puerta de enlace IPv6/IPv4 basado en SOCKS
- Draft-ietf-aft-socks-chap , Protocolo de autenticación de desafío-respuesta para SOCKS V5
- SOCKS: Un protocolo para proxy TCP a través de cortafuegos , Protocolo SOCKS Versión 4 ( NEC )
- Protocolos de Internet
- software de privacidad en Internet
- Protocolos de tunelización
- protocolos de la capa de sesión