SSH ProxyCommand ejemplo: Pasando por un host para llegar a otro servidor

¿Cómo puedo usar y saltar a través de un servidor para llegar a otro usando ssh en sistemas Linux o Unix? ¿Es posible conectarse a otro host a través de un intermediario para que el cliente pueda actuar como si la conexión fuera directa usando ssh?

Puede saltar host utilizando ProxyCommand. Algunas veces sólo puede acceder a un servidor remoto a través de ssh en iniciandosesión en un servidor intermediario (o firewall/host de salto). Así que primero se inicia sesión en el servidor intermediario y luego ssh a otro servidor. Para ello se necesita autenticarse dos veces y la cadena puede ser larga, y muchas veces no se limita a sólo dos hosts.

Ejemplo de Configuración

+-------+ +----------+ +-----------+
 | Laptop| | Jumphost | | FooServer |
 +-------+ +----------+ +-----------+

O

+-------+ +----------+ +-----------+
 | Laptop| | Firewall | | FooServer |
 +-------+ +----------+ +-----------+
 192.168.1.5 121.1.2.3 10.10.29.68

Puedo sólo puede acceder a un servidor remoto llamado ‘FooServer’ a través de ssh en un servidor intermediario llamado ‘Jumphost’. Primero, ingrese a Jumphost:

ssh carlos@Jumphost

A continuación, debo pasar por el sistema intermediario de la siguiente manera:

$ ssh carlos@FooServer

Pasar por una puerta de enlace o dos

En lugar de escribir dos comandos ssh, puedo escribir el siguiente comando todo en uno. Esto es útil para conectarse a FooServer a través de un firewall llamado ‘Jumphost’ como host de salto:

$ ssh -tt Jumphost ssh -tt FooServer
$ ssh -tt carlos@Jumphost ssh -tt carlos@FooServer
$ ssh -tt carlos@Jumphost ssh -tt carlos@FooServer htop
$ ssh -tt carlos@Jumphost ssh -tt carlos@FooServer screen -dR

Dónde,

La opción -t pasó la asignación pseudo-tty que fuerza el comando ssh. Esto se puede utilizar para ejecutar programas basados en pantalla arbitrarios en una máquina remota. Múltiples opciones -tt pueden forzar la asignación de tty, incluso si no tiene tty en el ssh local.

Saludar con ProxyCommand

La sintaxis es:

$ ssh -o ProxyCommand='ssh firewall nc remote_server1 22' remote_server1
$ ssh -o ProxyCommand='ssh carlos@Jumphost nc FooServer 22' carlos@FooServer
##########################################
## -t option is needed to run commands ###
##########################################
$ ssh -t -o ProxyCommand='ssh carlos@Jumphost nc FooServer 22' carlos@FooServer htop

El comando netcat (nc) es necesario para establecer un canal TCP entre Jumphost (o firewall) y FooServer. Ahora, mi ordenador portátil (sistema local) está conectado a FooServer mediante JumpServer. En este ejemplo, la utilidad netcat (nc) es para leer y escribir conexiones de red directamente. Se puede utilizar para pasar conexiones a un segundo servidor como FooServer.

Actualizar el archivo ~ /.ssh/config

Edite el archivo $ HOME/.ssh/config utilizando un editor de texto como vi, escriba:

$ vi ~/.ssh/config

Añada la siguiente configuración:

Host fooserver
HostName FooServer
User carlos
ProxyCommand ssh carlos@Jumphost nc %h %p

Guarde y cierre el archivo. Dónde,

  • Host fooserver: Defina el alias de su elección.
  • HostName FooServer: Defina el nombre del servidor/host remoto real.
  • Usuario carlos: Defina el nombre de usuario real para el servidor/host remoto.
  • ProxyCommand ssh carlos@Jumphost nc %h %p: Especifica el comando a utilizar para conectarse al servidor. En este ejemplo, estoy usando el comando nc. Cualquier ocurrencia de% h se sustituirá por el nombre de host para conectar, % p por el puerto y % r por el nombre de usuario remoto.

Para probar ingrese:

$ ssh fooserver

Para ver los detalles, pase la opción -v al comando ssh. Aquí hay otro fragmento:

Host server1
HostName v.server1
User root
Port 22
ProxyCommand ssh root@v.backup2 nc %h %p %r

Ahora ejecute:

$ ssh -v server1

Ejemplo de la salida:

OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug1: Reading configuration data /Users/carlos/.ssh/config
debug1: /Users/veryv/.ssh/config line 1: Applying options for server1
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: /etc/ssh_config line 102: Applying options for *
debug1: Executing proxy command: exec ssh root@v.backup2 nc v.server1 22 root
debug1: permanently_drop_suid: 501
debug1: identity file /Users/carlos/.ssh/id_rsa type 1
debug1: identity file /Users/carlos/.ssh/id_rsa-cert type -1
debug1: identity file /Users/carlos/.ssh/id_dsa type -1
debug1: identity file /Users/carlos/.ssh/id_dsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.2
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1p1 Ubuntu-2ubuntu2
debug1: match: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2 pat OpenSSH*
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5-etm@openssh.com none
debug1: kex: client->server aes128-ctr hmac-md5-etm@openssh.com none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA d2:07:84:79:21:a7:84:84:14:ef:f1:7a:84:a5:a1:7s
debug1: Host 'v.server1' is known and matches the RSA host key.
debug1: Found key in /Users/carlos/.ssh/known_hosts:37
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/carlos/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug1: Authentication succeeded (publickey).
Authenticated to v.server1 (via proxy).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending environment.
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-52-generic x86_64)

* Documentation: https://help.ubuntu.com/
Last login: Sun May 17 15:41:26 2015 from 10.70.203.6

La sintaxis sftp

La sintaxis es la siguiente:

sftp -o 'ProxyCommand=ssh %h nc firewall.dagorret.net 22' \
       -o 'HostKeyAlias=firewall.dagorret.net' \
       carlos@server1.dagorret.net

Consulte las páginas de manual para más información: ssh(1), ssh_config(5), nc(1)

Deja un comentario