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 La tunelización SSH simplificada , la tunelización SSH inversa se puede utilizar para obtener alrededor de 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 conozco 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.
¿Alguien podría explicarme, paso a paso, cómo funciona el túnel SSH inverso para sortear los firewalls (firewalls de máquinas locales y remotas y el firewall adicional entre ellos)?
¿Cuál es la función de los conmutadores (-R
, -f
, -L
, -N
)?
Comentarios
- Relacionado (cómo hacerlo): ¿Cómo puedo configurar una conexión SSH inversa a la computadora que se conecta?
Respuesta
Me encanta explicar este tipo de cosas a través de la visualización. 🙂
Piense en sus conexiones SSH como tubos. Tubos grandes. Normalmente, atravesará estos tubos para ejecutar un shell en una computadora remota. El shell se ejecuta en una terminal virtual (tty). Pero ya conoce esta parte.
Piense en su túnel como un tubo dentro de un tubo. Aún tienes la conexión SSH grande, pero la opción -L o -R te permite configurar un tubo más pequeño dentro de él.
Cada tubo tiene un principio y un final. El tubo grande, 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 «finalización» está determinada por si usó -L
o -R
(respectivamente) para crearlos.
(No lo ha dicho, pero voy a asumir que la máquina «remota» que mencionaste, 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 corrige esta suposición si es falsa).
Cuando crea un túnel, especifica un anuncio vestido y puerto en el que responderá, y dirección y puerto al que será entregado. La opción -L
le dice al túnel que responda en el lado local del túnel (el host que ejecuta su cliente). La opción -R
le dice al túnel que responda en el lado remoto (el servidor SSH).
Entonces … Para poder SSH desde Internet a una máquina detrás de un firewall, necesita que la máquina en cuestión abra una conexión SSH al mundo exterior e incluya un -R
túnel cuyo punto de» entrada «es el lado» remoto «de su conexión.
De los dos modelos que se muestran arriba, quieres el de la derecha.
Desde el host con firewall:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
Esto le dice a su cliente que establezca un túnel con una -R
entrada de emote punto. Todo lo que se conecte al puerto 22222 en el extremo más alejado del túnel llegará al «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 después de que se autentica, para que no tenga que sentarse a ejecutar algo en el servidor remoto para que el túnel permanezca activo. -
-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 usted no tratando de 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 es FIRMEMENTE recomendó que use una cuenta desechable (no su propio inicio de sesión) que configure solo para este túnel / cliente / servidor.
Ahora, desde su shell en yourpublichost , establezca una conexión con el host con firewall a través del túnel:
ssh -p 22222 username@localhost
Usted «ll obtenga un desafío de clave de host, ya que probablemente nunca antes haya llegado a este host. Luego, obtendrá un desafío de contraseña para la cuenta username
(a menos que haya configurado claves para el inicio de 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 adaptarse. El remoteusername
El campo 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 que se pueda resolver.
Ver también:
- Exponer el extremo inverso en un IP que no es localhost
- Consejos sobre el uso de
ControlMaster
para mantener su túnel
Comentarios
- ¿qué pasa con ssh -D. Explique utilizando el mismo método.
- Los proxies SOCKS no son lo mismo que los túneles. Si tiene alguna pregunta sobre cómo usarlos, pregúntela .
- Yo ‘ Estoy teniendo dificultades para seguir esta explicación debido al uso impreciso de los términos: servidor, cliente, máquina local, máquina remota, host, yourpublichost, localhost, remotehostname. Con todos estos términos imprecisos e indefinidos, se podría suponer que alguien necesitaría hasta 8 computadoras para configurar esto. Digo esto porque en todos los demás aspectos me parece una muy buena explicación. Reduzca y defina términos.
- @ Rucent88, ‘ no estoy seguro de qué reducción sería posible. Un cliente establece una conexión a un servidor. Esa ‘ es la terminología común en todo el mundo de las redes. Las máquinas locales y remotas parecen bastante evidentes. Si ‘ está confundido acerca de SSH o la terminología general de Unix después de leer la documentación, ‘ estoy seguro de que ‘ No tendré problemas para encontrar personas aquí dispuestas a responder cualquier pregunta que pueda tener.
- @ghoti Es ‘ realmente confuso, porque los y las máquinas remotas son relativas. Cuando me siento en el lugar de trabajo, la computadora de mi hogar es el control remoto, cuando me siento en casa, la computadora del lugar de trabajo es remota. El servidor y el cliente también son confusos cuando se habla de tunelización. Por ejemplo, si me conecto a casa desde el trabajo con ssh -R. Me conecto a mi trabajo desde la computadora de casa conectando localhost. Entonces, desde la perspectiva de los sockets, el servidor es la computadora doméstica. Pero lógicamente me conecté a la computadora de mi trabajo. Eso ‘ es confuso.
Respuesta
He dibujado algunos bocetos
La máquina, donde se escribe el comando del túnel ssh 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 localsourcePort
al puertoonPort
en la máquina llamadaforwardToHost
, al que se puede acceder desde la máquinaconnectToHost
. -
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 remotosourcePort
al puertoonPort
en la máquina llamadaforwardToHost
, a la que se puede acceder desde su máquina local.
Opciones adicionales
-
-f
le dice a ssh que se ponga en segundo plano después de que se autentica, por lo que no tiene 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 usted no tratando de crear un shell interactivo.
Su ejemplo
La tercera imagen representa este túnel. Pero la computadora azul llamada »tu 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. Básicamente, el comando debería verse como
ssh -R 12345:localhost:22 YOURIP
Ahora el túnel está abierto.Ahora puede conectarse a través de 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 del cortafuegos computadora (es decir, la computadora con firewall).
Comentarios
- @erik, ¿Cómo dibujaste estas imágenes?
- Yo usé la herramienta de dibujo vectorial de código abierto llamada Inkscape y mis ratones (bueno, en realidad es un trackball: Marble FX de Logitech).
- @ghoti: De forma predeterminada, el conector de escucha en el servidor (en mi imagen -R, el host remoto amarillo) estará vinculado únicamente a la interfaz de bucle de retorno. Esto se puede anular especificando un bind_address. Un bind_address vacío o la dirección «*» indica que el conector remoto debe escuchar en todas las interfaces. – Pruébelo: en una computadora azul, inicie
ssh -R 1234:localhost:8000 yellowcomputer
. Y también en la máquina azul, iniciepython -m SimpleHTTPServer
(un servidor web simple en el puerto 8000). Luego, en un navegador web en la máquina amarilla, abra la URLhttp://localhost:1234
y verá que funciona. - @erik, ah, la parte confusa es porque mis ojos están Malo: no ‘ t viendo el espacio antes de
remotehost
en tus comandos. Tras una inspección más cercana, veo que sus diagramas no ‘ en realidad abordan la dirección_bind opcional en absoluto. Perdón por la confusión. - @briankip Sí, por supuesto. Al menos si desea hacer una conexión SSH a la computadora detrás del firewall (a través del túnel o directamente, si el firewall lo permite). Es decir: el comando ssh que escribe en la computadora con firewall solo abre un túnel, pero no se inicia ni funciona como un ssh-daemon / -server. Su siguiente pregunta debería ser, cómo iniciar un sshd sin privilegios de root (si ese es su problema). 🙂
Respuesta
El túnel ssh funciona usando 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 STDIN / STDOUT / STDERR separados). En cualquier momento, el proceso ssh local o remoto puede abrir canales adicionales en la conexión existente. Estos canales luego 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í:
- Le dice a ssh que comience a escuchar en el puerto XXXX y que cualquier tráfico recibido debe ser tunelizado, y luego establecido en YYYY en el puerto ZZZZ.
- El ssh local comienza a escuchar en el puerto XXXX (generalmente en
127.0.0.1
, pero se puede cambiar). - Algunas aplicaciones abren una conexión al puerto XXXX en la máquina local.
- El ssh local abre un canal al ssh remoto y dice «cualquier tráfico en este canal va a YYYY: ZZZZ
- El SSH remoto se conecta a YYYY: ZZZZ y envía el mensaje «OK, el canal está abierto»
- 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 YYYY: ZZZZ.
Este proceso es exactamente el mismo para tunelización directa e inversa (simplemente intercambie las palabras «local» y «remoto» en el procedimiento anterior). Cualquiera de los lados puede iniciar el túnel. ni siquiera tiene que serlo cuando inicia ssh por primera vez. Puede abrir túneles mientras ssh ya se está ejecutando (consulte ESCAPE CHARACTERS
, específicamente ~C
).
Para conocer el rol de -R
, -f
, -L
y -N
, debería consultar la página de manual, le da la mejor explicación posible. Pero mencionaré -R
y -L
.
-R
le dice al ssh remoto para escuchar conexiones, y que el ssh local debe conectarse al destino real. -L
le dice al ssh local que escuche 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
Respuesta
Esto se explica en el manual 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) debe ser reenviado al host dado y puerto en el lado remoto .
Esto funciona asignando un socket para escuchar el puerto en el lado local, opcionalmente vinculado a la bind_address especificada.
Siempre que se hace una conexión a este puerto, la conexión se reenvía a través del canal seguro y se establece una conexión a
host
puertohostport
desde la máquina remota .
El siguiente ejemplo tuneliza 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 opción -f
background ssh y el comando remoto sleep 10
se especifica para permitir una cantidad de tiempo para iniciar el servicio que se va a tunelizar.
Ejemplo:
ssh `-N` -L 22000:localhost:11000 remote.server.com
-
-N
Después de conectarse, simplemente cuelgue allí (no obtendrá un indicador de shell)No ejecute un comando remoto.
-
-L 22000
La conexión se originará en el puerto 22000 de su personal, L máquina local -
localhost:11000
–remote.server.com
se asegurará de que el otro extremo del túnel sealocalhost
, puerto11000
Fuente: Una guía ilustrada, tutorial y procedimientos sobre tunelización ssh .
-R
-R [bind_address:]port:host:hostport
Especifica que el dado el puerto en el host remoto (servidor) se reenviará al g dado host y puerto en el lado local .
Esto funciona asignando un socket para escuchar
port
en el lado remoto, y cada vez que se establece una conexión a este puerto, la conexión se reenvía a través del canal seguro, y una conexión se hace alhost
puertohostport
desde la máquina local .
Ejemplo:
ssh -N -R 22000:localhost:11000 remote.server.com
-
-N
Después de conectarse, simplemente cuelgue allí (no obtendrá un indicador de shell)No ejecute un comando remoto.
-
-R
22000 La conexión se originará en el puerto 22000 de la R emote computer (en este caso, remote.server.com) -
su computadora personal local se asegurará de que el otro extremo del túnel sea
localhost
, puerto11000
Fuente: Una guía ilustrada, tutorial y procedimientos sobre tunelización ssh .
Comentarios
- el oído y la boca dejan en claro quién ‘ está hablando y quién ‘ está escuchando!
- ¡Me encantan tus ilustraciones!
Responder
La vinculación a interfaces de red mientras se establecen túneles SSH inversos se explica en esta publicación . Aquí hay un ejemplo con 4 computadoras que residen en dos redes diferentes: