web-dev-qa-db-ja.com

リバースSSHトンネル

一部のAPI統合(tropo、Paypalなど)をテストするために、リモートサーバーからローカルマシンにWebトラフィックを転送しようとしています。基本的に、私はtunnlr.comが提供するものと同様のものをセットアップしようとしています。

コマンドでSSHトンネルを開始しました

_$ssh –nNT –R :7777:localhost:5000 user@server_

次に、サーバーがポート7777でリッスンしていることがわかります。

_user@server:$netstat -ant | grep 7777_

_tcp        0      0 127.0.0.1:7777          0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:7777                :::*                    LISTEN  


$user@server:curl localhost:7777
Hello from local machine
_

これでうまくいきます。 curlリクエストは実際にはローカルマシンから提供されます。

さて、どうすればserver.com:8888をそのトンネル経由でルーティングできるようになりますか?

私はそのようにnginxを使ってみました:

_upstream tunnel {
    server 0.0.0.0:7777;
}
server {
  listen 8888;
  server_name server.com;
  location / {
    access_log /var/log/nginx/tunnel-access.log;
    error_log /var/log/nginx/tunnel-error.log;
    proxy_pass http://tunnel;
    proxy_set_header Host $Host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_redirect off;
  }
}
_

私が見るnginxエラーログから:

[error] 11389#0: *1 connect() failed (111: Connection refused)

iptablesの使用を検討してきましたが、まだ進歩していません。 iptablesは、トンネリングのためだけにnginxを実行するよりもエレガントなソリューションのようです。どんな助けでも大歓迎です。ありがとう!

[〜#〜] edit [〜#〜](サーバー情報の追加)

サーバーの詳細:Ubuntu 10.10 maverick(標準インストール)

[〜#〜] edit [〜#〜](nginxオプション)

@Marcel Gが示唆したように、nginxオプションは0.0.0.0:7777から127.0.0.1:7777に変更されました。それでも非nginxソリューションを探しています。

[〜#〜] edit [〜#〜](最終的なソリューションの更新)

@sciurusが指摘したように、sshd_configファイルの_GatewayPorts yes_を確認してください。最初は設定ファイルにこの行がありましたが、restartではなく_/etc/init.d/ssh reload_を発行する必要がありました(少なくとも、ubuntuではそのように見えます)。

ローカルマシンで使用される最後のコマンド:_ssh -nNT -R '*:8888:localhost:5000' user@server_

次に、サーバーは*:8888で_lsof -i tcp:888_を使用してリッスンしていることを示す必要があります

_user@server:~$ Sudo lsof -i tcp:8888
COMMAND   PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd    14711 user    8u  IPv4 1791013      0t0  TCP *:8888 (LISTEN)
sshd    14711 user    9u  IPv6 1791014      0t0  TCP *:8888 (LISTEN)
_
8
chris

Nginxを使用する必要はありません。

Sshデーモン構成(/ etc/ssh/sshd_configである必要があります)にGatewayPortsclientspecifiedに設定し、再読み込みします。これは、他のシステムがトンネルに接続できるようにするために必要です。これがないと、サーバーで実行されているプログラムだけが使用できます。

あとは、ポート7777ではなくポート8888でリッスンするようにsshコマンドを変更するだけです。これは次のようになります。

ssh -nNT -R '*:8888:localhost:5000' user@server

アスタリスクは、ループバックインターフェイスだけでなく、すべてのインターフェイスでポート8888をリッスンするようにsshdに指示します。 GatewayPortsを変更していない場合、これは失敗します。

9
sciurus

私はsciurusの答えを2番目にしますが、何らかの理由でnginxを使用する必要がある場合...私の推測では、上流の定​​義が壊れています。

Ssh逆トンネルを作成する方法は、ローカルホスト(127.0.0.1および:: 1)でのみリッスンするため、次の上流の定義を試してみるとよいでしょう。

upstream tunnel {
    server 127.0.0.1:7777;
}

参考までに、私はまだnginxを自分で構成したことがないので、これは推測にすぎません。

1
Marcel G