SSH通道转发端口

背景:あるサーバーがあり、SSHサービスポートにのみアクセスでき、他のポートはセキュリティ上の理由でアクセスできません。サーバーの他のポートと通信したい場合、どうすればよいでしょうか?

SSHトンネルを利用することで、任意の通信が可能です。以下の図が非常に直感的です。 SSH tunel

1 基本コマンド

基本コマンドは以下の通りです:

1
ssh -L ローカルポートX:ホストC:ホストCポートZ username@hostB

ローカルマシンとhostBのSSHトンネルを利用し、ローカルマシンのXポートを介してホストCのZポートにアクセスします。本質的には、BがCにアクセスし、トンネルを通じてローカルマシンと接続します。

技巧
実際には、このコマンドを特に記憶する必要はありません。一般的なSSHソフトウェア(xshell、tabbyなど)には対応するポートフォワーディング機能があり、グラフィカルインターフェースで直接設定できます。

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です。

1
 ssh -L 5000:localhost:5000 root@MLB -p 4701 -N

このようにしてローカルマシンの5000ポートにアクセスすると、サーバーの5000ポートにアクセスできますが、実際には5000ポートはファイアウォールによって阻止されています。

3.2 ネットワーク分割

ホストBとホストCが同じ内部ネットワークにあり、ホストBは外部と連絡を取ることができるが、ホストCはできません。このとき、内部ネットワークにないホストAがホストCにアクセスしたい場合、SSH接続でホストBに接続し、ポートフォワーディングを行うことでアクセスできます。

1
ssh -L 22022:10.0.2.15:22 desktop_user@192.168.1.11

ホスト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 パラメータの構文は次のとおりです:

1
ssh -D [bind_address:]port user@ssh_server

ここで、bind_address はバインドするIPアドレスを示し、省略可能です。port は作成するSOCKSプロキシサーバーがリッスンするポート番号を示します。このコマンドはローカルコンピュータ上でSOCKSプロキシサーバーを起動し、そのサーバーを指定されたポートにバインドします。 例えば、ローカルコンピュータ上でSOCKSプロキシサーバーを作成し、すべてのネットワークトラフィックをリモートサーバーを通じてインターネットに転送したい場合、次のコマンドを使用できます:

1
ssh -D 1080 user@ssh_server

このコマンドを実行した後、ローカルコンピュータ上のアプリケーション(ブラウザなど)のプロキシ設定を 127.0.0.1:1080 に設定することで、すべてのネットワークトラフィックをSSHトンネルを通じてリモートサーバーに転送し、リモートサーバーからインターネットにアクセスできます。データの安全性を保護するために、暗号化されたSSH接続を使用してSOCKSプロキシを行うことをお勧めします。

4 参考記事

参考記事

Buy me a coffee~
Tim 支付宝支付宝
Tim 贝宝贝宝
Tim 微信微信
0%