Назад | Перейти на главную страницу

Многоступенчатые SSH-соединения с прокси-сервером в режиме netcat

Начиная с OpenSSH 5.4 появилась новая функция, называемая режимом natcat, которая позволяет связывать STDIN и STDOUT локального SSH-клиента на TCP-порт, доступный через удаленный SSH-сервер. Этот режим включается простым вызовом ssh -W [HOST]:[PORT]

Теоретически это должно быть идеально для использования в ProxyCommand настройка в конфигурации SSH для каждого хоста, которая ранее часто использовалась с nc (netcat) команда. ProxyCommand позволяет вам настроить машину в качестве прокси между вашей локальной машиной и целевым SSH-сервером, например, если целевой SSH-сервер скрыт за брандмауэром.

Проблема в том, что вместо того, чтобы работать, он выдает мне в лицо загадочное сообщение об ошибке:

Bad packet length 1397966893.
Disconnecting: Packet corrupt

Вот отрывок из моей ~/.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

Как вы можете видеть здесь, я использую функцию ControlMaster, поэтому мне не нужно открывать более одного SSH-соединения для каждого хоста.

Клиентская машина, на которой я это тестировал, - это Ubuntu 11.10 (x86_64), а прокси-хост и целевой сервер - это машины Debian Wheezy Beta 3 (x86_64).

Ошибка возникает при звонке ssh target-server. Когда я звоню с -vvv flag, вот что я получаю дополнительно:

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/aef@192.0.2.195: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: ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-rsa
debug1: SSH2_MSG_KEXINIT sent
Bad packet length 1397966893.
Disconnecting: Packet corrupt

Обновить: Теперь с -vvv вместо только -v вывод.

Я наконец понял, что это такое. Кажется, это ошибка в OpenSSH, когда ControlMaster включен для обоих proxy-host и target-server. Однако есть как минимум два обходных пути:

  • Убедитесь, что уже есть работающее соединение с proxy-host прежде чем пытаться подключиться к target-server. В результате ошибка исчезнет, ​​и все будет работать должным образом. Вы можете сделать это вручную, подключившись к proxy-host.

  • Отключить ControlMaster для ProxyCommand лайк ProxyCommand ssh -o "ControlMaster no" -W %h:%p proxy-host. Это также избавит от проблемы, но создаст новое соединение с proxy-host для каждого соединения, использующего то же самое ProxyCommand.

Настоящая проблема здесь в ControlPersist так как эта опция появилась в OpenSSH 5.6.

Вам следует подумать об обновлении вашего сервера openssh до >=5.6 или просто удалите директиву из файла конфигурации вашего клиента.

С уважением