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
?
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
?
Respuestas:
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 -D
es realmente así:
ssh -D $port_number $hostname
o
ssh -D $port_number $username@$hostname
Donde $hostname
identifica alguna máquina; puede ser una dirección IP, una dirección que se puede resolver mediante DNS o mediante un /etc/hosts
archivo o mediante un ssh_config
archivo, etc. El primer comando utilizará su nombre de usuario actual (local) a menos que su ssh_config
archivo indique lo contrario (por defecto no lo hace). Debe proporcionar credenciales (como me gusta $username
y contraseña cuando se le solicite) válidas para la $hostname
máquina.
Esto abrirá el $port_number
puerto 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 ssh
es así:
A -> D
donde A
es un cliente (por ejemplo, navegador web), D
es un servidor (por ejemplo, servidor web). Pero con proxy esto es lo siguiente:
A -> B -> C -> D
dónde:
A
representa un único cliente que usa B:$port_number
como dirección SOCKS; Puede haber muchos clientes.B
es la máquina donde se ssh -D $port_number C
ejecuta y donde el TCP $port_number
escucha las conexiones entrantes de cualquiera A
.C
es el se $hostname
B
conecta a; la comunicación que normalmente va D
desde A
ahora llega D
desde C
.D
es cualquier servidor, ve comunicación desde C
y puede no ser consciente de eso A
y B
está 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
= C
no ofrece una ventaja directa sobre la A -> D
conexión simple , pero hay otros casos útiles.
Digamos que ejecuta el ssh
comando 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 ( A
≠ B
, las usarán $your_IP:$port_number
como la dirección del servidor SOCKS) debe:
$port_number
;-g
opción con ssh -D
;o
ssh
conexió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 -g
es necesario; esto se puede hacer ssh -L $some_port:localhost:$port_number $your_IP
invocando a su lado o ssh -R $some_port:localhost:$port_number $their_IP
invocado a su lado; los clientes usarán localhost:$some_port
como la dirección del servidor SOCKS en sus navegadores.No hay ninguna razón $hostname
no 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 ssh
conexión de localhost
a localhost
no solicite su contraseña. La observación anterior con respecto al firewall se encuentra. Cualquier persona que pueda usar $your_IP:$port_number
como 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 escucharport
en el lado local, opcionalmente vinculado al especificadobind_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 yssh
actuarán como un servidor SOCKS. Solo root puede reenviar puertos privilegiados. [...]
-f
Solicitudesssh
para 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. [...]
my_ip
refiere 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@localhost
deberí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í.
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.