¿Cómo ssh a un servidor al que no puedo acceder directamente?

17

Contexto

Estoy ejecutando Ubuntu Desktop como mi máquina principal, a la que llamaré D. Quiero conectarme al servidor S a través de ssh, pero el firewall me está bloqueando.

Tengo acceso al servidor S, a través de una ruta muy engorrosa, que involucra una máquina virtual de Windows y PuTTY . Esto hace que trabajar con este servidor sea extremadamente molesto: un entorno completamente diferente, copiar / pegar no funciona, no puedo usar correctamente mi escritorio mientras estoy conectado (Alt-Tab está roto por la máquina virtual), etc.

He verificado que puedo ssh desde el servidor S a mi máquina de escritorio D (lo contrario de lo que necesito).

¿Podría de alguna manera iniciar un "reenvío de puertos" o similar desde el servidor, para poder enviar ssh al servidor desde mi escritorio?

dangonfast
fuente
2
Saltar anfitriones ... tengo que amarlos!
RonJohn
Posible duplicado del túnel SSH de A-> B-> C
muru
@muru este es un escenario diferente, pero por supuesto relacionado (¡se trata de túneles después de todo!). En este caso quiero fingir D->SabusandoS->D
dangonfast

Respuestas:

32

Puede usar el siguiente comando para configurar un túnel SSH desde el servidor remoto a su máquina local:

$ ssh -f -N -R 1234:localhost:22 user@your_machine_ip

Cuando se configura el túnel, simplemente puede enviar ssh a su servidor remoto con el siguiente comando:

$ ssh -p 1234 user@localhost

Tenga en cuenta que debe configurar las claves ssh para el inicio de sesión automático (sin solicitud de contraseña). Si desea crear el túnel SSH de forma interactiva, puede eliminar las opciones -f -N. Para obtener más información, man ssh.

