Protocolo de Internet que utiliza un servidor proxy
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 opcional para que solo los usuarios autorizados puedan acceder a un servidor. En la práctica, un servidor SOCKS envía por proxy las conexiones TCP a una dirección IP arbitraria y proporciona un medio para que se reenvíen los paquetes UDP. Un servidor SOCKS acepta conexiones entrantes de clientes en el puerto TCP 1080, como se define en RFC 1928. [1]
Historia
El protocolo fue desarrollado y diseñado originalmente por David Koblas, un administrador de sistemas de MIPS Computer Systems . Después de que Silicon Graphics adquiriera MIPS en 1992, Koblas presentó un artículo sobre SOCKS en el Simposio de Seguridad Usenix de ese año [2] , lo que hizo que SOCKS estuviera disponible para el público. [3] El protocolo fue ampliado a la versión 4 por Ying-Da Lee de NEC .
La arquitectura de referencia SOCKS y el cliente son propiedad de Permeo Technologies , [4] una escisión 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 los cortafuegos y otros productos de seguridad. Fue aprobado por la IETF en 1996 como RFC 1928 (autores: M. Leech, M. Ganis, Y. Lee, R. Kuris, D. Koblas y L. Jones). El protocolo fue desarrollado en colaboración con Aventail Corporation , que comercializa la tecnología fuera de Asia. [5]
Acrónimo
SOCKS se define a veces como un acrónimo de "socket seguro" desde al menos 2001, [6] [7] [8] [9] [10] aunque no se definió originalmente como tal en el RFC del Protocolo SOCKS Versión 5 en 1996 [11] o en el documento del UNIX Security Symposium III en 1992 [2] 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 firewall.
Uso
SOCKS es un estándar de facto para pasarelas a 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:
- El software proxy de cebolla Tor presenta una interfaz SOCKS a sus clientes. [14]
- Proporciona una funcionalidad similar a una red privada virtual , permitiendo que las conexiones se reenvíen a la red "local" de un servidor:
- Algunas suites SSH, como OpenSSH , admiten el reenvío de puertos dinámico que permite al usuario crear un proxy SOCKS local. [15] Esto puede liberar al usuario de las limitaciones de conectarse solo a un puerto y servidor remoto predefinidos.
Protocolo
CALCETINES4
Una solicitud de conexión SOCKS4 típica se ve así:
- VER
- Número de versión de SOCKS, 0x04 para esta versión
- Cmd
- Código de comando:
- 0x01 = establecer una conexión de flujo TCP/IP
- 0x02 = establecer un enlace de puerto TCP/IP
- DSTPORT
- Número de puerto de 2 bytes (en orden de bytes de red )
- DESESTIPAR
- Dirección IPv4 , 4 bytes (en orden de bytes de red)
- IDENTIFICACIÓN
- la cadena de identificación del usuario, longitud variable y terminación nula .
- Espana
- versión de respuesta, byte nulo
- REPS
- Código de respuesta
- DSTPORT
- puerto de destino, significativo si se concede en BIND, de lo contrario ignorar
- DSTIP
- IP de destino, como se indica arriba: la IP:puerto al que el cliente debe vincularse
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 punto, cualquier dato enviado desde el cliente SOCKS al servidor SOCKS se retransmite a 66.102.7.99, y viceversa.
El campo de comando puede ser 0x01 para "conectar" o 0x02 para "vincular"; el comando "vincular" 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 resulta útil cuando el propio cliente no puede resolver el nombre de dominio del host de destino en una dirección IP. Fue propuesto por Ying-Da Lee, el autor de SOCKS4. [16]
El cliente debe configurar los primeros tres bytes de DSTIP como NULL y el último byte como un valor distinto de cero. (Esto corresponde a la dirección IP 0.0.0.x, con x distinto de cero, una dirección de destino inadmisible y, por lo tanto, nunca debería ocurrir si el cliente puede resolver el nombre de dominio). Después del byte NULL que termina USERID, el cliente debe enviar el nombre de dominio de destino y terminarlo con otro byte NULL. Esto se utiliza tanto para 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 para contactar, nulo (0x00) terminado
Del servidor al cliente SOCKS: (igual que SOCKS4)
Un servidor que utilice el protocolo SOCKS4a debe comprobar el 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 puede.
CALCETINES5
El protocolo SOCKS5 se define en RFC 1928. Es una extensión incompatible del protocolo SOCKS4; ofrece más opciones de autenticación y agrega compatibilidad con IPv6 y UDP , este último puede usarse para búsquedas de DNS . El protocolo de enlace inicial consta de lo siguiente:
- El cliente se conecta y envía un saludo, que incluye una lista de 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).
- Ahora pueden pasar varios mensajes entre el cliente y el servidor, dependiendo del método de autenticación elegido.
- El cliente envía una solicitud de conexión similar a SOCKS4.
- El servidor responde de manera similar a SOCKS4.
El saludo inicial del cliente es:
- VER
- Versión SOCKS (0x05)
- NAUTO
- 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 enumeran 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-apretón de manos
- 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 con 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, IDENTIFICACIÓN
- 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 falla, la conexión debe cerrarse
Después de la autenticación, la conexión puede continuar. Primero definimos un tipo de datos de dirección como:
- TIPO
- Tipo de dirección. Uno de:
- 0x01: dirección IPv4
- 0x03: Nombre de dominio
- 0x04: dirección IPv6
- Dirección
- Los datos de dirección que se indican a continuación. Según el tipo:
- 4 bytes para dirección IPv4
- 1 byte de longitud de nombre seguido de 1 a 255 bytes para el nombre de dominio
- 16 bytes para dirección IPv6
- VER
- Versión SOCKS (0x05)
- Cmd
- Código de comando:
- 0x01: establecer una conexión de flujo TCP/IP
- 0x02: establecer un enlace de puerto TCP/IP
- 0x03: asociar un puerto UDP
- virus respiratorio sincitial
- reservado, debe ser 0x00
- Dirección de área de destino
- Dirección de destino, consulte la estructura de dirección más arriba.
- DSTPORT
- Número de puerto en un 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 inalcanzable
- 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
- virus respiratorio sincitial
- reservado, debe ser 0x00
- BNDADDR
- Dirección vinculada al servidor en el formato "dirección SOCKS5" especificado anteriormente
- PUERTO BND
- Número de puerto vinculado al servidor en un orden de bytes de red
Dado que los clientes pueden utilizar direcciones resueltas o nombres de dominio, existe una convención de 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 que admiten HTTPS, filtros de E/S NSAPI, reconfiguración dinámica, SOCKSv5 y proxy inverso .
- WinGate es un servidor proxy multiprotocolo y un servidor SOCKS para Microsoft Windows que admite SOCKS4, SOCKS4a y SOCKS5 (incluida la autenticación UDP-ASSOCIATE y GSSAPI). También admite la transferencia de conexiones SOCKS al proxy HTTP, por lo que puede almacenar en caché y escanear HTTP a través de SOCKS.
- Socksgate5 SocksGate5 es un cortafuegos SOCKS de aplicación con función de inspección en la capa 7 del modelo OSI, la capa de aplicación. Debido a que los paquetes se inspeccionan en el nivel 7 del modelo OSI, el cortafuegos SOCKS de aplicación puede buscar incumplimientos de protocolos y bloquear contenido específico.
- Dante es un servidor SOCKS a nivel de circuito que se puede utilizar para proporcionar una 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 TCP-CONNECT y UDP-ASSOCIATE estándar y la autenticación con múltiples nombres de usuario y contraseñas.
Otros programas que proporcionan interfaz de servidor SOCKS
- OpenSSH permite la creación dinámica de túneles, especificados a través de un subconjunto del protocolo SOCKS, que admite el comando CONNECT.
- PuTTY es un cliente SSH 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 una interfaz de servidor SOCKS solo para TCP a sus clientes.
- Shadowsocks es una herramienta para evitar la censura. Ofrece una interfaz SOCKS5.
- Implementaciones de netcat , como Ncat y socat.
Clientela
El software cliente debe tener soporte nativo de SOCKS para poder conectarse a través de SOCKS.
Navegador
- Chrome: compatible con SOCKS4, SOCKS4a y SOCKS5. [21]
- Firefox: compatible con SOCKS4, SOCKS4a y SOCKS5.
- Internet Explorer y Microsoft Edge basado en HTML: solo admite SOCKS4.
- Microsoft Edge basado en Chromium: compatible con SOCKS4, SOCKS4a y SOCKS5.
Existen programas que permiten a los usuarios eludir dichas limitaciones:
Calcetines
Los calcetines permiten que las aplicaciones accedan a las redes para utilizar un proxy sin necesidad de admitir ningún protocolo proxy. La forma más común es configurar un adaptador de red virtual y tablas de enrutamiento adecuadas para enviar tráfico a través del adaptador.
- Win2Socks, que permite a las aplicaciones acceder a la red a través de SOCKS5, HTTPS o Shadowsocks.
- tun2socks, una herramienta de código abierto que crea adaptadores TCP TUN virtuales a partir de un proxy SOCKS, capaz de usar UDP si se admite en otro extremo. Funciona en Linux y Windows, [22] tiene un puerto para macOS y una reimplementación en Golang . [23] Otra herramienta escrita en C con buen rendimiento, funciona en Linux/Android/BSD/macOS e iOS [24]
- proxychains, un programa Unix que fuerza el tráfico TCP a través de SOCKS o proxies HTTP en programas (vinculados dinámicamente) que lanza. Funciona en varios sistemas similares a Unix . [25]
Traducción de proxies
- Polipo , un servidor proxy HTTP/1.1 de reenvío y almacenamiento en caché que ya no se fabrica y que es compatible con IPv4 . Es de código abierto y se ejecuta en 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, un proxy HTTP/HTTPS liviano para sistemas operativos POSIX. Diseñado desde cero para ser rápido y, a la vez, pequeño. Presenta una interfaz de proxy http y puede conectarse a SOCKS4/5 y a servidores proxy http ascendentes.
Seguridad
Debido a la falta de cifrado en las solicitudes y en el intercambio de paquetes, SOCKS es prácticamente vulnerable a ataques de intermediarios y a escuchas clandestinas de direcciones IP, lo que en consecuencia abre el camino a la censura por parte de los gobiernos.
Referencias
- ^ "Registro de números de puerto de protocolo de transporte y nombre de servicio". Autoridad de Números Asignados de Internet . 19 de mayo de 2017 . Consultado el 23 de mayo de 2017 .
- ^ ab Koblas, David; Koblas, Michelle R. SOCKS (PDF) . Simposio de seguridad UNIX de USENIX III . Consultado el 16 de noviembre de 2019 .
- ^ Darmohray, Tina. "Cortafuegos y cuentos de hadas". ;LOGIN:. Vol 30, no. 1.
- ^ Índice de archivo en Wayback Machine
- ^ CNET: El ciberespacio desde el espacio exterior
- ^ EE. UU. US8984268B2
- ^ EE. UU. US20210058367A1
- ^ EE. UU. US11190374B2
- ^ JP6761452B2
- ^ EE. UU. US11425565B2
- ^ RFC 1928. doi : 10.17487/RFC1928 .
- ^ Oppliger, Rolf (2003). "Puertas de enlace a nivel de circuito". Tecnologías de seguridad para la World Wide Web (2.ª ed.). Artech House. ISBN 1580533485. Recuperado el 21 de enero de 2020 .
- ^ "Informe sobre el uso de herramientas de elusión en 2010" (PDF) . Centro Berkman para Internet y Sociedad de la Universidad de Harvard. Octubre de 2010.
- ^ "Preguntas frecuentes sobre Tor".
- ^ "Preguntas frecuentes sobre OpenSSH". Archivado desde el 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 .
- ^ "Easy Net con SOCKS5". shimmercat.com . ShimmerCat. Archivado desde el 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 .
- ^ Bizjak, Ambroz (20 de enero de 2020). «ambrop72/badvpn: lenguaje de programación NCD, proxy tun2socks, VPN P2P». GitHub . Consultado el 20 de enero de 2020 .
- ^ "xjasonlyu/tun2socks: tun2socks - impulsado por la pila TCP/IP de 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 cualquier conexión TCP realizada por cualquier aplicación a seguir un proxy como TOR o cualquier otro proxy SOCKS4, SOCKS5 o HTTP(S)". GitHub . Consultado el 20 de enero de 2020 .
Enlaces externos
- RFC 1928: Protocolo SOCKS versión 5
- RFC 1929: Autenticación de nombre de usuario y 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 mutuo para SOCKS V5
- SOCKS: Protocolo para proxy TCP a través de firewalls, Protocolo SOCKS versión 4 ( NEC )