web-dev-qa-db-ja.com

netcatモードプロキシを使用したSSHマルチホップ接続

OpenSSH 5.4以降、natcatモードと呼ばれる新機能があります。これにより、ローカルSSHクライアントのSTDINおよびSTDOUTをTCPポートからアクセス可能)にバインドできます。リモートSSHサーバー。このモードは、ssh -W [Host]:[PORT]を呼び出すだけで有効になります。

理論的には、これは、以前はProxyCommand(netcat)コマンドでよく使用されていたホストごとのSSH構成のnc設定での使用に理想的です。 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接続を開く必要はありません。

これをテストしたクライアントマシンはUbuntu11.10(x86_64)であり、プロキシホストとターゲットサーバーはどちらもDebian Wheezy Beta 3(x86_64)マシンです。

ssh target-serverを呼び出すとエラーが発生します。 -vvvフラグを付けて呼び出すと、次のようになります。

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

pdate:-vvv出力だけでなく-vが追加されました。

5
aef

私はついにこれが何であるかを知りました。 proxy-Hosttarget-serverの両方でControlMasterがオンになっている場合、OpenSSHのバグのようです。ただし、少なくとも次の2つの回避策があります。

  • proxy-Hostに接続する前に、target-serverへの接続がすでに実行されていることを確認してください。これにより、エラーが消え、すべてが期待どおりに機能します。手動でproxy-Hostに接続することでそれを行うことができます。

  • ProxyCommand ssh -o "ControlMaster no" -W %h:%p proxy-HostのようにControlMasterに対してProxyCommandを無効にします。これも問題を取り除きますが、まったく同じProxyCommandを使用するすべての接続に対してproxy-Hostへの新しい接続を作成します。

8
aef

ここでの本当の問題は、このオプションが OpenSSH 5.6 に登場したため、ControlPersistです。

Opensshサーバーを>=5.6にアップグレードするか、クライアント構成ファイルからディレクティブを削除することを検討する必要があります。

よろしく

1
frntn