22 votos

Cómo configurar un acceso directo para una conexión SSH a través de un túnel SSH

Mi compañía de los servidores de producción (FOO, BAR...) se encuentra detrás de dos servidores de puerta de enlace (a, B). Con el fin de conectar al servidor FOO, que tengo que abrir una conexión ssh con el servidor o B con mi nombre de usuario JOHNDOE, luego de Un (a o B), puedo acceder a cualquier servidor de producción con la apertura de una conexión SSH con un estándar de nombre de usuario (vamos a llamar a WEBBY).

Así, cada vez que tengo que hacer algo como:

ssh johndoe@a
...
ssh webby@foo
...
# now I can work on the server

Como se puede imaginar, este es un engorro cuando necesito usar scp o si tengo que abrir rápidamente múltiples conexiones.

He configurado una clave ssh y también estoy usando .ssh/config para algunos accesos directos.

Me preguntaba si puedo crear algún tipo de configuración de ssh con el fin de escribir

ssh foo

y vamos a SSH abierto/reenviar todas las conexiones para mí. Es posible?

Editar

womble la respuesta es exactamente lo que yo estaba buscando, pero parece que ahora no puedo usar el netcat porque no está instalada en el servidor de puerta de enlace.

weppos:~ weppos$ ssh foo -vv
OpenSSH_5.1p1, OpenSSL 0.9.7l 28 Sep 2006
debug1: Reading configuration data /Users/xyz/.ssh/config
debug1: Applying options for foo
debug1: Reading configuration data /etc/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh a nc -w 3 foo 22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/xyz/.ssh/identity type -1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_rsa type 1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_dsa type 2
bash: nc: command not found
ssh_exchange_identification: Connection closed by remote host

9voto

Ryan Sampson Puntos 2898

Como una más concreta versión de Kyle respuesta, lo que usted quiere poner en su ~/.ssh/config archivo:

host foo
  User webby
  ProxyCommand ssh a nc -w 3 %h %p

host a
  User johndoe

Luego, al ejecutar "ssh foo", SSH intento de SSH a johndoe@a, ejecute netcat (nc), a continuación, realice una de SSH webby@foo a través de este túnel. La magia!

Por supuesto, con el fin de hacer esto, netcat necesita ser instalado en el servidor de puerta de enlace; este paquete está disponible para todos los principales de distribución y el sistema operativo.

7voto

Kyle Brandt Puntos 50907

Usted puede utilizar el ProxyCommand directiva en su ~/.ssh/config archivo, por ejemplo para usar netcat como la retransmisión:

host server2
    ProxyCommand ssh server1 nc server2 22

El que usted acaba de utilizar ssh server2'. El hombre de la página de información de la presente directiva se encuentra en 'man ssh_config'

5voto

Tom Puntos 26

Yo prefiero un enfoque diferente de la que mantiene una pre-autenticado túnel para el servidor de puerta de enlace. En ~/.ssh/config:

Host a
    ControlMaster auto
    ControlPath ~/.ssh/control-master/%r@%h:%p

A continuación, en .bashrc:

s () {
        if ( ssh -O check a 2>&1 > /dev/null 2>&1 )
        then
                ssh -t a ssh $1
        else
                if [[ -S ~/.ssh/control-master/insyte@a:22 ]]
                then
                        echo "Deleting stale socket..."
                        rm ~/.ssh/control-master/insyte@a:22
                fi
                echo "Opening master session..."
                if ssh -Nf a
                then
                         ssh -t a ssh $1
                fi
        fi
 }

Para conectarse a foo:

s foo

La primera vez que lo conecte para autenticar contra "a" y abrir un persistente, en segundo plano túnel ssh. Las llamadas posteriores a "s", se abrirá de forma casi instantánea a través de la pre-authed túnel.

Las grandes obras.

2voto

Marcin Puntos 1453

Esto se puede lograr haciendo ssh -At johndoe@a ssh webby@foo. El -A comando envía su agente ssh (así que usted puede evitar tener que volver a autenticarse en el servidor proxy), mientras que el -t asegura un terminal existe en el servidor proxy. La siguiente función bash puede ser útil:

ssh-bounce () {
    local cmd=""
    for i in "$@"; do
        cmd+="ssh -At $i "
    done
    $cmd
}

2voto

Scott Pack Puntos 11452

Este tipo de funcionalidad existe en las nuevas versiones de OpenSSH y puede ser utilizado por hacer

ssh -W server2 server1

Donde server2 es su destino y server1 es tu host proxy. Usted puede hacer esto más fácil mediante el uso de la ProxyCommand opción en su configuración de ssh, algo como:

host = *.example.com
user = packs
port = 22
ProxyCommand ssh -W %h:%p server1

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: