
図に示すように、2 つのゲートウェイの背後にリモート サーバーがあります。gw1
は外部に公開されていますが、gw2
は からのみアクセスできますgw1
。Server
は からのみアクセス可能で、これは多数の可能なサーバーの 1 つである可能性があります。 を介してポート転送を構成して、クライアント マシンから が自動的に に転送されるようにgw2
します。これは問題ではありません。私は次のものを持っています:ssh
443
2000
gw1
HostName gw1
User user
ForwardAgent yes
LocalForward 443 localhost:2000
これは完璧に動作します。次に、に するときに、2000
からを経由でにgw1
転送するようにします。次のようにします。443
Server
gw2
ssh
gw2
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 server1
gw1 を介して gw2 に接続し、そこから 443 を server1 に転送します。
これは何をするのでしょうか。 はProxyCommand
ssh に、まず 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
同じことを実現するために のようなコマンドを追加できます。シェルは中断されるまで待機するだけで、シェル プロンプトは表示されません。