desarrollo-web-br-bd.com

¿Cómo funciona el túnel de SSH inverso?

Según tengo entendido, los firewalls (asumiendo la configuración predeterminada) niegan todo el tráfico entrante que no tiene tráfico saliente correspondiente anterior.

Basado en Invertir una conexión ssh y Hacer túneles SSH fáciles , el túnel SSH inverso se puede usar para sortear las molestas restricciones del firewall.

Me gustaría ejecutar comandos de Shell en una máquina remota. La máquina remota tiene su propio firewall y está detrás de un firewall adicional (enrutador). Tiene una dirección IP como 192.168.1.126 (o algo similar). No estoy detrás de un firewall y sé la dirección IP de la máquina remota como se ve desde Internet (no la dirección 192.168.1.126). Además, puedo pedirle a alguien que ejecute ssh (something) como root en la máquina remota primero.

¿Podría alguien explicarme, paso a paso, cómo funciona el túnel de SSH inverso para sortear los firewalls (firewalls de máquinas locales y remotas y el firewall adicional entre ellos)?

¿Cuál es el papel de los interruptores (-R, -f, -L, -N)?

376
Ali

Me encanta explicar este tipo de cosas a través de la visualización. :-)

Piense en sus conexiones SSH como tubos. Tubos grandes Normalmente, alcanzará a través de estos tubos para ejecutar un Shell en una computadora remota. El Shell se ejecuta en una terminal virtual (tty). Pero ya conoces esta parte.

Piense en su túnel como un tubo dentro de un tubo. Todavía tiene la gran conexión SSH, pero la opción -L o -R le permite configurar un tubo más pequeño dentro de ella.

Cada tubo tiene un principio y un final. El gran tubo, su conexión SSH, comenzó con su cliente SSH y termina en el servidor SSH al que se conectó. Todos los tubos más pequeños tienen los mismos puntos finales, excepto que la función de "inicio" o "fin" está determinada por si usó -L O -R (Respectivamente) para crearlos.

(No lo ha dicho, pero voy a suponer que la máquina "remota" que ha mencionado, la que está detrás del firewall, puede acceder a Internet usando la Traducción de direcciones de red (NAT). Esto es algo importante, así que corrija esta suposición si es falsa).

Cuando crea un túnel, especifica una dirección y un puerto en el que responderá, y una dirección y un puerto al que se entregará. La opción -L Le dice al túnel que responda en el lado local del túnel (el Host ejecuta su cliente). La opción -R Le dice al túnel que responda en el lado remoto (el servidor SSH).

ssh tunnel directions

Entonces ... Para poder SSH desde Internet a una máquina detrás de un firewall, necesita la máquina en cuestión para abrir una conexión SSH al mundo exterior e incluir un túnel -R Cuyo punto de "entrada" es el lado "remoto" de su conexión.

De los dos modelos que se muestran arriba, desea el de la derecha.

De la hostia cortafuegos:

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com

Esto le dice a su cliente que establezca un túnel con un punto de entrada de emote -R. Cualquier cosa que se conecte al puerto 22222 en el extremo más alejado del túnel alcanzará realmente el "puerto localhost 22", donde "localhost" es desde la perspectiva del punto de salida del túnel (es decir, su cliente ssh).

Las otras opciones son:

  • -f Le dice a ssh que se ejecute en segundo plano una vez que se autentica, para que no tenga que sentarse a ejecutar algo en el servidor remoto para que el túnel permanezca vivo.
  • -N Dice que desea una conexión SSH, pero en realidad no desea ejecutar ningún comando remoto. Si todo lo que está creando es un túnel, entonces incluir esta opción ahorra recursos.
  • -T Deshabilita la asignación de pseudo-tty, lo cual es apropiado porque no está intentando crear un Shell interactivo.

Habrá un desafío de contraseña a menos que haya configurado claves DSA o RSA para un inicio de sesión sin contraseña.

Tenga en cuenta que se recomienda ENCARECIDAMENTE que utilice una cuenta desechable (no su propio inicio de sesión) que configuró solo para este túnel/cliente/servidor.

