質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Q&A

解決済

2回答

5774閲覧

nginxを用いたport forwardingがsshトンネル経由でうまく動かない

robotmanhogehog

総合スコア5

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

0グッド

0クリップ

投稿2020/02/01 09:05

前提・実現したいこと

実現したいこと1:自宅サーバとEC2上のインスタンスの間にVPNを貼り、インスタンス上のnginxを通して自宅サーバに展開されているサイトにアクセスできるようにしたい。
実現したいこと2:上記は単純には実装できた。が、セキュリティを確保するために誰でもアクセスできるようにすると困るので、sshトンネルで一旦EC2上にクライアント端末のportをつなげてそこを通して接続するように設定したい。

実装方法1:実現したいこと1は単純に自宅サーバとEC2上にopenvpnを貼ってnginxの設定を下記のようにconf.dに記述して実現

server { listen 80; server_name [EC2インスタンスのipアドレス]; location / { proxy_pass http://[自宅のipアドレス]; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_http_version 1.1; proxy_redirect off; proxy_buffering off; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 86400; } }

実現方法2:実現したいこと2はインスタンスの接続可能設定を22番ポート(ssh)のみ可能にawsセキュリティグループから設定し、クライアント端末から下記のコマンドで接続を試みる。(意図としてはクライアント端末の8889番をインスタンス80番につなげて、そこからnginxに自宅サーバにつないでほしかった)

ssh ubuntu@[EC2インスタンスのipアドレス] -L 8889:localhost:80

発生している問題・エラーメッセージ

ブラウザからlodalhost:8889に接続するとnginxのデフォルトのwelcomeページが表示されてしまう。

試したこと

やりたいこと2のsshトンネルをほって接続する方式ではなく、インスタンスのipに直接アクセスしてnginxに運んでもらうのはうまくいって自宅サーバ上のサイトが表示されます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まずhttpのバーチャルホストの仕組を理解した方がいいと思います。

例えばウェブブラウザで http://www.example.com/some/where/ にアクセスした場合、ウェブブラウザはサーバに接続した後以下のようなリクエストを送信します。

GET /some/where/ HTTP/1.1 Host: www.example.com [その他のヘッダ] [改行のみの行]

サーバはこの Host ヘッダを見てどのホスト名でアクセスに来たかを知り、適切なコンテンツを返します。
nginxも Host ヘッダを見て、server_name が一致するバーチャルホスト設定に従って処理を行います。

さて、sshトンネル経由で接続した場合ですが、ウェブブラウザでは http://localhost:8889/ にアクセスします。
この時に送られる Host ヘッダは localhost:8889 となり、ssh はこのヘッダを書き換えたりしないのでそのままサーバに送られます。

一方、サーバ側の設定では

server_name [EC2インスタンスのipアドレス];

となっているので、Hostヘッダとserver_nameが違うのでこの設定は使われず、デフォルトのバーチャルホスト設定が使われます。
なので server_name を localhost に変更すればよさそうなのですが、手元で試した範囲ではうまく動きませんでした。
どうも IPv6 が関係していると思われます。

ssh で -L 8889:localhost:80 とした場合、ローカルのポート 8889 にアクセスするとサーバの localhost のポート 80 に接続する事になります。この時 localhost は IPv6 の ::1 と IPv4 の 127.0.0.1 の二つのアドレスを持っているので、まず IPv6 の ::1 に接続を行おうとし、接続できなかった場合は 127.0.0.1 に接続するという動作になります。

一方、nginx では listen 80; とした場合は IPv4 アドレスのみが対象となるようでした。なので

listen [::1]:80; server_name localhost;

というように listen で IPv6 アドレスを指定するか、

ssh ubuntu@[EC2インスタンスのipアドレス] -L 8889:127.0.0.1:80

のように IPv4 アドレスへ接続するように指定する必要が有りました。

私は nginx の動作に詳しくないので、詳しい方がいましたら訂正/補足をお願いします。

ただ、提示されたログを見ると

127.0.0.1 - - [01/Feb/2020:08:40:54 +0000] "GET /tree HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"

と 127.0.0.1 からの接続として記録されているので、単純に server_name を localhost にするだけでも大丈夫かもしれません。

投稿2020/02/12 03:19

doda

総合スコア947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

robotmanhogehog

2020/02/13 17:11

うおおおおおおすごいいけました神です。 server_name localhost;の記述でドンピシャでした。すごすぎる 感動で震えています。 > となっているので、Hostヘッダとserver_nameが違うのでこの設定は使われず、デフォルトのバーチャルホスト設定が使われます。 > なので server_name を localhost に変更すればよさそうなのですが、手元で試した範囲ではうまく動きませんでした。 このあたりのことぜんぜんにわかっていませんでした。ありがとうございます
guest

0

nginx のログには、どのように記録されていますか?

気になったのは、nginx の設定が、

server {

listen 80; server_name [EC2インスタンスのipアドレス];

となっていて、「EC2インスタンスのipアドレス」 にアクセスがあった際に proxy_pass していますが、ssh は、 localhost に接続しています。違うバーチャルホストに接続しているように見えます。

投稿2020/02/01 11:28

CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

robotmanhogehog

2020/02/02 12:48

nginxのログ(/var/log/access.log)へsshトンネル経由でwelcomページが表示されてしまった際のログは下記のとおりとなっています。 ``` 127.0.0.1 - - [01/Feb/2020:08:40:54 +0000] "GET /tree HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36" ``` > となっていて、「EC2インスタンスのipアドレス」 にアクセスがあった際に proxy_pass していますが、ssh は、 localhost に接続しています。違うバーチャルホストに接続しているように見えます。 私の理解ですと、sshのコマンド自体はEC2のインスタンスipに接続をして、localhostの8889番portを相手の80番につなげているという理解なので、違うバーチャルホストに接続しているように見えますというのはどこの記述を見てそう思うにいたったのでしょうか?ネットワークの素人でまったく申し訳ないです。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問