PACファイル(Proxy Auto-Configuration)完全ガイド:仕組みから記述方法、運用まで

PACファイル(Proxy Auto-Configuration)完全ガイド:仕組みから記述方法、運用まで IT用語・PC用語辞典
PACファイル(Proxy Auto-Configuration)完全ガイド:仕組みから記述方法、運用まで

企業ネットワークにおいて、セキュリティ確保のためにプロキシサーバーを経由させることは一般的です。しかし、社内システムへのアクセスや、特定のクラウドサービス(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サイトにアクセスしようとすると、以下の順序で処理が行われます。

  1. ブラウザがPACファイルを読み込む(初回またはキャッシュ有効期限切れ時)。
  2. PACファイル内の FindProxyForURL 関数を実行する。
  3. 関数が「プロキシサーバーのアドレス」や「DIRECT(直接接続)」といった文字列を返す。
  4. ブラウザはその指示に従って通信を開始する。

核となる関数: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を使う。それもダメなら直接接続する。)

よく使う関数とその用途

  1. isPlainHostName(host)
    • ホスト名にドットが含まれていない場合(社内サーバーなど)に真となります。
    • 例:http://intranet/
  2. dnsDomainIs(host, domain)
    • ホスト名が特定のドメインに所属しているか判定します。
    • 例:.google.com の判定など。
  3. shExpMatch(url, pattern)
    • シェル形式のワイルドカード(* や ?)を使ってURLやホスト名とマッチングします。最も汎用性が高く、よく使われます。
  4. 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)**を利用すると、クライアント側での設定作業すら不要になります。クライアントは起動時に「自分のネットワークにプロキシ設定ファイルはあるか?」を自動で探索します。

  1. DHCPによる配布: DHCPサーバーのオプション252番にPACファイルのURLを設定する。
  2. 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ベースであるため柔軟な記述が可能ですが、その分、記述ミスやパフォーマンスへの配慮が求められます。

仕組みを正しく理解し、効率的で冗長性の高いネットワーク環境を構築しましょう。

タイトルとURLをコピーしました