質問サーバー(debian)で行われたリクエストを、sshトンネリングを使用してラップトップのポート80にトンネリングする方法を知りたいです。
問題次のコマンドを使用してトンネルを開くことができますが、希望どおりに動作しません。
ssh -R 4445:localhost:80 [email protected]
これを実行し、example.comでシェルを取得した後、次のコマンドが期待どおりに実行され、ラップトップでホストされているWebページが返されます。
wget localhost:4445
ただし、localhost:4445ではなくexample.com:4445を使用してこの同じコマンドを実行しようとすると、接続が拒否されます。
追加情報:私もshorewallを使用して転送ルールを書いてみました:
DNAT net $FW:127.0.0.1:4445 tcp 4446
そして試してみました
wget example.com:4446
上記のいずれかの場合にwgetが失敗すると、次のようになります。
--2011-02-16 13:48:26-- http://example.com:4446/
Resolving example.com... 70.90.XXX.XX
Connecting to example.com|70.90.XXX.XX|:4446... failed: Connection refused.
ここからどこへ行くべきかについてのアイデアはありますか?また、この効果を達成するための別の/より良い方法がある場合、私はその考えに完全にオープンです。
[〜#〜] edit [〜#〜]提案をありがとう!次のことを試しました。
ssh -R example.com:4445:localhost:80 [email protected]
そして
ssh -R :4445:localhost:80 [email protected]
次に、上記と同じwgetを実行すると、同じエラーが返されました。このサーバーには2つのインターフェイス(eth0 public eth1 private)があることをお伝えしておきます。
[〜#〜]編集[〜#〜]
私はバカです:(設定しなければなりませんでした
GatewayPorts yes
sshd_configで。みんな助けてくれてありがとう!
sshは、セキュリティ上の理由から、ローカルホストでリッスンする新しいトンネルを作成するように構成されています。あなたは使用する必要があります:
ssh -R :4445:localhost:80 [email protected]
Opensshのmanページから:
-R [bind_address:]port:Host:hostport
リモート(サーバー)ホストの指定されたポートを、ローカル側の指定されたホストとポートに転送することを指定します。これは、リモート側のポートをリッスンするソケットを割り当てることで機能し、このポートに接続が確立されるたびに、接続はセキュリティで保護されたチャネルを介して転送され、ローカルマシンからホストポートのホストポートに接続されます。
ポート転送は、構成ファイルで指定することもできます。特権ポートは、リモートマシンにrootとしてログインしている場合にのみ転送できます。 IPv6アドレスは、アドレスを中括弧で囲むか、別の構文[bind_address /] Host/port/hostportを使用して指定できます。
デフォルトでは、サーバーのリスニングソケットはループバックインターフェイスにのみバインドされます。これは、bind_addressを指定することでオーバーライドできます。空のbind_address、またはアドレス「*」は、リモートソケットがすべてのインターフェイスでリッスンする必要があることを示します。リモートbind_addressの指定は、サーバーのGatewayPortsオプションが有効になっている場合にのみ成功します(sshd_config(5)を参照)。
最初に覚えておくべきことは、トンネルには特定のエンドポイントがあるということです。そのエンドポイントはhaveクライアントまたはサーバーではありませんが、データはクライアントとサーバーの間にある間のみ暗号化されます。
サーバー上の接続をexample.comにトンネリングする場合は、次のコマンドを実行できます。
ssh -R 4445:example.com:80 [email protected]
サーバー上の誰でもがlocalhost:4445に接続すると、パケットは暗号化されてクライアントにトンネリングされます。クライアントから、パケットは暗号化されずにexample.com:80に送信されます。 SSHは接続プロトコルの分析を実行せず、パケットは単に一方の端に入り、もう一方の端から出ます。
1つのトンネルは1つのエンドポイントにのみ行くことができます。別の場所(example.orgなど)に移動する場合は、ssh接続を閉じて、-R 4445:example.org:80
を使用して新しい接続を作成する必要があります。 example.comとexample.orgの両方に接続する場合は、ローカルポートが異なる2つの異なるトンネル-R 4445:example.com:80 -R 4446:example.com:80
を設定する必要があります。
(非常に良い)デフォルトでは、トンネルは1つの場所(-Rトンネルの場合はサーバーのローカルホスト、-Lトンネルの場合はクライアントのローカルホスト)にのみ「到達」できます。 -Rトンネルの場合、サーバーのsshd_configファイルでGatewayPorts
を有効にすると、サーバーに接続できるすべてのユーザーのサーバーのIPアドレスをリッスンするように指示できます。
ssh -R server:4445:example.com:80 ...
次に、anyone server:4445に到達できるユーザーは、パケットを暗号化せずにサーバーに送信し、サーバーは暗号化してクライアントにトンネリングし、クライアントは暗号化せずにexample.com:80に送信します。
問題は、実際には開かれていないexample.com:4445のポートを開こうとしていることです。
Wgetコマンドまたはブラウザでexample.comを参照するときに、ローカルホストのトンネルポート4445にアクセスする場合は、/ etc/hostsファイルにエントリを追加する必要があります。
127.0.0.1 example.com
これにより、実行時にローカルホストのトンネルポートにアクセスできるようになります
wget example.com:4445
ここでトンネルを確立するのに役立つ他のことは、それを定期的に使用する場合は、.ssh/config
ファイルをセットアップして、このようなブロックを作成することです。
Host example
Hostname example.com
User someuser
LocalForward 4445 localhost:80
これにより、ssh example
を呼び出すだけで、ポート80がexample.comからlocalhost:4445にトンネリングされます。