termius number ssh port portforwarding

number - ssh tunnel windows



ssh-L reenviar mĂșltiples puertos (8)

Actualmente estoy ejecutando un montón de:

sudo ssh -L PORT:IP:PORT root@IP

donde IP es el objetivo de una máquina segura y PORT representa los puertos que estoy reenviando.

Esto se debe a que uso muchas aplicaciones a las que no puedo acceder sin este reenvío. Después de realizar esto, puedo acceder a través de localhost:PORT .

El principal problema se produjo ahora que tengo 4 de estos puertos que debo reenviar.

Mi solución es abrir 4 shells y buscar constantemente mi historial hacia atrás para buscar exactamente qué puertos deben reenviarse, etc., y luego ejecutar este comando, uno en cada shell (tener que completar las contraseñas, etc.).

Si tan solo pudiera hacer algo como:

sudo ssh -L PORT1+PORT2+PORT+3:IP:PORT+PORT2+PORT3 root@IP

entonces eso ya sería de gran ayuda.

¿Hay alguna manera de hacer que sea más fácil hacer esto?


Exactamente lo que respondió, especifica múltiples argumentos -L. Hago esto todo el tiempo. Aquí hay un ejemplo de reenvío multipuerto:

ssh remote-host -L 8822:REMOTE_IP_1:22 -L 9922:REMOTE_IP_2:22

Nota : Esto es lo mismo que -L localhost:8822:REMOTE_IP_1:22 si no especifica localhost .

Ahora con esto, ahora puede (desde otra terminal) hacer:

ssh localhost -p 8822

para conectarse a REMOTE_IP_1 en el puerto 22

y de manera similar

ssh localhost -p 9922

para conectarse a REMOTE_IP_2 en el puerto 22

Por supuesto, no hay nada que le impida envolver esto en un script o automatizarlo si tiene muchos hosts / puertos diferentes para reenviar y ciertos determinados.

Espero que esto ayude.


He desarrollado loco para obtener ayuda con el reenvío ssh. Se puede utilizar para compartir los puertos 5000 y 7000 en remoto localmente en los mismos puertos:

pip install loco loco listen SSHINFO -r 5000 -r 7000


Para las personas que reenvían múltiples puertos a través del mismo host, pueden configurar algo como esto en su ~ / .ssh / config

Host all-port-forwards Hostname 10.122.0.3 User username LocalForward PORT_1 IP:PORT_1 LocalForward PORT_2 IP:PORT_2 LocalForward PORT_3 IP:PORT_3 LocalForward PORT_4 IP:PORT_4

y se convierte en un simple ssh all-port-forwards distancia.


Puede usar la siguiente función bash (solo agréguela a su ~/.bashrc ):

function pfwd { for i in ${@:2} do echo Forwarding port $i ssh -N -L $i:localhost:$i $1 & done }

Ejemplo de uso:

pfwd hostname {6000..6009}


Puedes usar esta función zsh (probablemente también funciona con bash) ( ~/.zshrc en ~/.zshrc ):

ashL () { local a=() i for i in "$@[2,-1]" do a+=(-L "${i}:localhost:${i}") done autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -NT "$1" "$a[@]" }

Ejemplos:

ashL [email protected] 6480 7690 7477

ashL [email protected] {6000..6050} # Forwards the whole range. This is simply shell syntax sugar.


Una de las ventajas de iniciar sesión en un servidor con reenvío de puertos es facilitar el uso de Jupyter Notebook. Este link proporciona una excelente descripción de cómo hacerlo. Aquí me gustaría hacer un resumen y expansión para que todos ustedes lo refieran.

Situación 1. Inicie sesión desde una máquina local llamada Host-A (por ejemplo, su propia computadora portátil) a una máquina de trabajo remota llamada Host-B.

ssh user@Host-B -L port_A:localhost:port_B jupyter notebook --NotebookApp.token='''' --no-browser --port=port_B

Luego puede abrir un navegador e ingresar: http://localhost:port_A/ para hacer su trabajo en el Host-B pero verlo en el Host-A.

Situación 2. Inicie sesión desde una máquina local llamada Host-A (por ejemplo, su propia computadora portátil) en una máquina de inicio de sesión remota llamada Host-B y desde allí inicie sesión en la máquina de trabajo remota llamada Host-C. Este suele ser el caso para la mayoría de los servidores analíticos dentro de las universidades y se puede lograr utilizando dos ssh -L conectados con -t .

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C jupyter notebook --NotebookApp.token='''' --no-browser --port=port_C

Luego puede abrir un navegador e ingresar: http://localhost:port_A/ para hacer su trabajo en Host-C pero verlo en Host-A.

Situación 3. Inicie sesión desde una máquina local llamada Host-A (por ejemplo, su propia computadora portátil) en una máquina de inicio de sesión remota llamada Host-B y desde allí inicie sesión en la máquina de trabajo remota llamada Host-C y finalmente inicie sesión en la máquina de trabajo remota Host- RE. Este no suele ser el caso, pero podría suceder en algún momento. Es una extensión de la Situación 2 y la misma lógica se puede aplicar en más máquinas.

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C -t ssh -L port_C:localhost:port_D user@Host-D jupyter notebook --NotebookApp.token='''' --no-browser --port=port_D

Luego puede abrir un navegador e ingresar: http://localhost:port_A/ para hacer su trabajo en Host-D pero verlo en Host-A.

Tenga en cuenta que port_A, port_B, port_C, port_D pueden ser números aleatorios, excepto los números de puerto comunes enumerados here . En la situación 1, port_A y port_B pueden ser lo mismo para simplificar el procedimiento.


Use la opción -L nuevamente en el mismo comando. Cada vez con diferentes puertos.


jbchichoko y yuval han dado soluciones viables. Pero la respuesta de jbchichoko no es una respuesta flexible como una función, y ctrl+c no puede cerrar los túneles abiertos por la respuesta de ctrl+c porque se ejecuta en segundo plano. Doy mi solución a continuación resolviendo los dos defectos:

Definiendo una función en ~/.bashrc o ~/.zshrc :

# fsshmap multiple ports function fsshmap() { echo -n "-L 1$1:127.0.0.1:$1 " > $HOME/sh/sshports.txt for ((i=($1+1);i<$2;i++)) do echo -n "-L 1$i:127.0.0.1:$i " >> $HOME/sh/sshports.txt done line=$(head -n 1 $HOME/sh/sshports.txt) cline="ssh "$3" "$line echo $cline eval $cline }

Un ejemplo de ejecución de la función:

fsshmap 6000 6010 hostname

Resultado de este ejemplo:

Puede acceder a 127.0.0.1:16000~16009 igual que el hostname:6000~6009