プロキシサーバ
利用者の端末の代わりに、Webサーバなどに接続して通信を中継するサーバ。通信を一か所にまとめることで、アクセスの制限、ログの記録、利用者認証、キャッシュなどを行う。
イマシルちゃんの解説
会社の端末から外部のWebサイトへ接続するとき、通信をまとめて管理したい場合があるんだ。
プロキシサーバは、利用者側に置いてWebサーバとの通信を取り次ぐサーバだよ。
端末から要求を受け取ると、接続先へ要求を送り、返ってきた応答を端末へ届けるの。
その途中で接続を許すか判断したり、アクセスの履歴を残したりできるんだ。
端末ごとに任せず共通のルールで管理できるから、組織の方針に合わない通信を制限したり、問題が起きたときに利用状況を調べたりしやすくなるよ。
この解説はわかりやすかったですか?
より深い解説
定義
プロキシサーバ(フォワードプロキシ)は、組織の内部の端末からインターネット上のWebサーバへの通信を、端末に代わって中継するサーバである。端末はプロキシサーバに接続を要求し、プロキシサーバがWebサーバに接続して、結果を端末に返す。Webサーバから見ると、通信の相手はプロキシサーバになる。
主な機能と目的
| 機能 | 目的 |
|---|---|
| アクセス制御(URLフィルタリング) | 登録したFQDNやIPアドレス宛ての通信をブロックし、業務に不要なサイトや危険なサイトへのアクセスを防ぐ |
| ログの記録 | 誰が、いつ、どのサイトにアクセスしたかの履歴を残す |
| 利用者認証 | 認証サーバと連携して、利用者を確認してから通信させる |
| キャッシュ | 一度取得したコンテンツを保存し、次の要求には保存したものを返して、通信量を減らす |
| 出口の一本化 | インターネットへの通信をプロキシサーバ経由に限定し、端末からの直接の通信をファイアウォールで遮断できる |
端末の設定
| 方法 | 内容 |
|---|---|
| 手動設定 | ブラウザやOSに、プロキシサーバのアドレスとポート番号(例:8080)を設定する |
| PACファイル | 宛先に応じて、プロキシサーバを経由するか直接接続するかを判断するスクリプトを配布する |
| WPAD | PACファイルの場所を、DHCPやDNSで自動的に見つける |
| 透過型プロキシ | 端末には設定せず、ネットワーク機器で通信をプロキシサーバに転送する |
HTTPSの中継
明示的に設定したHTTPプロキシを経由してHTTPSへ接続する場合、端末はCONNECTメソッドでトンネルの作成を要求する。HTTP/1.1の例では、要求先にホスト名とポート番号を書く。
CONNECT secure.example.net:443 HTTP/1.1
Host: secure.example.net:443
端末がまず接続する相手はプロキシである。上の443はプロキシに接続してもらうWebサーバ側のポート番号であり、端末からプロキシへ接続する待受ポートとは異なる。
| 接続区間 | 宛先の例 |
|---|---|
| 端末 → プロキシ | proxy.example.netのTCP 8080番 |
| プロキシ → Webサーバ | secure.example.netのTCP 443番 |
プロキシでは、CONNECTで要求できる接続先ポートを443番だけに限定するなどのアクセス制御を行える。この制限はトンネルの出口側に対するものであり、プロキシ自身の待受ポートを443番へ変更するという意味ではない。
プロキシが接続を確立して成功の応答を返すと、その後のデータを両方向に中継する。端末はこのトンネルを通してWebサーバとTLSハンドシェイクを行い、HTTPSの要求と応答を運ぶ。プロキシは接続先ホスト名や通信量などを把握できるが、単に中継する方式では、暗号化されたURLのパスや本文を読めない。
内容を検査するTLSインスペクションでは、プロキシが端末とのTLSを終端し、Webサーバへ別のTLS接続を作る。端末が検査用の認証局を信頼する設定などが必要であり、CONNECTを使うだけで自動的に復号できるわけではない。
認証した利用者とアクセス履歴を対応付ける
プロキシ認証とログを連携させると、接続元IPアドレスに加えて利用者IDを記録できる。DHCPでアドレスが変わる環境や複数人が共用する端末では、IPアドレスだけで個人を特定できないためである。利用者ID、時刻、接続先、許可・拒否の結果などを対応付けて保存する。
ただし、記録できる情報は中継方法によって異なる。平文のHTTP要求やTLSを終端した通信ではURLのパスも確認できるが、HTTPSをトンネルで運ぶだけなら、通常はCONNECTの接続先ホスト名とポート番号までである。ログに暗号化された本文やURLの全文まで記録できると考えない。
中継後に相手が見るアドレス
HTTPの中継では、端末からプロキシへの接続と、プロキシから外部のWebサーバへの接続を分けて考える。例えば端末が10.20.0.25、プロキシが10.20.0.10なら、外部へ接続するのは後者である。プロキシを経由することで、端末のIPアドレスがそのまま外部への接続元になるわけではない。
さらに出口のファイアウォールなどでNAPTを行う場合、外部のWebサーバがIPパケットで受け取る送信元IPアドレスは、出口で変換された値になる。SaaSの利用制限へ登録する値は、外部から実際に見える値を確認する。プロキシが同じでも出口を変更すれば値が変わる場合があり、変換と既存接続への影響はNAPTの記事で詳しく扱う。
複数の中継先を使えるようにする
プロキシを複数台用意しても、端末の設定が停止した一台を指し続ければ利用を継続できない。DNSラウンドロビンで同じ名前に複数のアドレスを対応させる方法や、PACファイルで複数の候補を返す方法がある。前者は名前解決とキャッシュ、後者は対応アプリケーションの選択・再試行の動作を確認する。
監視対象もプロキシ機能に合わせる。OSがpingへ応答していても、中継するプロセスが停止していればWeb閲覧はできない。待受けへの接続や実際の中継処理を試し、どこまで正常と判断できるかを区別する。確認方法ごとの範囲は死活監視の記事で扱う。
リバースプロキシとの違い
| フォワードプロキシ | リバースプロキシ | |
|---|---|---|
| 置く場所 | 利用者(クライアント)の側 | サーバの側 |
| 中継する通信 | 内部の端末 → 外部のサーバ | 外部の端末 → 内部のサーバ |
| 主な目的 | アクセス制御、ログ、キャッシュ | 内部のサーバの保護、負荷分散、TLSの終端 |