Khaled
fuente
¿Cómo funciona este túnel a través de la VM de Windows? (Donde trabajo, hay varias capas de cortafuegos y solo se abren unos pocos puertos).
RonJohn
@RonJohn Creo que esto utiliza el hecho de que (para OP) el envío del servidor al escritorio funciona, por lo que esto configura un túnel desde el servidor (puerto 22) directamente a la máquina de escritorio (puerto 1234) que se puede usar para conectarse a ssh en el servidor (que usa el puerto 22). La VM de Windows solo se usa para configurar el túnel. (
corrígeme
@dangonfast Además de la respuesta, puede encontrar el siguiente documento de valor: spencerstirling.com/computergeek/sshtunnel.html
Pryftan
@RonJohn El documento que acabo de vincular también podría ayudar a responder esa pregunta, al menos en lo que respecta a múltiples capas de firewalls, etc. (si la memoria me sirve bien, ha sido mucho tiempo que la he leído ... Simplemente recordaba tener el enlace de hace años).
Pryftan
1
@ pizzapants184 de hecho, ese fue mi punto de partida: ssh de S -> D, por lo que quiero abusar de esto para hacer D -> S de manera efectiva, a pesar de que eso no funciona directamente. ¿Por qué la red está configurada así? Es algo que se me escapa. Podría ser intencional o una mala configuración, pero siempre y cuando funcione para mí ...
dangonfast
5

Si está ejecutando una versión más nueva de OpenSSH (7.3+), entonces puede usar ProxyJumpque hornea todo junto mágicamente:

ssh -J windows_machine remote_server

Que en tu ~/.ssh/configaspecto como:

Host remote_server
        HostName remote_server
        ProxyJump windows_machine
        User myname

ProxyJumpadmite sintaxis SSH completa, por lo que si está jimactivado windows_servery usa el puerto 2222para ssh. remote_serverestá en IP 192.168.0.110desde windows_serverentonces puede escribir:

Host remote_server
        HostName 192.168.0.110
        ProxyJump jim@windows_machine:2222
        User myname

Y todavía solo corro ssh remote_serverpara llegar allí.


Si está ejecutando una versión anterior de SSH, use ProxyCommand ; esto le permite decirle a SSH que primero ejecute un comando para establecer una conexión proxy, antes de ejecutar el comando SSH real.

ssh -o ProxyCommand='ssh -W %h:%p windows_machine' remote_server

Utiliza la opción SSH -W , que es la abreviatura de la sintaxis netcat más arcana .

Tenga en cuenta que, como cuando está ejecutando ssh remote_server, ahora windows_machinedebe asegurarse de usar la IP de la remove_server caja de salto en lugar de la IP de su máquina; estos pueden ser lo mismo.

Luego puede agregar esta directiva a su ~/.ssh/configarchivo:

Host remote_server
  HostName remote_server
  User myname
  ProxyCommand ssh -W %h:%p windows_machine

Esto significa que si remote_server es una máquina diferente como se ve desde windows_machineentonces, puede ponerla en la configuración y seguir usándola ssh remote_server.

Boris la araña
fuente
1
Esta es una respuesta mucho mejor.
Robert Riedl
Si bien es útil, esto no responde la pregunta que se hace. OP afirma que no pueden SSH desde D-> S (lo que quieren), pero pueden SSH desde S-> D. No hay proxies ssh en el medio (en cambio, está la máquina virtual de Windows, probablemente a la que RDP accede).
mbrig
@mbrig de hecho. No probé esta solución, pero me sorprendería si funciona: tengo un cortafuegos de D -> S
dangonfast
Pero usted dice que puede llegar a la máquina de Windows, por eso entendí que puede actuar como una caja de salto entre usted y la otra máquina.
Boris the Spider
1
Puedo iniciar sesión en la máquina de Windows con una herramienta propietaria (VMWare Horizon). Nunca dije que podía hacerlo. Incluso probé esto antes de publicar esta pregunta instalando el servidor ssh complementario de Putty (olvidé el nombre), pero mis pruebas fallaron. Supongo que ssh también está conectado a la subred de Windows.
dangonfast
1

En lugar de tratar de eludir las cosas y crear una ruta complicada, ¿no puedes simplemente pedir que se permita SSH desde tu escritorio al servidor? Si lo necesita y debe acceder al servidor, no puedo ver por qué rechazaría la solicitud.

Erupción solar
fuente
¿Te importaría explicar el voto negativo? La pregunta es "¿Cómo ssh a un servidor al que no puedo acceder directamente?" así que mi respuesta para tener una regla de firewall establecida para permitirla es válida. También es la forma correcta de evitarlo de acuerdo con las buenas prácticas de seguridad.
Solarflare
Estoy en mi primera semana de un contrato de tres meses con un gran cliente corporativo. No me han dado una computadora portátil (yo uso la mía), y apenas un escritorio. Obtuve docenas de credenciales para usar los diferentes servicios, y apenas logro manejar todo. Lo que quiero hacer no es un requisito difícil para realizar mi trabajo: puedo trabajar en la máquina virtual, y eso es lo que mi jefe me dirá si empiezo a hacer preguntas divertidas. O me indicará la mesa de ayuda que pateará la lata por las próximas semanas / meses.
dangonfast
Para mí, trabajar en la máquina virtual significará fácilmente una pérdida de productividad del 50%, por lo que quiero evitarla tanto como sea posible. Aún así, me encanta este concierto!
dangonfast
1
Puedo entender eso. En mi experiencia, los 'grandes clientes corporativos' tienden a enojarse bastante cuando los contratistas eluden los firewalls y las políticas para hacer su trabajo, incluso si es con fines altruistas. El hecho de que pueda usar SSH desde el servidor a su escritorio me dice que si no puede hacer lo contrario es un descuido o algo que se ha implementado para un propósito específico.
Solarflare
44
Esta es la única solución real si desea evitar el riesgo de ser despedido por eludir las políticas ... Por lo menos, hable con las personas responsables antes de usar la solución Khaleds para que sepan lo que está haciendo.
Sven