nginx ポート転送 / ssh トンネリング

nginx ポート転送 / ssh トンネリング
  • 外部からアクセス可能な静的 IP アドレスを持たないローカル ネットワーク上にコンピューター (A と呼びます) があります。(SSH ポートAAAAA)
  • Aには外部からアクセスできるようにしたいウェブサーバーがあります
  • インターネットからアクセス可能なサーバー (B) があり、Web サーバーも実行しています (ssh ポート: BBBBB)
  • Web ブラウザを搭載した任意のコンピューターから、A 経由で B 上の Web サーバーにアクセスできるようにしたいと考えています。

私は次の設定で SSH リモート トンネリングを正常に使用しています。

  • マシンAの場合:

    $> ssh -f -N -p BBBBB -R 0.0.0.0:9000:localhost:AAAAA [email protected]

  • マシンC:

    $> ssh -f -p 9000 -D 9001 -N [email protected]

  • マシンCのウェブブラウザで、manual proxy configuration SOCKS host: localhost, port 9001, SOCKS v5

これは本当にうまく機能しますが、毎回 C で SSH コマンドを起動し、Web ブラウザーで設定を変更する必要があるのは非常に面倒です...

そこで、このことを誰かに話したところ、マシン C で実行した部分をサーバー B で直接実行し、B の Web サーバー上の nginx でいくつかの Web 構成を実行することで、セットアップを簡素化できるだろうと言われました。そこで、次のことを試しました。

  • Aについては前と同じ
  • Bについて:

    $> ssh -f -p 9000 -D 9001 -N [email protected]

  • Bのnginx設定:

    $> cat /etc/nginx/sites-available/default:

upstream tunnel {
    server 127.0.0.1:9000;
}

server {
        listen 80;
        [...]
      location /A {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        proxy_pass http://tunnel;
  }
    [...]
}
server {
        listen 443 ssl;
        [...]
      location /A {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://tunnel;
  }
    [...]    
}

私の理解では、インターネットに接続されたマシン上の Web ブラウザーから、マシン A の転送ポートhttp://B.B.B.B/Aにトンネリングしてリクエストを送信し、マシン A 上の Web サーバーにアクセスできるようになります。127.0.0.1:9000

しかし、この設定には何か問題があり、接続しようとすると、http://B.B.B.B/A読み込みに長い時間 (約 1 分) がかかり、その後空白のページが表示され、次のエラー メッセージが表示されます。

SSH-2.0-OpenSSH_6.7p1 Raspbian-5+deb8u3
Protocol mismatch.

私はそのエラーを Google で少し検索し、比較的類似した問題に関する投稿をいくつか見つけましたが、正直なところ、この種のことに関する私の (非常に) 限られたスキルでは、その修正を自分のユースケースに適用しようとすると途方に暮れてしまいます... 誰か助けてくれませんか?

関連情報