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

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

気づく:私が使用しているOpenSSHクライアントは次の場所にあります。バージョン 7.2だから動作しませんRemoteCommand書くことができる。

次の設定を想定します。

  1. マシンはfooジャンプホストで、barホストにアクセスできます。localhost:10022
  2. barrdpホストにアクセスしてRDPポート(3389)にアクセスできるネットワーク内にあります。実際には、コマンドラインとconfigにIPを提供していますが、rdp名前のルックアップが機能する限り、その名前を使用することは正当であると思います。簡潔さのためにrdp

今の目標は、rdp:3389ホスト接続をジャンプしてアクセスを取得し、それを私が呼び出すローカルシステムに転送することです。barfoolocalhost:33389ssh bar

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

イラスト

PuTTYを使用する前に、この問題を解決しました。

  1. への接続を作成し、fooローカル転送を設定して-L 33389:localhost:33389ローカルlocalhost:33389コンピュータをにバインドlocalhost:33389しますfoo
  2. 次のリモートコマンドを使用して、そのポートをそのポートを持つネットワークbarに転送しますssh -L 33389:rdp:3389 -A bar
  3. Host bar設定存在する foo.ssh/configlocalhost:10022ジャンプホストに接続し、最終的に終了します。bar

PuTTY構成は魅力的ですが、実行にはリモートコマンドを使用します。シェルエイリアスはこの問題を解決する1つの方法ですが、クライアントがssh_config(5)使用するすべてを内部的に維持する方法があるかどうか疑問に思いますProxyCommand


上記の PuTTY 構成とほぼ同等のものは次のとおりです。

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

または、次のように構成されてHost barいる場合:foolocalhost:10022foo

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

これで作業が完了するようです。

もちろんこの程度はタイピングには十分で、書いてくれればもっとすっきりしそうです。みんな設定ファイルに移動してssh barローカルコンピュータに入力します。

そして RemoteCommandOpenSSH 7.6で導入されたように、これは非常に簡単に見えます。

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

ssh...上記の呼び出しにほぼ変換する必要があります。しかし、前述したように、私はこのセクションをサポートしていない古い(パッケージ)バージョンのOpenSSHを使用していますRemoteCommand

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

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

私のローカルコンピュータでは、単にssh bar。私のローカルコンピュータbarsudo 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

ProxyCommandへの接続が確立され、への接続を提供してfooいるので、これがうまくいくと思います。LocalForwardbar

私は何が間違っていましたか?


目的は、ssh barローカルコンピュータに接続しbar、同時にrdp:3389ローカルコンピュータで使用できることですlocalhost:33389ssh_config(5)ローカルコンピュータのファイルを調整できます。fooしかし、リモートコマンドを渡すことは有効な答えではありません。

答え1

まず、設定に応じて会議作業要件それでも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です。ただそして:

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

または同等の(ユニークな)構成:

Host bar
    ProxyJump foo
    LocalForward 33389 rdp:3389

中間ポートは必要ありません。

残念ながら、ProxyJumpはopenssh 7.3からのみ利用可能です。

しかしそれは簡単に交換ProxyCommand/-W結合あなたは以前にそれを使用していました。

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が実行されています。隠し SSH はProxyCommandまだローカルホスト上で実行されており、追加の TCP ポートの代わりにパイプペアを使用してプライマリ SSH に接続されます。ポート転送に中間ホストを含​​めようとすると、安全ではないか、競合が発生する可能性があります(fooの他のユーザーはトンネルにアクセスしたり、同じポートを使用したりできます)、エラーが発生しやすいです。可能であれば、すべての制御のために、トンネルの終わりは常にクライアントホストに残る必要があります。中間トンネルが存在しないか、次のSSHエントリポイント(-Wここで使用されている)を指します。

関連情報