【図解】httpプロキシサーバの仕組み(http GET/https CONNECTメソッド)や必要性・役割・メリットデメリット・DNSの名前解決の順序

プロキシサーバとは、クライアントからサーバへhttp通信する際、直接やり取りするのが好ましくない、および(もしくは) 効率的で無い場合に利用される代理応答サーバのことです。

スポンサーリンク

プロキシサーバの具体的なメリット・必要性は以下の通りです。

  1. 悪意あるユーザからの直接アクセスを防ぐことによりセキュリティを向上できる
  2. 社内のインターネットアクセスをプロキシサーバへ集中させることにより、誰がいつどのようなサイトを見ているか、といったログ情報を集中管理できる。
  3. ユーザが閲覧したサイトのコンテンツをプロキシサーバのHDD等のディスクにキャッシュし、2人目以降が同じサイトを見ようとする際にキャッシュから応答することでインターネット通信量を減らし、効率化できる

なお、一般に単にプロキシサーバと言えば、クライアントとWebサーバの間に入り、クライアントに代わりWebサーバとhttp通信するものを指しますが、実はプロキシはそれだけでなく、FTP, Radius, SIP等の様々なアプリケーションで利用されています(ただし、仕組みは一概に同じとは言えません)。

この記事では単にプロキシと呼ぶ場合はhttpプロキシを指すこととし、httpプロキシについてのみ解説します。

プロキシサーバの具体的なフローは下記の通りです。

意外と重要なポイントとしては、②③に書かれている通り、DNSとプロキシでは、プロキシ通信のほうが順序が先です。つまり、DNSによる名前解決はプロキシサーバが行います。なので、プロキシを使っている環境ではクライアント側のDNSサーバ設定を変更しても効果がありません

また、「①のクライアント⇒プロキシサーバのhttp Request」と「④のプロキシサーバ⇒Webサーバのhttp Request」の中身を確認してみましょう。ほとんど変わりませんが、以下2点で異なります。

1. TCPポート番号

80番も使うことができますが、8080や3128といったポートを使うことが多いです。

2. GETコメソッドのURI

例えば “http://www.example.com/news/index.html”のサイトを見る際は以下のように記載します。

GET /news/index.html HTTP/1.1

GETの直後の/newsがURIにあたります。

これがプロキシ接続の場合は以下のように変わります。

GET http://www.example.com/news/index.html HTTP/1.1
スポンサーリンク
スポンサーリンク

https通信のプロキシ接続

https通信時において、プロキシサーバへGETメソッドを使うことはできません。まず、httpsで使われるTLSは『通信の末端の2台間以外は通信内容が分かってはならない』というのが大前提です。それはプロキシサーバも例外ではありません。クライアントとWebサーバの通信の中身は、プロキシサーバにも見えてはならないのです

上記の通り、プロキシサーバではGETメソッドを書き換える必要がありますが、https暗号化の中身は覗けないため、書き換えることができません。なのでhttps通信についてはhttpのGETメソッドではなくCONNECTメソッドを使います

CONNECT www.google.com:443 HTTP/1.1

これを受信した後は、プロキシサーバはクライアントに「HTTP/1.1 200 Connection Established」のhttpメッセージを返し、その後はこの送信元IP:送信元ポート番号の組み合わせの通信については、TLSやhttps通信の中身には一切触れずIPヘッダとTCPヘッダを変更してWebサーバへ転送するのみになります。

スポンサーリンク

https通信のプロキシアクセスログ

https通信においては、本来アクセスログとして取得すべき領域であるGETメソッドは、TLSで暗号化されているため見ることができません。そのため、CONNECTメソッドを見ます。

ただし、GETメソッドと異なり、CONNECTメソッドは取得するファイルまではありませんので、ログもFQDNのみしか残せません。つまり、httpの場合はファイル名までログに残せますが、httpsの場合はどのファイルへアクセスしたかはログに残せずどのホストへアクセスしたかのみをログに残します

[httpの場合] GET http://www.example.com/news/index.html

[httpsの場合] CONNECT www.example.com:443

プロキシサーバによるhttps通信の傍受

前述の通り、基本的にはプロキシサーバはhttps通信の中身を覗くことができません。ただ、絶対にhttps通信を覗けないか、というと例外が2つだけ方法があります。

1つ目は、https通信したいサーバの秘密鍵をプロキシサーバに持たせることです。しかしこれは例えばgoogle.com等のインターネット上のサーバで秘密鍵をもらうことは現実的に不可能です(秘密鍵が取得できる=そのサーバの暗号化機能は簡単に取り外し、傍受できる)。社内PCから社内サーバへのアクセスに社内プロキシを使っている、などの構成であればこのような構成が可能です。

2つ目は、プロキシサーバに何でもよいのでサーバ証明書(例えばコモンネーム=proxy.hoge.com)を持たせ、https通信が来た場合はそのサーバ証明書をクライアントに提示する、という方法です。これにより一度プロキシサーバで復号化させることができます。

ただ、この場合はブラウザ上のURL(www.example.com)と証明書のコモンネーム(proxy.hoge.com)が異なるため、ブラウザ上で警告画面が出ます

サーバ証明書等のデジタル証明書の詳細については、こちらをご参照下さい

また、プロキシサーバを利用する際は通常はブラウザにプロキシ設定を入れますが、『透過型プロキシ』を導入すれば、ブラウザの設定無しにプロキシサーバを使わせることができます。

仕組みの詳細はこちらをご参照下さい

スポンサーリンク
スポンサーリンク
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク