4 votos

El reenvío de puertos SSH no funciona en MacOS catalina (10.15)

Algo en MacOS Catalina (10.15.1) está interfiriendo con el reenvío de puertos ssh (necesario para la depuración de localhost y el desarrollo contra un sistema de servidor web desplegado en AWS).

Supongo que algo con las funciones de seguridad mejoradas, pero he sido incapaz de averiguar qué buscando y curioseando.

El túnel parece arrancar bien, pero cuando un cliente intenta conectarse la conexión es denegada. Los comandos de inicio del túnel y de la aplicación son los mismos que funcionaban bien en todas las versiones anteriores del sistema operativo, según parece, pero están fallando en esta nueva instalación 10.15 (nada portado, una nueva configuración de herramientas. He cambiado mi shell por defecto de nuevo a bash .)

Configuración de la red: Hay un servidor de redis en una VPC de AWS que no es enrutable públicamente. Tenemos un servidor de bastión que es públicamente enrutable que puede reenviar la conexión a través de ssh. Puedo conectarme al servidor del bastión para una sesión interactiva, por lo que las claves y las frases de paso están bien hasta donde yo sé. No hay VPN a AWS, por lo que el host bastión es la única manera de entrar en las subredes privadas.

Este es el comando que utilizamos para iniciar el túnel ( prodbastion se define en .ssh/config ):

ssh -v -N -L 6399:redis.<HOSTNAME>:6379 prodbastion

Esto registra verbosamente en el shell, aquí está el final del inicio de la autenticación supuestamente exitosa, seguido por las repetidas fallas de conexión del cliente

debug1: Authentication succeeded (publickey).
Authenticated to <bastionprod hostname> ([<bastion prod ip>]:22).
debug1: Local connections to LOCALHOST:6399 forwarded to remote address redis.<HOSTNAME>:6379
debug1: Local forwarding listening on ::1 port 6399.
debug1: channel 0: new [port listener]
debug1: Local forwarding listening on 127.0.0.1 port 6399.
debug1: channel 1: new [port listener]
...
debug1: channel 2: free: direct-tcpip: listening port 6399 for redis.<HOSTNAME> port 6379, connect from 127.0.0.1 port 51454 to 127.0.0.1 port 6399, nchannels 3
debug1: Connection to port 6399 forwarding to redis.<HOSTNAME> port 6379 requested.
debug1: channel 2: new [direct-tcpip]
channel 2: open failed: administratively prohibited: open failed
debug1: channel 2: free: direct-tcpip: listening port 6399 for redis.<HOSTNAME> port 6379, connect from 127.0.0.1 port 51457 to 127.0.0.1 port 6399, nchannels 3
debug1: Connection to port 6399 forwarding to redis.<HOSTNAME> port 6379 requested.
debug1: channel 2: new [direct-tcpip]
...

El cliente es una aplicación web nodejs, que necesita datos de redis. los registros allí sólo dicen más o menos no se puede conectar:

2019-12-09T17:13:51.286Z - info: Client Redis connection: {"host":"localhost","port":"6399","database":"4"}
2019-12-09T17:13:51.299Z - info: mongoose connected
2019-12-09T17:13:51.332Z - error: Redis error occured: AbortError: Ready check failed: Redis connection lost and command aborted. It might have been processed.
2019-12-09T17:13:51.473Z - error: Redis error occured: AbortError: Ready check failed: Redis connection lost and command aborted. It might have been processed.
...

Parece que tiene el mismo fallo con el sistema ssh o openssh instalado con brew.

Actualización en respuesta a las preguntas:

  • Fue mi error todo el tiempo, el nombre de host en el comando del túnel no existía pero mi historial de bash me hizo creer que sí
  • el cortafuegos estaba desactivado
  • telnet no pudo conectarse a 6399 con el túnel hasta un nombre de host malo
  • telnet (y nuestra aplicación que utiliza redis) podría conectarse con el nombre de host correcto.
  • ¡argh y perdón por la confusión!

5voto

Pirooz Puntos 486

Desde Qué es el reenvío de puertos ssh y cuál es la diferencia entre el reenvío de puertos ssh local y remoto :

He dibujado algunos bocetos túnel ssh desde local


túnel ssh que se inicia desde el remoto

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: conectar con ssh a connectToHost y reenvía todos los intentos de conexión a el local sourcePort al puerto onPort en la máquina llamada forwardToHost a la que se puede acceder desde el connectToHost máquina.

  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: conectar con ssh a connectToHost y reenvía todos los intentos de conexión a el remoto sourcePort al puerto onPort en la máquina llamada forwardToHost , al que se puede acceder desde su máquina local.

Ejemplos

Ejemplo para 1

ssh -L 8080:localhost:80 SUPERSERVER You specify that a connection made to the local port 80 is to be forwarded to port 8080 on

SUPERSERVER. Esto significa que si alguien se conecta a su ordenador con un navegador web, obtiene la respuesta del servidor web que se ejecuta en SUPERSERVER. Usted, en su máquina local, no tiene ningún servidor web funcionando.

Ejemplo para 2

ssh -R 80:localhost:8080 tinyserver You specify, that a connection made to the port 80 of tinyserver is to be forwarded to port 8080 on

su máquina local. Eso significa que si alguien se conecta al pequeño y lento con un navegador web, obtiene la respuesta del servidor web que se ejecuta en su máquina local. El servidor pequeño, que no tiene suficiente espacio de disco para el gran sitio web, no tiene ningún servidor web en funcionamiento. Pero la gente que se conecta al tinyserver lo cree.

Más ejemplos

Otras cosas podrían ser: La potente máquina tiene cinco servidores web corriendo en cinco puertos diferentes. Si un usuario se conecta a uno de los cinco servidores web en el puerto 80 con su navegador web, la solicitud es redirigida al correspondiente servidor web que se ejecuta en la máquina potente. Ese sería

ssh -R 80:localhost:30180 tinyserver1
ssh -R 80:localhost:30280 tinyserver2
etc.

O tal vez su máquina es sólo la conexión entre los poderosos y los servidores pequeños. Entonces sería (para uno de los tinyservidores que juegan a tener sus propios servidores web):

ssh -R 80:SUPERSERVER:30180 tinyserver1
ssh -R 80:SUPERSERVER:30280 tinyserver2
etc

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X