NB:私が使用しているOpenSSHクライアントはすべてバージョン7.2、そのため RemoteCommand
は使用できません。
次の設定を想定します。
foo
はジャンプホストであり、その_localhost:10022
_を介してホストbar
へのアクセスを提供しますbar
はネットワーク内にあり、その内部でホストrdp
にアクセスし、そのRDPポート(3389)にアクセスできます。私は実際にコマンドラインと構成内でrdp
のIPを指定していますが、名前の検索が機能する限り、その名前を使用することは合法であると思います。簡潔にするために、ここではrdp
を使用しています。ここでの目的は、ジャンプホストbar
を介してfoo
に接続し、_rdp:3389
_にアクセスして、_localhost:33389
_を呼び出すローカルマシンの_ssh bar
_に転送することです。
_[local:33389] --> {foo} --> {bar} --> [rdp:3389]
_
間奏
私はこれをPuTTYで以前に次のように解決しました:
foo
への接続を作成し、ローカル転送_-L 33389:localhost:33389
_を構成して、ローカルマシンの_localhost:33389
_をfoo
の_localhost:33389
_に結び付けます。ssh -L 33389:rdp:3389 -A bar
_を渡すことにより、bar
が存在するネットワーク内にポート転送を実行します。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
_がfoo
でfoo
の_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
_を含むポートでリッスンしているものは何もありません。
ProxyCommand
がfoo
への接続を確立し、LocalForward
への接続にbar
を指定しているので、これが機能すると期待します。
何が悪いのですか?
目的は、_ssh bar
_を使用してbar
に接続し、同時に_rdp:3389
_をローカルマシンで_localhost:33389
_として使用できるようにすることです。ローカルマシン上のssh_config(5)
ファイルとfoo
を微調整できます。ただし、リモートコマンドを渡すことは有効な答えではありません。
まず、あなたの種類の設定で、何がうまくいくか、とにかく必要なもの 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
の使用方法はこちら)。