Según tengo entendido, los firewalls (suponiendo una configuración predeterminada) niegan todo el tráfico entrante que no tiene tráfico saliente correspondiente anterior.
Basado en revertir una conexión ssh y hacer un túnel SSH fácil , se puede usar un túnel SSH inverso para sortear las molestas restricciones de 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, ssh (something)
primero puedo pedirle a alguien que se ejecute como root en la máquina remota.
¿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
)?
Respuestas:
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 los 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
-L
opción le dice al túnel que responda en el lado local del túnel (el host que ejecuta su cliente). La-R
opción le dice al túnel que responda en el lado remoto (el servidor SSH).Entonces ... Para poder SSH desde Internet en 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
-R
túnel cuyo punto de "entrada" sea el lado "remoto" de Su conexión.De los dos modelos que se muestran arriba, desea el de la derecha.
Del anfitrión con cortafuegos:
Esto le dice a su cliente que establezca un túnel con un
-R
punto de entrada de emote. 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 caparazón en su publichost , establezca una conexión con el host con cortafuegos a través del túnel:
Obtendrá un desafío clave de host, ya que probablemente nunca haya golpeado este host antes. Luego obtendrá un desafío de contraseña para la
username
cuenta (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
~/.ssh/config
archivo:Ajustar
remotehostname
yremoteusername
adaptar. Elremoteusername
campo debe coincidir con su nombre de usuario en el servidor remoto, peroremotehostname
puede ser cualquier nombre de host que le convenga, no tiene que coincidir con nada que se pueda resolver.(Para exponer el punto final inverso en una IP no localhost , consulte esta publicación )
fuente
He dibujado algunos bocetos
La máquina, donde se escribe el comando ssh tunnel se llama »su host« .
Introducción
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 aconnectToHost
, y reenviar todos los intentos de conexión al puerto local en la máquina llamada , a la que se puede acceder desde la máquina.sourcePort
onPort
forwardToHost
connectToHost
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 aconnectToHost
, y reenviar todos los intentos de conexión al puerto remoto en la máquina llamada , a la que se puede acceder desde su máquina local.sourcePort
onPort
forwardToHost
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.
Entonces, pídale a alguien que inicie una conexión de túnel ssh a su máquina. El comando debería verse básicamente
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
que se conectará a su propia
localhost
(su máquina) en el puerto12345
, pero el puerto12345
se reenvía a través del túnel al puerto 22 del host local de la computadora con firewall (es decir, la computadora con firewall).fuente
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í:
127.0.0.1
, pero se puede cambiar).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 (ver
ESCAPE CHARACTERS
, específicamente~C
).Para el papel de
-R
,-f
,-L
, y-N
, lo que realmente debe consultar la página del manual, que le da la mejor explicación posible. Pero lo 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.Tenga en cuenta que esta es una descripción muy cruda, pero debería darle suficiente información para saber qué está pasando
fuente
Esto se explica en el manual de SSH, especialmente las diferencias entre
-L
(local) y-R
(remoto).-L
El siguiente ejemplo hace un túnel de una sesión IRC desde la máquina cliente
127.0.0.1
(localhost
) usando el puerto 1234 al servidor remotoserver.example.com
:Nota: La
-f
opción fondos ssh y el comando remotosleep 10
se especifica para permitir una cantidad de tiempo para iniciar el servicio que se va a hacer un túnel.Ejemplo:
-N
Después de conectarse, simplemente cuelgue allí (no obtendrá un indicador de shell)-L 22000
La conexión se originará en el puerto 22000 de su, personal L máquina vecinallocalhost:11000
-remote.server.com
se asegurará de que el otro extremo del túnel sealocalhost
, puerto11000
Fuente: Una guía ilustrada, tutorial, procedimientos, sobre túneles ssh .
-R
Ejemplo:
-N
Después de conectarse, simplemente cuelgue allí (no obtendrá un indicador de shell)-R
22000 La conexión se originará en el puerto 22000 de la computadora R emote (en este caso, remote.server.com)localhost:11000
su computadora personal local se asegurará de que el otro extremo del túnel sealocalhost
puerto11000
Fuente: Una guía ilustrada, tutorial, procedimientos, sobre túneles ssh .
fuente