プロキシ自動設定( PAC ) ファイルは、Web ブラウザやその他のユーザー エージェントが特定のURLを取得するために適切なプロキシ サーバー(アクセス方法) を自動的に選択する方法を定義します。
PACファイルにはJavaScript 関数 FindProxyForURL(url, host)が含まれています。この関数は、1つ以上のアクセス方法の指定を含む文字列を返します。これらの指定により、ユーザーエージェントは特定のプロキシサーバーを使用するか、直接接続します。[1]
プロキシが応答しない場合は、複数の仕様でフォールバックが提供されます。ブラウザは、他の URL を要求する前にこの PAC ファイルを取得します。PAC ファイルの URL は手動で設定されるか、Web プロキシ自動検出プロトコルによって自動的に決定されます。
コンテクスト
最新の Web ブラウザでは、複数のレベルの自動化が実装されており、ユーザーはニーズに適したレベルを選択できます。一般的に実装されているメソッドは次のとおりです。
- 自動プロキシ選択: すべての URL に使用するホスト名とポート番号を指定します。ほとんどのブラウザでは、
localhostこのプロキシをバイパスするドメインのリスト (など) を指定できます。 - プロキシ自動構成 (PAC): 各 URL に適切なプロキシを決定する JavaScript 関数を使用して、PAC ファイルの URL を指定します。この方法は、複数の異なるプロキシ構成を必要とするラップトップ ユーザーや、多数の異なるプロキシを使用する複雑な企業設定に適しています。
- Web プロキシ自動検出プロトコル(WPAD): ブラウザがDHCPおよびDNSルックアップを通じて PAC ファイルの場所を推測できるようにします。
歴史
プロキシ自動設定ファイル形式は、もともとNetscapeが1996年にNetscape Navigator 2.0 [2]用に設計したもので、少なくとも1つのJavaScript関数を定義する テキストファイルです。
PACファイル
慣例により、PAC ファイルは通常 という名前が付けられますproxy.pac。WPAD標準ではが使用されますwpad.dat。.pacファイルには、少なくとも 1 つの関数が含まれている必要があります。
FindProxyForURL(url, host)2 つの引数と特定の形式の戻り値を持ちます。
- *は
urlオブジェクトのURLです - *は
hostそのURLから派生したホスト名です。構文的には、://最初の文字列と:それ/以降の文字列と同じ文字列です。[3] - * は
return "..."次の形式の署名の文字列です(以下の例を参照): [注 1]returnValue = type host , ":" , port ,[{ ";" , returnValue }]; type = "DIRECT" | "PROXY" | "SOCKS" | "HTTP" | "HTTPS" | "SOCKS4" | "SOCKS5" host = UTF16String (* ECMA262 互換の UTF16 文字列 *) port = UTF16String (* 数字 *)
これを使用するには、PAC ファイルをHTTP サーバーに公開し、ブラウザーのプロキシ接続設定に URL を入力するか、WPAD プロトコルを使用して、クライアント ユーザー エージェントにそのファイルを使用するように指示します。URL は、たとえば次のようにローカル ファイルを参照することもできますfile:///etc/proxy.pac。
ほとんどのクライアントは HTTP 応答で返されるMIME タイプに関係なくスクリプトを処理しますが、完全性と互換性を最大限に高めるために、HTTP サーバーはこのファイルの MIME タイプを または のいずれかとして宣言するように構成する必要がありapplication/x-ns-proxy-autoconfigますapplication/x-javascript-config。
どちらか一方の MIME タイプの使用が他方より優れているという証拠はほとんどありません。ただし、後者のタイプが最近使用されるようになったため、元の Netscape 仕様で定義されたもの
application/x-ns-proxy-autoconfigよりも多くのクライアントでサポートされるようになると想定するのは妥当でしょう。application/x-javascript-config
例
PAC ファイルの非常に単純な例は次のとおりです。
関数FindProxyForURL ( url , host ) { return 'PROXY proxy.example.com:8080; DIRECT' ; }
この関数は、ブラウザに、サーバーのポート8080 のプロキシを介してすべてのページを取得するように指示しますproxy.example.com。このプロキシが応答しない場合、ブラウザはプロキシを使用せずに Web サイトに直接接続します。プロキシを使用せずに Web サイトにアクセスする場合、ファイアウォールやその他の中間ネットワーク デバイスがプロキシ以外のソースからの要求を拒否すると、プロキシが失敗することがあります。これは、企業ネットワークで一般的な構成です。
より複雑な例では、関数で使用できるいくつかの JavaScript 関数を示しますFindProxyForURL。
function FindProxyForURL ( url , host ) { // example.com 以下のドメインのローカル URL にはプロキシは必要ありません: if ( shExpMatch ( host , '*.example.com' )) { return 'DIRECT' ; }
// このネットワーク内の URL はfastproxy.example.com のポート 8080経由でアクセスされます: if ( isInNet ( host , '10.0.0.0' , '255.255.248.0' )) { return 'PROXY fastproxy.example.com:8080' ; }
// その他のすべてのリクエストは proxy.example.com のポート 8080 を経由します。
// 応答がない場合は、WWW に直接アクセスします: return 'PROXY proxy.example.com:8080; DIRECT' ; }
デフォルトでは、PROXY キーワードは、元のリクエストのプロトコル (http、https、ftp など) に対応するプロキシが使用されることを意味します。サポートされているその他のキーワードとプロキシ タイプは次のとおりです。
- ソックス
- SOCKSプロキシを使用します。
- HTTP、HTTPS
- Firefox の最近のバージョンで導入されました。HTTP(S) プロキシを指定します。
- ソックス4、ソックス5
- Firefox の最近のバージョンで導入されました。SOCKS プロトコルのバージョンを指定します。
制限事項
PAC 文字エンコーディング
PAC スクリプトのエンコードは一般的に指定されておらず、ブラウザやネットワーク スタックによって PAC スクリプトのエンコード方法のルールが異なります。一般に、完全にASCII のPAC スクリプトはどのブラウザやネットワーク スタックでも動作します。Mozilla Firefox 66 以降では、UTF-8でエンコードされた PAC スクリプトもサポートされています。[4]
DnsResolve
この機能dnsResolve(および同様の他の機能)はDNSルックアップを実行し、DNS サーバーが応答しない場合はブラウザが長時間ブロックされる可能性があります。
myIpAddress
この関数は、ローカルホストのIPアドレスなどmyIpAddress、不正確な結果や使用できない結果を返すことがよく報告されています。 [5]
システムのホストファイル(Linuxなど)からマシンのホスト名を参照する行を削除すると役立つ場合がありますが、行は残しておく必要があります。 [要出典]127.0.0.1/etc/hosts127.0.0.1 localhost
安全
2013年、研究者はプロキシ自動設定のセキュリティリスクについて警告し始めました。[6]この脅威には、システムによって自動的に検出されたPACを使用して、被害者のブラウザトラフィックを攻撃者が管理するサーバーにリダイレクトすることが含まれます。
pac-file のもう 1 つの問題は、一般的な実装ではクリア テキストの http 取得が行われますが、これにはコード署名や Web 証明書などのセキュリティ機能が一切含まれていないことです。攻撃者は中間者攻撃を簡単に実行できます。
昔のマイクロソフトの問題
Microsoft のInternet Explorer 5.5以降では、ドメイン名によるプロキシ自動構成結果のキャッシュにより、 PAC 標準の柔軟性が制限されます。実際には、ドメイン名に基づいてプロキシを選択できますが、URL のパスに基づいて選択することはできません。代わりに、レジストリを編集して、プロキシ自動構成結果のキャッシュを無効にする必要があります。[7]
.NET 2.0 Frameworkなど、Internet Explorer PAC 構成を利用する他の Windows コンポーネントとの互換性を保つために、関数内ではホスト ドメイン名ではなく常にIP アドレスを使用することをお勧めします。たとえば、
isInNet
if ( isInNet ( host , dnsResolve ( sampledomain ), '255.255.248.0' )) {} // .NET 2.0 はプロキシを適切に解決します
if ( isInNet ( host , sampledomain , '255.255.248.0' )) {} // .NET 2.0 はプロキシを正しく解決しません
現在の規則では、PAC ファイルが利用できない場合は直接接続にフェールオーバーします。
ネットワーク構成を切り替えた直後(VPN に入るときや VPN から出るときなど)は、dnsResolveDNS キャッシュにより古い結果が返される可能性があります。
たとえば、Firefox は通常 20 個のドメイン エントリを 60 秒間キャッシュします。これは、network.dnsCacheEntriesおよびnetwork.dnsCacheExpiration構成変数を使用して設定できます。システムのDNS キャッシュsudo service dns-clean startをフラッシュすることも役立つ場合があります。これは、たとえば Linux では を使用して、Windows では を使用して実行できますipconfig /flushdns。
Internet Explorer 9 では、isInNet('localHostName', 'second.ip', '255.255.255.255')戻りtrue、回避策として使用できます。
このmyIpAddress関数は、デバイスに単一の IPv4 アドレスがあることを前提としています。デバイスに複数の IPv4 アドレスがある場合、または IPv6 アドレスがある場合、結果は未定義になります。
その他
さらなる制限は、ローカル マシン上の JavaScript エンジンに関連しています。
高度な機能
より高度な PAC ファイルを使用すると、プロキシの負荷を軽減したり、負荷分散やフェイルオーバーを実行したり、リクエストがネットワーク経由で送信される前にブラック/ホワイト リストを作成したりできます。複数のプロキシを返すこともできます。
'PROXY proxy1.example.com:80; PROXY proxy2.example.com:8080'を返します。
上記では、最初に proxy1 を試行し、利用できない場合は proxy2 を試行します。
注記
参考文献
- ^ 「プロキシ自動構成 (PAC) ファイル - HTTP | MDN」。developer.mozilla.org 2023-04-23 . 2023-07-02閲覧。
- ^ 「Navigator Proxy Auto-Config File Format」 。Netscape Navigator ドキュメント。1996 年 3 月。2007 年 6 月 2 日時点のオリジナルよりアーカイブ。2013年 7 月 5 日に取得。
- ^ 「プロキシ自動構成 (PAC) ファイル - HTTP | MDN」。2023年4月23日。
- ^ 「バグ 1492938 - プロキシ自動構成スクリプトは、有効な UTF-8 の場合は UTF-8 としてロードされ、そうでない場合は Latin-1 (1 バイトはコード ポイント) としてロードされる必要があります」 。2019年 4 月 10 日取得。
- ^ 「バグ 347307 - PAC ファイルで使用する最適なローカル IP アドレスを決定する方法が必要」 。2022年 4 月 18 日閲覧。
- ^ Lemos, Robert (2013-03-06). 「サイバー犯罪者によるブラウザプロキシの使用拡大の可能性」2016-04-20閲覧。
- ^ 「Microsoft KB 271361 - Internet Explorer で自動プロキシ キャッシュを無効にする方法」 。2024年 6 月 27 日閲覧。
外部リンク
- 「プロキシ自動構成 (PAC) ファイル」。developer.mozilla.org。2019-01-27。
- 「クライアント自動設定ファイルの使用」。Netscape Proxy Server 管理者ガイド: 第 11 章。1998 年 2 月 25 日。2004 年 8 月 10 日にオリジナルからアーカイブされました。
- 「第 26 章 - 自動構成、自動プロキシ、自動検出の使用」。Microsoft TechNet。2013年 7 月 5 日に取得。
- 「Firefox のプロキシ自動設定 (PAC)。広告防止およびアダルト防止フィルター ルールを含む、完全に機能する例」。2012 年 5 月 12 日。2015 年 7 月 1 日にオリジナルからアーカイブ。2009年 5 月 24 日に取得。
- de Boyne Pollard、Jonathan (2004)。「Web ブラウザーでのプロキシ HTTP サーバーの自動構成」。よくある質問。2013 年 7 月 5 日閲覧。
