気づく:私が使用しているOpenSSHクライアントは次の場所にあります。バージョン 7.2だから動作しませんRemoteCommand
書くことができる。
次の設定を想定します。
- マシンは
foo
ジャンプホストで、bar
ホストにアクセスできます。localhost:10022
bar
rdp
ホストにアクセスしてRDPポート(3389)にアクセスできるネットワーク内にあります。実際には、コマンドラインとconfigにIPを提供していますが、rdp
名前のルックアップが機能する限り、その名前を使用することは正当であると思います。簡潔さのためにrdp
。
今の目標は、rdp:3389
ホスト接続をジャンプしてアクセスを取得し、それを私が呼び出すローカルシステムに転送することです。bar
foo
localhost:33389
ssh bar
[local:33389] --> {foo} --> {bar} --> [rdp:3389]
イラスト
PuTTYを使用する前に、この問題を解決しました。
- への接続を作成し、
foo
ローカル転送を設定して-L 33389:localhost:33389
ローカルlocalhost:33389
コンピュータをにバインドlocalhost:33389
しますfoo
。 - 次のリモートコマンドを使用して、そのポートをそのポートを持つネットワーク
bar
に転送しますssh -L 33389:rdp:3389 -A bar
。 Host bar
設定存在するfoo
.ssh/config
localhost: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
いる場合:foo
localhost:10022
foo
ssh -L 33389:localhost:33389 foo ssh -t -L 33389:rdp:3389 bar
これで作業が完了するようです。
もちろんこの程度はタイピングには十分で、書いてくれればもっとすっきりしそうです。みんな設定ファイルに移動してssh bar
ローカルコンピュータに入力します。
そして RemoteCommand
OpenSSH 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
。私のローカルコンピュータ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
。
ProxyCommand
への接続が確立され、への接続を提供してfoo
いるので、これがうまくいくと思います。LocalForward
bar
私は何が間違っていましたか?
目的は、ssh bar
ローカルコンピュータに接続しbar
、同時にrdp:3389
ローカルコンピュータで使用できることですlocalhost:33389
。ssh_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
ここで使用されている)を指します。