SSH通道转发端口
背景:あるサーバーがあり、SSHサービスポートにのみアクセスでき、他のポートはセキュリティ上の理由でアクセスできません。サーバーの他のポートと通信したい場合、どうすればよいでしょうか?
SSHトンネルを利用することで、任意の通信が可能です。以下の図が非常に直感的です。
1 基本コマンド
基本コマンドは以下の通りです:
|
|
ローカルマシンとhostBのSSHトンネルを利用し、ローカルマシンのXポートを介してホストCのZポートにアクセスします。本質的には、BがCにアクセスし、トンネルを通じてローカルマシンと接続します。
2 オプションパラメータ
-N
はSSHにログインせず、ポートフォワーディングのみを行うことを示します。-f
はSSHプロセスをバックグラウンドで実行することを示します。-L
はローカルポートフォワーディングを行うことを示し、形式は:ローカルポート:ターゲットホスト:ターゲットポート
です。1つのコマンドには複数の-Lパラメータを持たせて複数のルールを表すことができます。-R
はリバースフォワーディングですが、ローカルホストとCの位置を入れ替える必要があります。例:ssh -R 8000:localhost:8080 user@ssh_server
はサーバーの8000をローカルの8080ポートに転送します。-D
はトラフィックSOCKS5プロキシです。
3 応用シナリオ
3.1 ファイアウォールの突破
背景説明です。ファイアウォールはホストAからホストBへのいくつかのポートの接続を阻止しますが、ホストBにはホストAに開放されているポートがいくつかあります。このとき、ホストAがホストB上のファイアウォールによってブロックされているポートにアクセスする必要がある場合、SSH接続でホストBに接続し、ポートフォワーディングを行うことでアクセスできます。このとき、いわゆるホストCはホストBです。
|
|
このようにしてローカルマシンの5000ポートにアクセスすると、サーバーの5000ポートにアクセスできますが、実際には5000ポートはファイアウォールによって阻止されています。
3.2 ネットワーク分割
ホストBとホストCが同じ内部ネットワークにあり、ホストBは外部と連絡を取ることができるが、ホストCはできません。このとき、内部ネットワークにないホストAがホストCにアクセスしたい場合、SSH接続でホストBに接続し、ポートフォワーディングを行うことでアクセスできます。
|
|
ホストBのipは192.168.1.11で、10.0.2.15はBの中の仮想マシンCです。ホストBがこのコマンドを実行すると、ローカルの22022ポートを介して仮想マシンの22ポートにアクセスできます。
3.3 非公開ポートへのアクセス
内部ネットワークにあるホストAは公開ネットワークにアクセスできますが、公開IPを持っていません。公開ネットワークのホストBはAを見つけることができませんが、Aに対して各ポートのアクセスを開放しています(AはBに直接接続できますが、その逆はできません)。このとき、AがBに自分をアクセスさせたい場合、SSH接続でホストBに接続し、ポートフォワーディングを行うことでアクセスできます。このとき、いわゆるホストCはホストAです。
-R
のパラメータ説明を参照してください。
3.4 動的ポートフォワーディング
一般的にプロキシとして使用され、ローカルコンピュータ上でSOCKSプロキシサーバーを作成するために使用されます。-D
パラメータを使用して作成されたSOCKSプロキシサーバーは、ローカルコンピュータ上のネットワークトラフィックをSSHトンネルを通じてリモートサーバーに転送し、ローカルコンピュータ上のアプリケーションがリモートサーバーを通じてインターネットにアクセスする機能を実現します。-D
パラメータの構文は次のとおりです:
|
|
ここで、bind_address
はバインドするIPアドレスを示し、省略可能です。port
は作成するSOCKSプロキシサーバーがリッスンするポート番号を示します。このコマンドはローカルコンピュータ上でSOCKSプロキシサーバーを起動し、そのサーバーを指定されたポートにバインドします。
例えば、ローカルコンピュータ上でSOCKSプロキシサーバーを作成し、すべてのネットワークトラフィックをリモートサーバーを通じてインターネットに転送したい場合、次のコマンドを使用できます:
|
|
このコマンドを実行した後、ローカルコンピュータ上のアプリケーション(ブラウザなど)のプロキシ設定を 127.0.0.1:1080
に設定することで、すべてのネットワークトラフィックをSSHトンネルを通じてリモートサーバーに転送し、リモートサーバーからインターネットにアクセスできます。データの安全性を保護するために、暗号化されたSSH接続を使用してSOCKSプロキシを行うことをお勧めします。