
Tengo un servidor remoto que está detrás de dos puertas de enlace como se muestra en la figura. gw1
está abierto al mundo exterior mientras que gw2
solo es accesible desde gw1
. Server
Solo se puede acceder desde gw2
uno de varios servidores posibles y puede ser uno de ellos. Quiero configurar el reenvío de puertos ssh
de modo que 443
desde mi máquina cliente se reenvíe automáticamente 2000
a gw1
. Este no es el problema. Tengo:
HostName gw1
User user
ForwardAgent yes
LocalForward 443 localhost:2000
Y esto funciona perfectamente. Ahora quiero 2000
que gw1
se me reenvíe 443
a Server
través gw2
de cuando lo ssh
haga gw2
. Puedo hacer:
HostName gw2
LocalForward 2000 Server:443
¿Hay alguna forma de que pueda pasar la IP del servidor como parámetro ya que puede ser diferente cada vez?
Respuesta1
Supongamos que no le importa el puerto 2000. Su objetivo en realidad es simplemente reenviar el puerto 443 del cliente al servidor. Y supongamos que tiene hosts servidor1, servidor2, servidor3, ... en la función de servidor. Si agrega esto a su .ssh/config:
Match host server*
ProxyCommand ssh gw1 nc gw2 22
LocalForward 443 %h:443
Luego, por ejemplo, ssh server1
se conectará a través de gw1 a gw2 y reenviará 443 desde allí al servidor1.
Qué hace esto: le ProxyCommand
dice a ssh que se conecte primero a gw1 y canalice la salida estándar a nc gw2 22
, que reenvía esa transmisión a gw2 en el puerto 22. Eso crea un túnel para la entrada estándar en el cliente a través de gw1 a gw2:22. ssh luego abre una segunda sesión ssh a través de ese túnel hasta gw2. Una vez establecido, LocalForward
reenvía el puerto 443 al servidor1 ( %h
siendo el nombre de host que proporcionó en la línea de comando).
Consulte man ssh_config para leer sobre Match y ProxyCommand.
Tenga en cuenta que, aunque el comando es ssh server1
, en realidad solo conecta ssh hasta gw2 y luego simplemente reenvía el puerto 443 desde allí. Se abriría un shell en gw2, no en el servidor1. Por lo tanto, es posible que desee ejecutar ssh -N server1
en su lugar, para evitar abrir el shell, ya que el objetivo en realidad es simplemente reenviar el puerto. Desafortunadamente, no hay un equivalente de -N en .ssh/config, pero podría agregar algo como LocalCommand wait
para lograr lo mismo: el shell simplemente esperaría hasta que se interrumpiera y no habría ningún indicador de shell.