¿Cómo crear un proxy SOCKS con ssh?

4

Quiero usar mi computadora como proxy SOCKS. ¿Solo tienes que hacer ssh -D port_number hostname? ¿Tengo que poner mi nombre de usuario de Linux como hostname?

Raffaele D'Arco
fuente

Respuestas:

8

tl; dr: busca el texto en negrita a continuación.


Nota: utilizo el $prefijo para las cadenas que debe sustituir con los valores deseados. Esta sintaxis no está destinada a ser totalmente compatible con variables en ningún shell.

El uso de ssh -Des realmente así:

ssh -D $port_number $hostname

o

ssh -D $port_number $username@$hostname

Donde $hostnameidentifica alguna máquina; puede ser una dirección IP, una dirección que se puede resolver mediante DNS o mediante un /etc/hostsarchivo o mediante un ssh_configarchivo, etc. El primer comando utilizará su nombre de usuario actual (local) a menos que su ssh_configarchivo indique lo contrario (por defecto no lo hace). Debe proporcionar credenciales (como me gusta $usernamey contraseña cuando se le solicite) válidas para la $hostnamemáquina.

Esto abrirá el $port_numberpuerto TCP en su computadora local y establecerá un servidor SOCKS en él. Tenga en cuenta que es posible que no se le permita abrir algunos puertos como usuario normal, especialmente por debajo 1024, use un número más alto entonces.

En general, la situación sin proxy SOCKS proporcionada por sshes así:

A -> D

donde Aes un cliente (por ejemplo, navegador web), Des un servidor (por ejemplo, servidor web). Pero con proxy esto es lo siguiente:

A -> B -> C -> D

dónde:

  • Arepresenta un único cliente que usa B:$port_numbercomo dirección SOCKS; Puede haber muchos clientes.
  • Bes la máquina donde se ssh -D $port_number Cejecuta y donde el TCP $port_numberescucha las conexiones entrantes de cualquiera A.
  • Ces el se $hostname Bconecta a; la comunicación que normalmente va Ddesde Aahora llega Ddesde C.
  • Des cualquier servidor, ve comunicación desde Cy puede no ser consciente de eso Ay Bestá involucrado; Puede haber muchos servidores.

Algunas de estas cartas pueden referirse a la misma máquina en algunos casos de uso particulares. Obviamente, cualquier caso donde A= Cno ofrece una ventaja directa sobre la A -> Dconexión simple , pero hay otros casos útiles.

Digamos que ejecuta el sshcomando que se muestra arriba y le dice a su navegador local que use SOCKS en localhost:$port_number. Este es el caso donde A= B. El tráfico de su navegador será reenviado y los sitios que visite ( D) verán la comunicación proveniente de $hostname( C) como si su navegador funcionara allí.

Si desea que otras computadoras se conecten a su puerto abierto ( AB, las usarán $your_IP:$port_numbercomo la dirección del servidor SOCKS) debe:

  • configure su firewall para permitir conexiones entrantes al puerto TCP $port_number;
  • use la -gopción con ssh -D;

o

  • tunelice a cada cliente, por ejemplo, a través de su propia sshconexión por separado , de modo que sus conexiones parezcan locales (como si A= B) a su sistema en ejecución, por ssh -D ...lo que el firewall no interfiere ni -ges necesario; esto se puede hacer ssh -L $some_port:localhost:$port_number $your_IPinvocando a su lado o ssh -R $some_port:localhost:$port_number $their_IPinvocado a su lado; los clientes usarán localhost:$some_portcomo la dirección del servidor SOCKS en sus navegadores.

No hay ninguna razón $hostnameno puede ser B's localhost; puede. En este caso B= C. Esto no tiene sentido cuando usa este proxy SOCKS con su navegador local ( A= B= C) pero si permite conexiones desde el exterior, entonces tiene mucho sentido. Supongo que esto es lo que quieres hacer. El comando puede ser:

ssh -g -f -N -D $port_number localhost

Es posible que desee establecer una autenticación basada en claves para que esta sshconexión de localhosta localhostno solicite su contraseña. La observación anterior con respecto al firewall se encuentra. Cualquier persona que pueda usar $your_IP:$port_numbercomo dirección de servidor SOCKS será visto por los servidores que visite como si estuvieran en su computadora.


Fragmentos relevantes de man 1 ssh:

-D [bind_address:]port
Especifica un reenvío de puerto a nivel de aplicación "dinámico" local. Esto funciona asignando un socket para escuchar porten el lado local, opcionalmente vinculado al especificado bind_address. Cada vez que se realiza una conexión a este puerto, la conexión se reenvía a través del canal seguro, y el protocolo de aplicación se utiliza para determinar dónde conectarse desde la máquina remota. Actualmente, los protocolos SOCKS4 y SOCKS5 son compatibles y sshactuarán como un servidor SOCKS. Solo root puede reenviar puertos privilegiados. [...]

-f
Solicitudes sshpara pasar a segundo plano justo antes de la ejecución del comando. [...]

-g
Permite que los hosts remotos se conecten a puertos locales reenviados.

-N
No ejecute un comando remoto. Esto es útil solo para reenviar puertos. [...]

Kamil Maciorowski
fuente
gracias hombre :). Entonces, por ejemplo, ssh -D 5050 myname @ my_ip es el comando que ejecutaré en mi computadora portátil. Luego, abro el puerto en el enrutador y finalmente configuro el proxy en mi PC. ¿Derecho?
Raffaele D'Arco
@ RaffaeleD'Arco Realmente no sé si es correcto porque no sé a qué se my_iprefiere ni dónde está el enrutador de su red ni qué hace. Aunque creo que te estás perdiendo -g. Si desea que su computadora portátil Linux actúe como un único relé, entonces ssh -g -D 5050 $username@localhostdebería ser el primer paso. Si la computadora portátil está detrás de un enrutador que implementa NAT y si los posibles clientes no están en la misma LAN, entonces debe configurar el reenvío de puertos allí.
Kamil Maciorowski
SÍ, me gustaría configurar mi computadora portátil Linux como un servidor proxy. Cuando estoy fuera de casa, quiero usar el proxy en mi PC.
Raffaele D'Arco
@R Parece que necesita orientación para aplicar mi respuesta genérica a su caso específico. Un poco de problema XY . Puede haber sido mejor revelar estos detalles al principio, mi respuesta los abordaría. OK, necesita acceso SSH desde su computadora "itinerante" a su "hogar", probablemente con el reenvío de puertos en el enrutador doméstico. De "viaje": ssh -p $forwarded_port -D $port_number $username@$external_IP_of_home. CALCETINES configuración del proxy en el navegador "viajar": localhost:$port_number. Este es el caso que comienza con "Digamos" en mi respuesta.
Kamil Maciorowski
gran respuesta. Estaba luchando por comprender dónde vive el servidor de calcetines y esto ha ayudado a aclarar eso :)
JonnyRaa