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