リバースSSHトンネル


8

一部のAPI統合(トロポ、ペイパルなど)をテストするために、リモートサーバーからローカルマシンに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を実行するよりもエレガントなソリューションのようです。どんな助けでも大歓迎です。ありがとう!

編集(サーバー情報の追加)

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

EDIT(nginxオプション)

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

編集(最終的なソリューションの更新)

@sciurusが指摘したようGatewayPorts yesに、sshd_configファイルで確認してください。私は最初にこの行を設定ファイルに入れましたが、/etc/init.d/ssh reload代わりに発行する必要がありましたrestart(少なくとも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)

回答:


9

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

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

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

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

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


さて、私はあなたの提案に切り替えました、そして、私curl http://server.com:8888がそうするとき、私はエラーを受け取りますcurl: (7) couldn't connect to host。それでもサーバーのシェルからlocalhost:8888をカールすると、ローカルマシンにヒットします。
クリス

ところで、私はあなたが提供した新しいコマンドを試す前にnginxを止めました。
クリス

@chrisは、サーバーのsshd_configでGatewayPortsが有効になっていますか?そうでない場合は、有効にします。トンネルを開始した後、sshがループバックアドレスだけで受信していないことを確認してください。netstatとgrepをで置き換えることができますlsof -i tcp:8888
sciurus 2011年

驚くばかり!だから私はGatewayPorts yessshd_configにいて、/etc/init.d/sshの再起動のみを行ったと思いますが、今回は再起動しましたreload。何が違うのかはわかりませんが、今は完全に機能します!! 100万人の@sciurusに感謝します。
クリス

1

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

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

upstream tunnel {
    server 127.0.0.1:7777;
}

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


ありがとう!これは実際に機能しました。可能であれば、トンネリングを機能させるためだけにnginxを使用しないほうがいいですが、それが可能であることを知っておくとよいでしょう
chris
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.