SSH トンネリングを使用して制限されたサーバーにアクセスする方法
SSH トンネルを起動する方法を知っていれば、アクセスできないネットワークやシステムにアクセスできるようになります。
SSH トンネリングまたは SSH ポート転送は、クライアントとサーバー マシンの間に、サービス ポートを中継できる暗号化された SSH 接続を作成する方法です。
ポート転送を使用したローカル SSH トンネル
直接アクセスできないリソースにアクセスしたい場合は、ローカル SSH トンネルを使用できますが、アクセス権のある SSH サーバーならアクセスできます。以下にいくつかのシナリオを示します。
リモートサーバーへのプロキシ
上の画像では、青いホストは http://192.168.0.3
にアクセスできませんが、192.168.0.2 に SSH 接続できます。次の ssh コマンドを青色のホストで実行すると、青色のホストが赤色のホストにアクセスできるようになります。
ssh -L 8080:192.168.0.3:80 reduser@192.168.0.2
これで、青色のホストがブラウザを開いて http://localhost:8080
にアクセスすると、192.168.0.3 でホストされているウェブページが表示されます。
ローカルポートフォワード
上の画像では、青いホストはポート 80 で赤いホストに接続しようとしていますが、間にファイアウォールがあり、これを拒否しています。青色のホストは赤色のホストに ssh 接続できるため、そのポートにアクセスするためのローカル ポート転送 ssh トンネルを作成できます。
青色のホスト上のコマンドは次のようになります。
ssh -L 8080:192.168.0.2:80 reduser@192.168.0.2
これで、青いホストがブラウザを開いて http://localhost:8080
にアクセスすると、赤いサーバーのポート 80 にあるものはすべて表示されるようになります。
ローカルポート転送の構文
ローカル SSH ポート転送トンネルを作成する構文は次のとおりです。
ssh -L <LPORT>:<RHOST>:<RPORT> <GATEWAY>
ポート転送を備えたリモート SSH トンネル
このシナリオでは、リバース SSH トンネルを作成します。ここでは、一方向で ssh トンネルを開始し、そのトンネルを使用して逆方向の ssh トンネルを作成できます。これは、ドローン コンピュータをネットワーク内に落として「電話をかけたい」場合に便利かもしれません。その後、電話がかかってくると、確立された SSH トンネルを介して接続できます。
私たちは緑色のホスト上にいますが、青色のホストに SSH 接続したいと考えています。ただし、ファイアウォールはこの接続を直接ブロックします。青色のホストは緑色のホストに ssh 接続できるため、それを使用して接続でき、緑色のホストが青色のホストに ssh 接続したい場合は、以前に確立されたこのトンネルに沿って接続できます。
青色のホストは次のように ssh トンネルを開始します。
ssh -R 2222:localhost:22 greenuser@192.168.0.2
これにより、緑のホストでポート 2222 が開き、それが青のホストのポート 22 にポート転送されます。したがって、緑のホストがポート 2222 で自分自身に SSH 接続すると、青のホストに到達します。
これで、緑色のホストは次のように青色のホストに SSH 接続できるようになります。
ssh -p 2222 blueuser@localhost
-N オプションの使用
ssh を使用する場合、-N
フラグを指定すると、ssh 接続の確立時に ssh 接続経由でコマンドを送信する必要がないことを ssh に指示できます。このオプションは、実際にプロンプトを取得する必要がないことが多いため、トンネルを作成するときによく使用されます。
AutoSSH
autossh
コマンドは、トンネルに永続性を追加するために使用されます。この機能の役割は、ssh 接続が確立されていることを確認し、確立されていない場合は作成することです。
これは、ご存知のかもしれない autossh コマンドです。
autossh -N -i /home/blueuser/.ssh/id_rsa -R 2222:localhost:22 [email
-i /home/blueuser/.ssh/id_rsa
オプションは、証明書を使用してこの ssh 接続を認証するように指示します。
これで、トンネルがダウンすると、自動的に再接続が試行され、成功するまで試行が続けられます。再起動後も永続的にするには、ssh コマンドを cron ジョブとして追加します。