Ahora, desde su Shell en yourpublichost , establezca una conexión con el Host con cortafuegos a través del túnel:

ssh -p 22222 [email protected]

Obtendrá un desafío clave de Host, ya que probablemente nunca haya golpeado este Host antes. Entonces obtendrá un desafío de contraseña para la cuenta username (a menos que haya configurado claves para iniciar sesión sin contraseña).

Si va a acceder a este Host de forma regular, también puede simplificar el acceso agregando algunas líneas a su archivo ~/.ssh/config:

Host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

Ajuste remotehostname y remoteusername para adaptarlo. El campo remoteusername debe coincidir con su nombre de usuario en el servidor remoto, pero remotehostname puede ser cualquier nombre de host que le convenga, no tiene que coincidir con nada resoluble.

Ver también:

433
ghoti

He dibujado algunos bocetos

La máquina, donde se escribe el comando ssh tunnel se llama "your Host".

ssh tunnel starting from local


ssh tunnel starting from remote

Introducción

  1. local: -L Specifies that the given port on the local (client) Host is to be forwarded to the given Host and port on the remote side.

    ssh -L sourcePort:forwardToHost:onPort connectToHost Significa: conectarse con ssh a connectToHost, y reenviar todos los intentos de conexión a localsourcePort al puerto onPort en el máquina llamada forwardToHost, a la que se puede acceder desde la máquina connectToHost.

  2. remoto: -R Specifies that the given port on the remote (server) Host is to be forwarded to the given Host and port on the local side.

    ssh -R sourcePort:forwardToHost:onPort connectToHost Significa: conectarse con ssh a connectToHost, y reenviar todos los intentos de conexión a remotosourcePort al puerto onPort en el máquina llamada forwardToHost, a la que se puede acceder desde su máquina local.

Opciones adicionales

  • -f Le dice a ssh que se ejecute en segundo plano una vez que se autentica, para que no tenga que sentarse a ejecutar algo en el servidor remoto para que el túnel permanezca vivo.
  • -N Dice que desea una conexión SSH, pero en realidad no desea ejecutar ningún comando remoto. Si todo lo que está creando es un túnel, entonces incluir esta opción ahorra recursos.
  • -T Deshabilita la asignación de pseudo-tty, lo cual es apropiado porque no está intentando crear un Shell interactivo.

Su ejemplo

La tercera imagen representa este túnel. Pero la computadora azul llamada "su Host" representa la computadora donde alguien inicia el túnel ssh, en este caso la máquina cortafuegos .

Por lo tanto, solicite a a alguien que inicie una conexión de túnel ssh a su máquina. El comando debería verse básicamente

ssh -R 12345:localhost:22 YOURIP

Ahora se abre el túnel. Ahora puede conectarse mediante ssh a la máquina cortafuegos a través del túnel con el comando

ssh -p 12345 localhost

que se conectará a su propio localhost (su máquina) en el puerto 12345, pero el puerto 12345 se reenvía a través del túnel al puerto 22 del host local de la computadora con firewall (es decir, la computadora cortafuego en sí).

389
erik

el túnel ssh funciona utilizando la conexión ssh ya establecida para enviar tráfico adicional.

Cuando se conecta a un servidor remoto, generalmente solo tiene 1 canal para la interacción normal del usuario (o 3 canales si considera que STDIN/STDOUT/STDERR están separados). En cualquier momento, el proceso ssh local o remoto puede abrir canales adicionales en la conexión existente. Estos canales envían/​​reciben el tráfico del túnel. Al enviar o recibir tráfico, el proceso ssh simplemente dice "este tráfico es para el canal foobar".

