SCP a través de la conexión de puerta de enlace SSH

8

Mi diseño de red es algo como esto:

Ahora Alice tiene acceso a la puerta de enlace SSH (solo puerta de enlace de ahora en adelante) con:

ssh [email protected]

y el archivo de claves autorizado en la puerta de enlace se ve así

#/home/Alice/.ssh/authorized_keys
command="ssh -t alice@web" ssh-rsa ABCD...E== alice@somehost

así que cuando Alice intenta conectarse a la puerta de enlace con su clave privada, en realidad se conecta al servidor web (la PC de la puerta de enlace puede hacer una conexión al servidor web con una clave privada sin contraseña, para que permanezca transparente).

La pregunta

  1. ¿Cómo puedo configurar esto para que Alice también pueda scp cosas al servidor web?

  2. Sé que esto hace una conexión por separado, pero ¿hay alguna manera de que esto funcione como un ssh normal para que incluso algo así -R12345:localhost:22funcione?

zidarsk8
fuente

Respuestas:

10

Si desea acceder a un servidor ssh detrás de otro servidor ssh, simplemente use "ProxyCommand". Ejemplo: agregar a .ssh / config

Host Alice  
   User myLoginAtAlice # optional 
   ProxyCommand ssh -o Compression=no gateway netcat -w 90 %h %p
   ServerAliveInterval 30
   Compression yes

Host gateway
   HostName gateway.public.ip
   User myLoginAtTheGateway # optional 
   Compression yes

Luego, puede simplemente "ssh Alice" o "rsync" o "scp" directamente usando "Alice" como nombre de host. La magia está oculta para el cliente.

Esto le permite reconfigurar rápidamente su ssh en caso de que cambie la configuración / topología de su red, y simplemente cambie el .ssh / config, en lugar de cambiar cada script.

Explicación: ssh utiliza el comando dado como "comando proxy" como transporte en lugar de una conexión TCP directa. Netcat es una herramienta de red que (entre millones de otras características) simplemente redirige su stdin / stdout al host remoto especificado. Entonces, "ssh gateway nc sshserver 22" lo conecta al servidor ssh de esa máquina. % h es el nombre de host y% p es el puerto. Dicha configuración le permite especificar "Puerto N" para cambiar el puerto sin cambiar la línea de ProxyCommand.

Activo la compresión en la computadora final y deshabilito la compresión externa ya que comprimir datos cifrados o comprimidos no reduce el volumen de datos. Cualquier cambio en la configuración de compresión también es, por supuesto, opcional.

Raúl Salinas-Monteagudo
fuente
Una pregunta más, rysnc no funciona así si tengo un puerto personalizado para la máquina de la puerta de enlace. Alguna idea sobre eso.
zidarsk8
Agregue "Port port_number" a la sección correspondiente de .ssh / config. Lea las páginas de comando man ssh_config y sshd_config. Son una gran cantidad de información y pueden inspirarte mucho.
Raúl Salinas-Monteagudo
Es decir, rsync no funciona si se especifica un puerto diferente. He configurado el puerto para que la conexión funcione normalmente, pero rsync me está causando problemas.
zidarsk8
3

Tuve exactamente el mismo problema que este, pero lo puse a trabajar sin cambiar radicalmente todo.

Todo lo que hice fue agregar $ SSH_ORIGINAL_COMMAND a la puerta de enlace autorizada_claves para pasar cualquier cosa por la cadena al servidor final.

Así que esto:

#/home/Alice/.ssh/authorized_keys
command="ssh -t alice@web" ssh-rsa ABCD...E== alice@somehost

Se convierte en:

#/home/Alice/.ssh/authorized_keys
command="ssh -q -t alice@web $SSH_ORIGINAL_COMMAND" ssh-rsa ABCD...E== alice@somehost

El -q se usa para suprimir el mensaje de conexión cerrada de la máquina de punto final para que no termine en la salida local si se usa la redirección local.

Luego puede usar scp así:

scp localFileName [email protected]:/path/on/end/point/remoteFileName

Esto tiene la ventaja adicional de permitir a los usuarios pasar el comando a través de comandos al servidor de punto final y obtener el resultado en su sesión local para que puedan redirigirlos a un archivo o canalizarlos a un programa diferente.

Por ejemplo:

ssh -t [email protected] "ls -l" > tmp

Esto funciona porque parece que sshd llena la variable de entorno $ SSH_ORIGINAL_COMMAND con un comando especificado por el cliente ssh, pero no estoy seguro de por qué esto milagrosamente permite que scp pase a la máquina del punto final, así como a los comandos.

Ash Vince
fuente
0

Desafortunadamente, el reenvío de puertos no ayudaría a copiar archivos directamente desde la estación de trabajo de Alice al servidor web scp. En esta publicación SO , expliqué por qué ssh (y scp, ya que utiliza los mismos mecanismos de autenticación) no funcionarán para las conexiones reenviadas a través de ssh.

La opción sería configurar un servidor VPN en la máquina que actúe ahora como puerta de enlace SSH, conectarse a él y luego tener acceso directo a cualquier máquina detrás del firewall.

Sarga
fuente