リモート SSH ポート転送にパラメータを渡す

リモート SSH ポート転送にパラメータを渡す

図に示すように、2 つのゲートウェイの背後にリモート サーバーがあります。gw1は外部に公開されていますが、gw2は からのみアクセスできますgw1Serverは からのみアクセス可能で、これは多数の可能なサーバーの 1 つである可能性があります。 を介してポート転送を構成して、クライアント マシンから が自動的に に転送されるようにgw2します。これは問題ではありません。私は次のものを持っています:ssh4432000gw1

HostName gw1
User user
ForwardAgent yes
LocalForward 443 localhost:2000

これは完璧に動作します。次に、に するときに、2000からを経由でにgw1転送するようにします。次のようにします。443Servergw2sshgw2

HostName gw2
LocalForward 2000 Server:443

サーバーの IP は毎回異なる可能性があるので、それをパラメータとして渡す方法はありますか?

ネットワークセットアップ

答え1

ポート 2000 については気にしないものとします。目標は、ポート 443 をクライアントからサーバーに転送することだけです。また、サーバーの役割として、ホスト server1、server2、server3、... があるとします。これを .ssh/config に追加すると:

Match host server*
ProxyCommand ssh gw1 nc gw2 22
LocalForward 443 %h:443

次に、たとえばssh server1gw1 を介して gw2 に接続し、そこから 443 を server1 に転送します。

これは何をするのでしょうか。 はProxyCommandssh に、まず gw1 に接続し、標準出力を にパイプするように指示します。nc gw2 22は、そのストリームをポート 22 の gw2 に転送します。 これにより、クライアントの標準入力用のトンネルが gw1 から gw2:22 に作成されます。 次に ssh は、そのトンネルを介して 2 番目の ssh セッションを gw2 に開きます。 これが確立されると、 はLocalForwardポート 443 を server1 (%hはコマンド ラインで指定したホスト名) に転送します。

Match と ProxyCommand の詳細については、man ssh_config を参照してください。

コマンドは ですがssh server1、これは実際には gw2 までの ssh のみに接続し、そこからポート 443 を転送するだけであることに注意してください。シェルは server1 ではなく gw2 で開きます。目標はssh -N server1実際にはポートを転送することだけなので、シェルを開かないようにするには、代わりに を実行することをお勧めします。残念ながら、.ssh/config には -N に相当するものはありませんが、LocalCommand wait同じことを実現するために のようなコマンドを追加できます。シェルは中断されるまで待機するだけで、シェル プロンプトは表示されません。

関連情報