企業ネットワークにおいて、セキュリティ確保のためにプロキシサーバーを経由させることは一般的です。しかし、社内システムへのアクセスや、特定のクラウドサービス(Microsoft 365など)の利用において、すべての通信をプロキシに通すと遅延や負荷の原因となります。
そこで重要な役割を果たすのが、クライアント側で通信先に応じてプロキシを自動的に振り分ける「PACファイル」です。本記事では、PACファイルの基礎から実践的な記述方法、運用までを解説します。
PACファイルとは
PAC(Proxy Auto-Configuration)ファイルとは、Webブラウザなどのユーザーエージェントが、「どのURLにアクセスするときに、どのプロキシサーバーを使うか(あるいは使わないか)」を自動判断するためのルールが記述されたテキストファイルです。
なぜPACファイルが必要なのか
ブラウザの手動設定でプロキシを指定すると、すべての通信がそのプロキシに向かいます。しかし、以下のような要件には対応できません。
- 「社内サーバーへのアクセスは、プロキシを通さず直接接続したい」
- 「動画サイトへのアクセスだけは、別の高速な回線(プロキシ)を使いたい」
- 「メインのプロキシがダウンした時に、自動的に予備のプロキシに切り替えたい」
PACファイルを利用することで、これらを柔軟に制御し、トラフィックの最適化と冗長化を実現できます。
拡張子とMIMEタイプ
- 拡張子: 一般的に
.pacが使用されます。(WPADなどの自動検出用には.datも使われます) - MIMEタイプ: 配布するWebサーバー側で
application/x-ns-proxy-autoconfigとして設定する必要があります。
2. PACファイルの動作メカニズム
動作の流れ
ブラウザがWebサイトにアクセスしようとすると、以下の順序で処理が行われます。
- ブラウザがPACファイルを読み込む(初回またはキャッシュ有効期限切れ時)。
- PACファイル内の
FindProxyForURL関数を実行する。 - 関数が「プロキシサーバーのアドレス」や「DIRECT(直接接続)」といった文字列を返す。
- ブラウザはその指示に従って通信を開始する。
核となる関数:FindProxyForURL
PACファイルの実体は JavaScript ですが、必ず以下の関数が定義されている必要があります。
Copyfunction FindProxyForURL(url, host) {
// ここに条件分岐を記述
}
- url: アクセスしようとしている完全なURL(例:
https://www.google.com/search?q=...) - host: URLから抽出されたホスト名(例:
www.google.com)
この関数の中にロジックを書き、最終的にブラウザにどう振る舞うべきかを指示します。
3. 【実践】PACファイルの書き方と構文
基本的な戻り値
関数が return すべき文字列は以下の形式です。複数の候補をセミコロン ; で区切って記述することで、**フェイルオーバー(冗長化)**が可能になります。
DIRECT: プロキシを通さず直接接続する。PROXY host:port: 指定したプロキシサーバーを使用する。SOCKS host:port: SOCKSプロキシを使用する。
例: return "PROXY proxy1.example.com:8080; PROXY proxy2.example.com:8080; DIRECT"; (意味:まずはproxy1を試す。応答がなければproxy2を使う。それもダメなら直接接続する。)
よく使う関数とその用途
- isPlainHostName(host)
- ホスト名にドットが含まれていない場合(社内サーバーなど)に真となります。
- 例:
http://intranet/
- dnsDomainIs(host, domain)
- ホスト名が特定のドメインに所属しているか判定します。
- 例:
.google.comの判定など。
- shExpMatch(url, pattern)
- シェル形式のワイルドカード(
*や?)を使ってURLやホスト名とマッチングします。最も汎用性が高く、よく使われます。
- シェル形式のワイルドカード(
- isInNet(host, pattern, mask)
- IPアドレスが特定のネットワーク範囲内にあるか判定します。
- 注意: ホスト名の名前解決(DNSルックアップ)が発生するため、書き方によってはブラウザの動作が遅くなる原因になります。
典型的な記述例
以下は、企業でよくある「社内は直接、社外はプロキシ」という構成のサンプルです。
Copyfunction FindProxyForURL(url, host) {
// 1. 社内サーバー(ドットなしホスト名)は直接接続
if (isPlainHostName(host)) {
return "DIRECT";
}
// 2. 社内ドメイン(example.co.jp)も直接接続
if (dnsDomainIs(host, ".example.co.jp")) {
return "DIRECT";
}
// 3. ローカルホスト関連は直接接続
if (shExpMatch(host, "127.0.0.1") || shExpMatch(host, "localhost")) {
return "DIRECT";
}
// 4. 特定のIPレンジ(社内ネットワーク)宛ては直接接続
// ※IP指定でアクセスされた場合のみ有効
if (isInNet(host, "192.168.0.0", "255.255.0.0")) {
return "DIRECT";
}
// 5. それ以外(インターネット)はプロキシ経由
// メインが落ちていたらサブを使う
return "PROXY 192.168.1.10:8080; PROXY 192.168.1.11:8080";
}
4. PACファイルの配布・設定方法
PACファイルを作成したら、クライアント(PC)に読み込ませる必要があります。
手動設定
ブラウザやOSのネットワーク設定にある「自動構成スクリプトを使用する」等の項目に、PACファイルが置いてあるURLを指定します。
- 例:
http://server.example.com/proxy.pac
WPADによる自動配布
**WPAD(Web Proxy Auto-Discovery)**を利用すると、クライアント側での設定作業すら不要になります。クライアントは起動時に「自分のネットワークにプロキシ設定ファイルはあるか?」を自動で探索します。
- DHCPによる配布: DHCPサーバーのオプション252番にPACファイルのURLを設定する。
- DNSによる配布:
wpad.社内ドメインというホスト名でWebサーバーを用意し、ルートディレクトリにwpad.datという名前でPACファイルを配置する。
グループポリシー(GPO)での一括適用
Active Directory環境であれば、GPOを使って全PCにPACファイルのURLを一斉配信するのが最も確実です。
- 設定箇所:
ユーザーの構成>管理用テンプレート>Windows コンポーネント>Internet Explorer(またはEdge/Chromeのポリシー設定)
5. 運用のメリットとデメリット
メリット
- 一元管理: プロキシサーバーのIP変更などがあっても、PACファイルを書き換えるだけで全端末に反映される。
- 柔軟な制御: 「Microsoft 365の通信だけプロキシを迂回(ローカルブレイクアウト)」といった複雑なルーティングが可能。
- 冗長構成: メインプロキシ障害時に、自動的にバックアッププロキシやDIRECT接続へ切り替えられる。
デメリット
- SPOF(単一障害点): PACファイルを配布しているWebサーバーがダウンすると、誰もWeb閲覧ができなくなる可能性がある。
- パフォーマンス: 記述が非効率(過度なDNSルックアップなど)だと、すべてのWebアクセスで判定処理が走り、ブラウザの動作が重くなる。
- 記述ミス: 構文エラーがあると、インターネット接続が全断するリスクがある。
6. トラブルシューティングと注意点
構文チェックの徹底 JavaScriptの構文エラー(閉じ括弧忘れなど)があると、PACファイル全体が無効になります。配布前に必ずチェッカーツールやブラウザの開発者ツールで動作確認を行いましょう。
isInNet関数の乱用に注意 isInNet() は引数にホスト名が渡された場合、DNSサーバーへの問い合わせを行います。外部サイトへのアクセスのたびにDNS問い合わせが発生し、深刻な遅延を招くことがあります。可能な限り shExpMatch() などの文字列判定で代用するのが定石です。
file:// プロトコルの制限 セキュリティ強化のため、現代のブラウザ(Chrome, Edge等)では、ローカルディスク上のPACファイル(file://c:/proxy.pac)を指定しても読み込まれない仕様になっています。必ず http:// または https:// で配布してください。
キャッシュの挙動 ブラウザはPACファイルを一度読み込むと、一定期間キャッシュします。ファイルを更新しても即座に反映されない場合があるため、テスト時はブラウザの再起動やキャッシュクリアが必要です。
PACファイルまとめ
PACファイルは、企業のネットワーク環境においてトラフィックを交通整理するための強力なツールです。クラウドサービスの普及により、プロキシを「通す通信」と「通さない通信」の選別はますます重要になっています。
JavaScriptベースであるため柔軟な記述が可能ですが、その分、記述ミスやパフォーマンスへの配慮が求められます。
仕組みを正しく理解し、効率的で冗長性の高いネットワーク環境を構築しましょう。

