web-dev-qa-db-ja.com

ジャンプホスト、ssh_configファイル、および「ssh targethost」のみを介したSSHポート転送

NB:私が使用しているOpenSSHクライアントはすべてバージョン7.2、そのため RemoteCommand は使用できません。

次の設定を想定します。

  1. マシンfooはジャンプホストであり、その_localhost:10022_を介してホストbarへのアクセスを提供します
  2. barはネットワーク内にあり、その内部でホストrdpにアクセスし、そのRDPポート(3389)にアクセスできます。私は実際にコマンドラインと構成内でrdpのIPを指定していますが、名前の検索が機能する限り、その名前を使用することは合法であると思います。簡潔にするために、ここではrdpを使用しています。

ここでの目的は、ジャンプホストbarを介してfooに接続し、_rdp:3389_にアクセスして、_localhost:33389_を呼び出すローカルマシンの_ssh bar_に転送することです。

_[local:33389] --> {foo} --> {bar} --> [rdp:3389]
_

間奏

私はこれをPuTTYで以前に次のように解決しました:

  1. fooへの接続を作成し、ローカル転送_-L 33389:localhost:33389_を構成して、ローカルマシンの_localhost:33389_をfooの_localhost:33389_に結び付けます。
  2. 次のリモートコマンドを使用して、_ssh -L 33389:rdp:3389 -A bar_を渡すことにより、barが存在するネットワーク内にポート転送を実行します。
  3. _Host bar_内に_.ssh/config_が設定されているonfooは_localhost:10022_に接続し、ジャンプホストを介してbarに到達します。

PuTTY構成はチャームのように機能しますが、実行されるのはリモートコマンドに依存しています。シェルエイリアスはこれを回避する1つの方法ですが、ProxyCommandを使用して、クライアントが使用するssh_config(5)内にすべてを保持する方法があるかどうか疑問に思いました。


上記のPuTTY構成のおおよその同等物はこれです:

_ssh -L 33389:localhost:33389 foo ssh -t -L 33389:rdp:3389 -p 10022 localhost
_

または、_Host bar_がfoofooの_localhost:10022_を通過するように構成されている場合:

_ssh -L 33389:localhost:33389 foo ssh -t -L 33389:rdp:3389 bar
_

そして、これは仕事を成し遂げたようです。

しかし、もちろんこれはタイプするのに十分であり、これをallを構成ファイルに入れて、ローカルマシンで単に_ssh bar_と入力できるようにするのはすっきりします。

WithOpenSSH 7.6で導入されたRemoteCommandは、かなり簡単なようです:

_Host bar
    HostName foo
    RemoteCommand ssh -L 33389:rdp:3389 -A -p 10022 localhost
    LocalForward 33389 localhost:33389
_

...上記のsshの呼び出しに大まかに変換する必要があります。ただし、前述のとおり、私はRemoteCommandスタンザをサポートしない古い(パッケージ化された)バージョンのOpenSSHを使用しています。

これが私が達成したいことに最も近いように見える試みです。

_Host bar
    HostName localhost
    Port 10022
    ProxyCommand ssh -L 33389:localhost:33389 -W %h:%p foo
    LocalForward 33389 rdp:3389
_

ローカルマシンで単純に_ssh bar_を呼び出すという考えです。実際には、barのシェルプロンプトが表示されるという点で機能しますが、ポート転送はまったく機能しません。ローカルマシンの_Sudo lsof -i|grep 3389_は私に与えます:

_ssh       15271        accden    6u  IPv6 7933201      0t0  TCP localhost:33389 (LISTEN)
ssh       15271        accden    7u  IPv4 7933202      0t0  TCP localhost:33389 (LISTEN)
_

ジャンプホストでは、_3389_を含むポートでリッスンしているものは何もありません。

ProxyCommandfooへの接続を確立し、LocalForwardへの接続にbarを指定しているので、これが機能すると期待します。

何が悪いのですか?


目的は、_ssh bar_を使用してbarに接続し、同時に_rdp:3389_をローカルマシンで_localhost:33389_として使用できるようにすることです。ローカルマシン上のssh_config(5)ファイルとfooを微調整できます。ただし、リモートコマンドを渡すことは有効な答えではありません。

4
0xC0000022L

まず、あなたの種類の設定で、何がうまくいくかとにかく必要なもの 2つのssh:

Host foo
    LocalForward 10022:bar:22

Host bar
    Hostname localhost
    Port 10022
    LocalForward 33389 rdp:3389

term1$ ssh foo # or use ssh -f -N -o ExitOnForwardFailure=yes foo for background task
term2$ ssh bar

あなたが本当に必要とするのはRemoteCommandではありませんが、ProxyJumpは設定を本当に単純化し、目標がonlyで達成されます:

ssh -L 33389:rdp:3389 -J foo bar

または同等の(のみ)構成:

Host bar
    ProxyJump foo
    LocalForward 33389 rdp:3389

ゼロの中間ポートが必要です。

残念ながら、ProxyJumpはopenssh 7.3以降でのみ使用できます

しかし、それは ProxyCommand/-W combo 以前使用していた。

ssh -L 33389:rdp:3389 -o 'ProxyCommand=ssh foo -W %h:%p' bar 

または構成ファイルとして:

Host bar
    ProxyCommand ssh -W %h:%p foo
    LocalForward 33389 rdp:3389

まだ2つのsshが実行されています。非表示のsは、追加のtcpポートの代わりに、メインsshとのパイプのペアを使用してリンクを行うローカルホストで実行中のProxyCommandパラメータとしてのsshです。中間ホストをポート転送に参加させることは安全ではないか、衝突する可能性があり(fooの他のユーザーがトンネルにアクセスするか、同じポートを使用できる)、エラーが発生しやすくなります。トンネルの端は、可能であれば、完全に制御されている場合は常にクライアントホスト上に保持する必要があります。中間トンネルは存在しないか、次のsshエントリポイントを指す必要があります(つまり、-Wの使用方法はこちら)。

7
A.B