[HOME] [研究室] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .

WPAD (Web Proxy Auto Discovery Protocol)

Caution

標準規格にならなかったというあたりが微妙なのですが、 それでもこれくらいしか PROXY 自動設定の規格がないので、 「これを使うしかない」という消極的な解。

本当は、みんなで Service Location Protocol 対応が正しいはず。 あんま進んでないけどな〜。

概要。

ここでは自分のドメインが example.org だとしましょう。

(1) wpad.example.org という WWW サーバを作成。

(2) wpad.dat を作成。場所は WWW サーバのルート。 つまり URL

http://wpad.example.org/wpad.dat
でアクセス可能なところへファイルを作成。

ブラウザの PROXY 設定を「自動設定」に変更。

Firefox (windows) の場合: ツール → オプション → 詳細 → ネットワーク → 接続設定 → 「このネットワークのプロキシ設定を自動検出する(W)」にチェック。

IE8 の場合: ツール → インターネットオプション → 接続 → LANの設定 → 「設定を自動的に検出する(A)」にチェック。 その下にある「プロキシサーバー」の項目のチェックを外すことを忘れずに。

動作確認

起動時や設定変更時に wpad.dat を見に行くようですが、 それ以外にどのタイミングで再度読み込むのか分かりません。

wpad.dat を編集した場合、ブラウザを再起動して動作を確認してください。

なお、本来の規格では、ドメインを上に探索してくれるはず。 つまり pc.sub.example.org であれば、 「wpad.sub.example.org wpad.example.org wpad.org という順に探索する」 ことになっていたらしい。 ところが Firefox 3.0.x は wpad.sub.example.org しか探索しないらしい。 3.6.x がどう動くかは未確認。

wpad.dat の例

wpad.dat は各ドメインごとに作るものなので、 細かいことは考えず、 このくらい大味な設定で良いのだと思います( プライベートアドレスなら PROXY 使え)。

function FindProxyForURL(url, host) {
    ip_addr = myIpAddress();
    if (isInNet(ip_addr, "10.0.0.0",    "255.0.0.0")   ||
	isInNet(ip_addr, "172.16.0.0",  "255.240.0.0") ||
	isInNet(ip_addr, "192.168.0.0", "255.255.0.0") ) {
	return "PROXY proxy.example.org:3128";
 }

 return "DIRECT";
}

その他: 雑多な話題

○ 適当な設定(固定 IP な設定)の Windows さんでは、 どのドメインをサーチしてよいかが分からないので うまく動作しないのではないかと思います。 正しく設定してある OS なら別に何の問題もないんですけどね。

○ Opera は wpad.dat ではなく proxy.pac という名前でないと駄目らしいです。 wpad.dat が完成したらコピーしておきましょう。

% cp -p wpad.dat proxy.pac
と言われていますが、知るかぎり Opera で wpad は動作しません。

○ ウィルスチェッカの類は?というと、 たいていの Windows 用ソフトウエアは IE の設定を見ているので、 WPAD にしても問題なく追従してくるようです。 詳細は、よく分かりませんが、動くので大丈夫でしょう。

○ バグ: firefox 3.5.x は windows でも unix でも firefox ftp://xxx.example.org/ で起動すると WPAD を見ません。 firefox http://xxx.example.org/ で起動して、 途中から ftp:// へ飛ぶ場合は初回起動時に読み込んだ WPAD を使うので大丈夫。 コマンドラインから起動しない人たちには無関係な話ですが、BUG は BUG っす。

○ https: や ftp: に対しては、 明示的に PROXY を返さないとうまくいかない説があります。 とりあえず IE8 と Firefox 3.5.x では不要ですが…

例:

function FindProxyForURL(url, host) {
    ip_addr = myIpAddress();
    if (isInNet(ip_addr, "10.0.0.0",    "255.0.0.0")   ||
	isInNet(ip_addr, "172.16.0.0",  "255.240.0.0") ||
	isInNet(ip_addr, "192.168.0.0", "255.255.0.0") ) {

	if (shExpMatch(url, "http:*")  || 
	    shExpMatch(url, "https:*") ||
	    shExpMatch(url, "ftp:*")   ) {
	    return "PROXY proxy.example.org:3128";
	}

	return "PROXY proxy.example.org:3128";
 }

 return "DIRECT";
}

○ デバッグの仕方。そりゃ、tcpdump するに決まってますわ。

# tcpdump port 80 or port 443
(GUI じゃなきゃだめなら wireshark でも使うよろし)

リファレンス

もう、そのまんまという URL findproxyforurl.com に必要十分な情報が載ってますな。 あとは、これを見てごにょごにょしてください。

[HOME] [研究室] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .
Copyright (C) 1993-2019 Ken'ichi Fukamachi mail:< fukachan at fml.org >