リバースポートトンネリング


59

明日、ローカルマシンで実行されているWebサイトを誰かに見せなければなりません。通常、ローカルルーターでポートフォワーディングを使用してこれを実現しますが、ハードウェアの故障とその交換がひどいため、現在のルーターではポートフォワーディングを実行できません。

したがって、この遅延に固執し、すべてを適切なサーバーにプッシュしたくないので、SSHを介してポートを外部サーバーに転送することはできますか?

以前にポートトンネリングを行ったことがありますが、通常は正しい方法で行います。

  • リモートボックスに接続し、ローカルマシンのポート12345にポート12345が表示されるように依頼します。
  • リモートマシンのP12345で何かを開始します
  • localhost:12345経由でアクセスできます

私がやりたいこと:

  • リモートPCに接続し、そのローカルP12345 ローカルP12345から(トンネル経由で)フェッチするように依頼します
  • P12345でローカルコンピューターで何かを開始します
  • 他の人はremote:12345にアクセスして、localhost:12345を見ることができます

回答:


96

ポート80をローカルマシン(localhost)からポート8000​​のリモートホストに転送するコマンドは次のとおりです。

ssh -R 8000:localhost:80 oli@remote-machine

これには、SSHサーバーで追加の調整が必要です。次の行を追加します/etc/ssh/sshd_config

Match User oli
   GatewayPorts yes

次に、サーバーを実行して構成を再読み込みしますsudo reload ssh

この設定GatewayPorts yesにより、SSHはワイルドカードアドレスのポート8000​​をバインドするため、パブリックアドレスremote-machineremote-machine:8000)で使用可能になります。

ワイルドカードアドレスのすべてをバインドしないオプションが必要な場合は、に変更GatewayPorts yesGatewayPorts clientspecifiedます。sshデフォルトではループバックアドレスにバインドするためbind_address、ワイルドカードアドレスをバインドするには空を指定する必要があります。

ssh -R :8000:localhost:80 oli@remote-machine

:8000ならば必須であるGatewayPortsに設定されているclientspecifiedし、あなたがへのパブリックアクセスを許可したいですremote-machine:8000

関連するマニュアルの抜粋:

ssh(1)

-R [bind_address:] port:host:hostport
リモート(サーバー)ホスト上の指定されたポートが、ローカル側の指定されたホストとポートに転送されることを指定します。これは、リモート側のポートをリッスンするソケットを割り当てることで機能し、このポートへの接続が確立されるたびに、接続は安全なチャネルを介して転送され、ローカルマシンからホストポートホストポートに接続されます。デフォルトでは、サーバー上のリスニングソケットはループバックインターフェイスのみにバインドされます。これは、bind_addressを指定することでオーバーライドできます。空のbind_addressまたはアドレス「*」は、リモートソケットがすべてのインターフェイスでリッスンする必要があることを示します。リモートbind_addressの指定は、サーバーのGatewayPortsオプションが有効になっている場合にのみ成功します(sshd_config(5)を参照)。

sshd_config(5)

GatewayPorts
リモートホストがクライアント用に転送されたポートへの接続を許可されるかどうかを指定します。GatewayPortsを使用して、sshdがリモートポート転送を非ループバックアドレスにバインドできるように指定して、他のホストが接続できるようにすることができます。引数は、リモートポートフォワーディングをローカルホストのみで使用可能にする「no」、リモートポートフォワーディングをワイルドカードアドレスにバインドする「yes」、またはクライアントがアドレスを選択できるようにする「clientspecified」です。転送はバインドされています。デフォルトは「no」です。

こちらもご覧ください:


7
GatewayPortsここが魔法の弾丸でした。このかなり強力な手法を特定のユーザーに限定できるバージョンを見つけたことが気に入っています。
オリ

1
私を混乱させたのは、実際のsshコマンドを実行してリバーストンネル(ローカル)を開始するマシンにGatewayPortsを設定する必要があることです。私の考えでは、あなたが接続し、そこからリダイレクトされる場所であるため、相手(リモート)が接続を受け入れる場所を処理することは、何らかの形でより論理的でした。それを回避するために何年もかかった。
アルスマギカ14

2
@ArsMagika私はあなたを理解しているかどうかわかりません。GatewayPortsは、sshコマンドを実行するローカルマシンではなく、SSHサーバーで設定する必要があります。他のクライアントがサーバー上の転送されたポートと通信できるかどうかを構成します。
Lekensteyn

このソリューションの欠点:WebサーバーのアクセスログでクライアントのIPアドレスを特定することができなくなります。その迷惑を解決する方法はありますか?
-Twonky

@Twonkyクライアントの正確なIPアドレスを知る必要がない場合(「localhost」ではなくリモートのものである場合)、ローカルサーバーがワイルドカードアドレスをリッスンしている(つまり、任意のアドレスからの接続を受け入れている)-R :8000:127.0.1.1:80(または他の127.x.x.xアドレス)への転送を試みることができます。そうしないと、いいえ、リモートIPアドレスを学習できなくなります。
-Lekensteyn

14

サーバーにがある場合、クライアントでコマンドをGatewayPorts no実行ssh -g -L 8001:localhost:8000 oli@remote-machineした後にサーバーで実行することで同じ結果を得ることができssh -Rます。これにより、サーバー上のループバックポート8000​​がポート8001のすべてのインターフェイスでアクセス可能になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.