Básicamente funciona así:

  1. Le dice a ssh que comience a escuchar en el puerto XXXX y que cualquier tráfico recibido debe ser tunelizado, y luego configurado en Y.Y.Y.Y en el puerto ZZZZ.
  2. El ssh local comienza a escuchar en el puerto XXXX (generalmente en 127.0.0.1, pero se puede cambiar).
  3. Algunas aplicaciones abren una conexión al puerto XXXX en la máquina local.
  4. El ssh local abre un canal al ssh remoto y dice "cualquier tráfico en este canal va a Y.Y.Y.Y: ZZZZ
  5. El ssh remoto se conecta a Y.Y.Y.Y: ZZZZ y devuelve el mensaje "OK, el canal está abierto"
  6. Ahora, cualquier tráfico enviado a lo largo de la conexión al puerto XXXX en la máquina local es enviado por ssh a Y.Y.Y.Y: ZZZZ.

Este proceso es exactamente el mismo para la tunelización directa e inversa (solo intercambie las palabras 'local' y 'remoto' en el procedimiento anterior). Cualquier lado puede comenzar el túnel. Ni siquiera tiene que ser cuando comienzas ssh por primera vez. Puede abrir túneles mientras ssh ya se está ejecutando (consulte ESCAPE CHARACTERS, específicamente ~C).

Para el papel de -R, -f, -L y -N, deberías consultar la página de manual, te da la mejor explicación posible. Pero mencionaré -R y -L.
-R le dice al ssh remoto que escuche las conexiones, y que el ssh local debe conectarse al destino real. -L le dice al ssh local que escuche las conexiones, y que el ssh remoto debe conectarse al destino real.

Nota, esta es una descripción muy cruda, pero debería darte suficiente información para saber qué está pasando

24
Patrick

Esto se explica en el manual de SSH, especialmente las diferencias entre -L (local) y -R (remoto).


-L

-L [bind_address:]port:Host:hostport

Especifica que el puerto dado en el host local (cliente) se debe reenviar al host dado y al puerto en el lado remoto .

Esto funciona mediante la asignación de un socket para escuchar el puerto en el lado local, opcionalmente vinculado a la dirección de enlace especificada.

Cada vez que se realiza una conexión a este puerto, la conexión se reenvía a través del canal seguro, y se realiza una conexión a Host puerto hostport de la máquina remota .

El siguiente ejemplo hace un túnel en una sesión IRC desde la máquina cliente 127.0.0.1 (localhost) usando el puerto 1234 al servidor remoto server.example.com:

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10

Nota la -f opción fondos ssh y el comando remoto sleep 10 se especifica para permitir una cantidad de tiempo para iniciar el servicio que se va a hacer un túnel.

Ejemplo:

ssh `-N` -L 22000:localhost:11000 remote.server.com
  • -N Después de conectarte, simplemente cuelga allí (no obtendrás un indicador de Shell)

    No ejecute un comando remoto.

  • -L 22000 La conexión se originará en el puerto 22000 de su máquina personal, [~ # ~] l [~ # ~]

  • localhost:11000 - remote.server.com se asegurará de que el otro extremo del túnel sea localhost, puerto 11000

ssh -N -L 22000:192.168.1.2:11000 remote.server.com

Fuente: na guía ilustrada, tutorial, cómo hacerlo, sobre túneles ssh .


-R

-R [bind_address:]port:Host:hostport

Especifica que el puerto dado en el host remoto (servidor) se debe reenviar al host dado y al puerto en el lado local .

Esto funciona mediante la asignación de un socket para escuchar port en el lado remoto, y cada vez que se realiza una conexión a este puerto, la conexión se reenvía a través del canal seguro, y se realiza una conexión a Host puerto hostport desde la máquina local .

Ejemplo:

ssh -N -R 22000:localhost:11000 remote.server.com
  • -N Después de conectarte, simplemente cuelga allí (no obtendrás un indicador de Shell)

    No ejecute un comando remoto.

  • -R 22000 La conexión se originará en el puerto 22000 del [~ # ~] r [~ # ~] emote computer (en este caso, remoto). server.com)

  • localhost:11000 su computadora personal local se asegurará de que el otro extremo del túnel sea localhost, puerto 11000

ssh -N -R 22000:localhost:11000 remote.server.com

Fuente: na guía ilustrada, tutorial, cómo hacerlo, sobre túneles ssh .

18
kenorb