今回はプロキシサーバの種類と、
その中の明示型プロキシ、通信フローについてご紹介します。
プロキシサーバの概要についてはこちら
HTTP・HTTPS通信フローについてはこちら
プロキシサーバの種類
一言にプロキシサーバと言っても、プロキシサーバには2つの種類があります。
- フォワーディングプロキシ
- リバースプロキシ
多くの企業で採用されているのはフォワーディングプロキシです。
今回はフォワーディングプロキシの方について記載していきます。
フォワーディングプロキシの種類
さらにフォワーディングプロキシにも2つの種類があります。
- 明示型プロキシ(Explicit Proxy)
- 透過型プロキシ(Transparent Proxy)
多くの場合明示型プロキシ(Explicit Proxy)が採用されています。
個人的な感覚では9:1以上の割合で、
圧倒的に多く明示型プロキシの方が採用されていると思います。
明示型プロキシと透過型プロキシの違い
明示型プロキシと透過型プロキシの一番大きな違いとしては、
クライアントが明示的にプロキシサーバを指定するかしないかにあります。
例えば、Windows10の場合は、
『設定』→『ネットワークとインターネット』→『プロキシ』から、
プロキシサーバの設定を行うことができます。
お使いのブラウザによって名称は異なるかと思いますが、
『設定』や『オプション』などからも設定することができます。
通信フローなどに細かい違いはありますが、
クライアントが明示的にプロキシサーバを指定する場合は明示型プロキシ、
一方で何も設定しない場合は透過型プロキシと、
大まかな違いがあると覚えて頂いて問題ないかと思います。
明示型プロキシのHTTP・HTTPS通信フロー
プロキシサーバの概要でも記載した通り、
プロキシサーバではHTTP(HTTPS)・FTPの通信を代理で通信を行います。
そして多くの場合はHTTP・HTTPS通信を目的として採用するケースがほとんどです。
今回は明示型プロキシを利用した際の、
HTTP・HTTPSの通信フローについてご紹介していきます。
HTTPの通信フロー(明示型プロキシあり)
明示型プロキシ利用時のHTTPの通信フローは以下のようになります。
- ユーザがアクセスしたいURLを入力
- PC⇔プロキシサーバ間で3Wayハンドシェイクを実施
- PCがプロキシサーバ宛にGETリクエストを実施
- プロキシサーバがDNSへ問い合わせ
- DNSサーバからの問い合わせ結果で宛先IPが判明
- プロキシサーバ⇔Webサーバ間で3Wayハンドシェイクを実施
- 宛先IPへGETリクエストを転送、レスポンスを転送
- ブラウザ上に表示される
図で表すとこのようになります。
パケットキャプチャでも確認します。
プロキシを利用する場合の通信フローの特徴としては、
PCはDNSによる名前解決を行わず、
いきなりプロキシサーバ宛にGETリクエストを行うことです。
DNSの名前解決はプロキシサーバにて行われます。
また、PCからプロキシサーバ向けに行われる通信において、
宛先ポート番号にはHTTPの80ではなく、
プロキシサーバのリッスンポートが使用されます。
リッスンポートはプロキシサーバ側で設定し、
PCでもプロキシサーバを指定する際に、同じ番号を設定します。
リッスンポートには3128や8080が使用されることが多いです。
これらの番号が使用されている=プロキシサーバがあるということになりますので、
セキュリティ観点からあえてこれらの番号を使用しない場合もあります。
ウェルノウンポート(1~1024)以外であれば、
基本的に好きな番号を使用することができます。
3128、8080を使用していても問題はないので、設計やセキュリティの指針次第です。
HTTP通信でキャッシュありの場合
プロキシサーバにはキャッシュ機能があり、
DNSの問い合わせ結果やWebページをキャッシュ(保持)しておくことで、
通信速度を早めることができます。
キャッシュされている場合の通信フローは以下のようになります。
- ユーザがアクセスしたいURLを入力
- PC⇔プロキシサーバ間で3Wayハンドシェイクを実施
- PCがプロキシサーバ宛にGETリクエストを実施
- プロキシサーバがキャッシュ情報を返してブラウザ上に表示される
図で表すとこのようになります。
パケットキャプチャでも確認します。
キャッシュが有効な場合はDNSサーバへ問い合わせも、
Webサーバへ通信すら行わず、PCとプロキシサーバだけで通信が完結します。
プロキシを利用しない場合のHTTP通信フローとの比較
プロキシサーバを利用しない場合のHTTPの通信フローと比較を行います。
ユーザがアクセスしたいURLを入力 | ユーザがアクセスしたいURLを入力 | |
PC⇔プロキシサーバ間で3Wayハンドシェイクを実施 | ||
PCがプロキシサーバ宛にGETリクエストを実施 | ||
PCがDNSサーバへ問い合わせ | プロキシサーバがDNSへ問い合わせ | |
DNSサーバからの問い合わせ結果で宛先IPが判明 | DNSサーバからの問い合わせ結果で宛先IPが判明 | |
PC⇔Webサーバ間で3Wayハンドシェイクを実施 | プロキシサーバ⇔Webサーバ間で3Wayハンドシェイクを実施 | |
宛先IPへGETリクエストを実施、レスポンス受信 | 宛先IPへGETリクエストを転送、レスポンス転送 | |
ブラウザ上に表示される | ブラウザ上に表示される |
HTTPSの通信フロー(明示型プロキシあり)
次にHTTPSの通信フローをご紹介します。
- ユーザがアクセスしたいURLを入力
- PC⇔プロキシサーバ間で3Wayハンドシェイクを実施
- PCがプロキシサーバ宛にCONNECT METHODを送信
- プロキシサーバがDNSへ問い合わせ
- DNSサーバからの問い合わせ結果で宛先IPが判明
- Connection Establishedを送信
- プロキシサーバ⇔Webサーバ間で3Wayハンドシェイクを実施
- PC⇔Webサーバ間でTLSハンドシェイクを実施(プロキシサーバは中継を行う)
- 宛先IPへGETリクエストを転送、レスポンスを転送(暗号化)
- ブラウザ上に表示される
図で表すとこのようになります。
パケットキャプチャでも確認します。
まずはPCはプロキシサーバ宛にCONNECT METHODを用いて通信しています。
CONNECT METHODはここ宛てにSSL/TLS通信を行いたいんだけどと、
通信の宛先を示しているようなイメージです。
用語としてもネットワークワークスペシャリスト試験で出題されるぐらいですので、
ぜひ覚えて欲しいキーワードとなります。
次に注目したポイントとしては、
TLSハンドシェイクにはプロキシサーバは関与しないこと(中継するだけ)です。
パケットキャプチャを見て頂くとわかりやすいのですが、
Client Helloや各種TLSハンドシェイクに関連するパケットが2パケットあります。
送信元IPアドレスと宛先IPアドレスを見るとPC→プロキシサーバ、
プロキシサーバ→Webサーバ、もしくはその逆となっていますので、
プロキシサーバはただ単に中継しているだけということがわかります。
HTTPS通信でキャッシュありの場合
HTTPS通信でキャッシュありの場合は以下のようになります。
- ユーザがアクセスしたいURLを入力
- PC⇔プロキシサーバ間で3Wayハンドシェイクを実施
- PCがプロキシサーバ宛にCONNECT METHODを送信
- プロキシサーバ⇔Webサーバ間で3Wayハンドシェイクを実施
- Connection Establishedを送信
- PC⇔Webサーバ間でTLSハンドシェイクを実施(プロキシサーバは中継を行う)
- 宛先IPへGETリクエストを転送、レスポンスを転送(暗号化)
- ブラウザ上に表示される
パケットキャプチャで確認してもDNS通信が行われていないことが確認できます。
DNSの問い合わせ結果がキャッシュされていることにより、
プロキシサーバはDNSサーバへ問い合わせを行っていません。
DNSの問い合わせ結果であれば、PCやルータなどもキャッシュ機能を持っていますので、
プロキシサーバを利用しない環境でも恩恵を受けることができます。
Webページの情報については暗号化されていますので、キャッシュすることができません。
プロキシサーバにてSSL/TLSを終端することで、キャッシュさせることも可能ですが、
SSL/TLSの復号・再暗号化にかかる処理負荷で高スペックが要求されます。
プロキシを利用しない場合のHTTPS通信フローの比較
プロキシサーバを利用しない場合のHTTPの通信フローと比較を行います。
ユーザがアクセスしたいURLを入力 | ユーザがアクセスしたいURLを入力 | |
PC⇔プロキシサーバ間で3Wayハンドシェイクを実施 | ||
PCがプロキシサーバ宛にCONNECT METHODを送信 | ||
PCがDNSサーバへ問い合わせ | プロキシサーバがDNSへ問い合わせ | |
DNSサーバからの問い合わせ結果で宛先IPが判明 | DNSサーバからの問い合わせ結果で宛先IPが判明 | |
PC⇔Webサーバ間で3Wayハンドシェイクを実施 | プロキシサーバ⇔Webサーバ間で3Wayハンドシェイクを実施 | |
Connection Establishedを送信 | ||
TLSハンドシェイク | TLSハンドシェイク(プロキシサーバは中継するだけ) | |
宛先IPへGETリクエストを実施、レスポンス受信(暗号化) | 宛先IPへGETリクエストを転送、レスポンス転送(暗号化) | |
ブラウザ上に表示される | ブラウザ上に表示される |
プロキシサーバ環境で間違えやすいこと
HTTP・HTTPSの通信経路と他のプロトコルの通信経路が異なることにご注意ください。
プロキシサーバ宛に通信が行われるのは、HTTP・HTTPS通信のみとなります。
FTPを対象としている場合もありますが、多くの場合はHTTP・HTTPSを対象としています。
インターネット宛に通信ができるかという確認作業として、
『8.8.8.8(Google DNS)』宛や、
『yahoo.co.jp』などのICMP応答を許可しているドメイン宛にpingを行ったりしますが、
プロキシサーバ環境化では、通信経路が異なる場合があるので、
これらの作業が確認の意味をなさない場合があるということにご注意ください。
繰り返しになりますが、
プロキシサーバ宛に通信が行われるのはHTTP・HTTPS通信のみとなります。
ICMPは対象外であるため、通常のデフォルトルートで通信が行われます。
その他にもオンライン会議などにもUDPが用いられますので、
これらの通信もプロキシサーバ宛とはなりません。
アプリケーションによっては一部通信でHTTP・HTTPSを用いている場合があります。
まとめ
- フォワードプロキシの明示型プロキシ(Explicit Proxy)が多く用いられる
- プロキシサーバを利用しない場合と通信フローが異なる
- 大きな違いは3点
- DNSの問い合わせはプロキシサーバが行う
- PCからの通信の宛先ポート番号にはリッスンポートが用いられる
- HTTPS利用時にはCONNECT METHODが用いられる
- プロキシサーバの対象となる通信はHTTP・HTTPSなので、ICMPやUDPとは通信経路が異なる
今回ご紹介した通信フローに関しては、事細かに覚える必要はありません。
こんな感じだったなと、頭の中にフックを作ってもらい、
本当に必要なときになったら検索や書籍などで確認すれば良いと思います。
このページがそのフックを作り、必要になったときに閲覧いただければ幸いです。
YouTube解説動画
【初級者〜上級者向け】プロキシサーバ利用時のHTTP・HTTPS通信フロー【Web・ネスペ対策】
その他の動画はこちら