Conexões multi-hop SSH com proxy de modo netcat

5

Desde o OpenSSH 5.4 existe um novo recurso chamado natcat mode, que permite ligar STDIN e STDOUT do cliente SSH local a uma porta TCP acessível através do servidor SSH remoto. Este modo é ativado simplesmente chamando ssh -W [HOST]:[PORT]

Teoricamente, isso deve ser ideal para uso na configuração ProxyCommand em configurações de SSH por host, que costumavam ser usadas com frequência com o comando nc (netcat). ProxyCommand permite que você configure uma máquina como proxy entre sua máquina local e o servidor SSH de destino, por exemplo, se o servidor SSH de destino estiver oculto atrás de um firewall.

O problema agora é que, em vez de trabalhar, ele envia uma mensagem de erro enigmática:

Bad packet length 1397966893.
Disconnecting: Packet corrupt

Aqui está um trecho do meu ~/.ssh/config :

Host *
  Protocol 2
  ControlMaster auto
  ControlPath ~/.ssh/cm_socket/%r@%h:%p
  ControlPersist 4h

Host proxy-host proxy-host.my-domain.tld
  HostName proxy-host.my-domain.tld
  ForwardAgent yes

Host target-server target-server.my-domain.tld
  HostName target-server.my-domain.tld
  ProxyCommand ssh -W %h:%p proxy-host
  ForwardAgent yes

Como você pode ver aqui, estou usando o recurso ControlMaster para não precisar abrir mais de uma conexão SSH por host.

A máquina cliente com a qual testei isso é um Ubuntu 11.10 (x86_64) e ambos os servidores proxy e de destino são máquinas Debian Wheezy Beta 3 (x86_64).

O erro ocorre quando eu chamo ssh target-server . Quando eu chamo com o -vvv , aqui está o que eu ganho adicionalmente:

OpenSSH_5.8p1 Debian-7ubuntu1, OpenSSL 1.0.0e 6 Sep 2011
debug1: Reading configuration data /home/aef/.ssh/config
debug1: Applying options for *
debug1: Applying options for target-server.my-domain.tld
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Applying options for target-server.my-domain.tld
debug1: auto-mux: Trying existing master
debug1: Control socket "/home/aef/.ssh/cm_socket/[email protected]:22" does not exist
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh -W 192.0.2.195:22 gateway-host.my-domain.tld
debug1: identity file /home/aef/.ssh/id_rsa type -1
debug1: identity file /home/aef/.ssh/id_rsa-cert type -1
debug1: identity file /home/aef/.ssh/id_dsa type -1
debug1: identity file /home/aef/.ssh/id_dsa-cert type -1
debug1: identity file /home/aef/.ssh/id_ecdsa type -1
debug1: identity file /home/aef/.ssh/id_ecdsa-cert type -1
debug1: permanently_drop_suid: 1000
Host key fingerprint is 1a:2b:3c:4d:5e:6f:7a:8b:9c:ad:be:cf:de:ed:fe:ef
+--[ECDSA  521]---+
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+-----------------+

debug1: Remote protocol version 2.0, remote software version OpenSSH_6.0p1 Debian-3
debug1: match: OpenSSH_6.0p1 Debian-3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.8p1 Debian-7ubuntu1
debug2: fd 5 setting O_NONBLOCK
debug2: fd 4 setting O_NONBLOCK
debug3: load_hostkeys: loading entries for host "192.0.2.195" from file "/home/aef/.ssh/known_hosts"
debug3: load_hostkeys: loaded 0 keys
debug3: load_hostkeys: loading entries for host "192.0.2.195" from file "/etc/ssh/ssh_known_hosts"
debug3: load_hostkeys: found key type ECDSA in file /etc/ssh/ssh_known_hosts:49
debug3: load_hostkeys: found key type RSA in file /etc/ssh/ssh_known_hosts:50
debug3: load_hostkeys: loaded 2 keys
debug3: order_hostkeyalgs: prefer hostkeyalgs: [email protected],[email protected],[email protected],[email protected],[email protected],ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-rsa
debug1: SSH2_MSG_KEXINIT sent
Bad packet length 1397966893.
Disconnecting: Packet corrupt

Atualização: agora com -vvv em vez de apenas -v output.

    
por aef 09.11.2012 / 11:51

2 respostas

8

Eu finalmente descobri o que é isso tudo. Parece ser um erro no OpenSSH quando ControlMaster está ativo para o proxy-host e o target-server . Existem, no entanto, pelo menos estes dois contornos:

  • Verifique se já existe uma conexão em execução para o proxy-host antes de tentar se conectar ao target-server . Isso fará com que o erro desapareça e tudo funcione conforme o esperado. Você pode fazer isso conectando-se manualmente a proxy-host .

  • Desative ControlMaster para o ProxyCommand like ProxyCommand ssh -o "ControlMaster no" -W %h:%p proxy-host . Isso também eliminará o problema, mas criará uma nova conexão com proxy-host para cada conexão usando exatamente o mesmo ProxyCommand .

por 16.11.2012 / 18:06
1

O problema real aqui é o ControlPersist , já que esta opção apareceu em OpenSSH 5.6 .

Você deve considerar atualizar seu servidor openssh para >=5.6 ou simplesmente remover a diretiva do seu arquivo de configuração do cliente.

Atenciosamente

    
por 11.01.2013 / 22:36