Настройка автоконфигурации прокси-сервера в браузере.

Настройка необходимых служб в linux для работы автоконфигурирования прокси-сервера в браузере.
Оригинал тут. Этот текст - краткий перевод применительно к linux.

PAC-файл:
Спецификация WPAD требует чтобы PAC-файл был назван wpad.dat

Настройка Apache Server:
1. Создаем файл .htaccess
2. Добавляем в него следующую строку:
AddType application/x-ns-proxy-autoconfig .dat
3. Выгружаем файл туда, где будет лежать wpad.dat

Настройка DHCP3-SERVER:
1. Правим файл конфигурации (обычно /etc/dhcp3/dhcpd.conf), добавляя туда строки:
option local-pac-server code 252 = text;
option local-pac-server "http://wpad.example.com:80/wpad.dat";

2. Рестартуем dhcp3-server

Настраиваем dns-сервер, назначая IP для хоста, где работает apache (в примере - wpad.example.com)

В сетевых настройках браузера выбираем "Автоматически определять настройки прокси для этой сети" (Mozilla Firefox).

Пример PAD-файла.

Пример 1:

function FindProxyForURL(url, host) {

// If URL has no dots in host name, send traffic direct.
if (isPlainHostName(host))
return "DIRECT";

// If specific URL needs to bypass proxy, send traffic direct.
if (shExpMatch(url,"*domain.com*") ||
shExpMatch(url,"*vpn.domain.com*"))
return "DIRECT";

// If IP address is internal or hostname resolves to internal IP, send direct.

var resolved_ip = dnsResolve(host);

if (isInNet(resolved_ip, "10.0.0.0", "255.0.0.0") ||
isInNet(resolved_ip, "172.16.0.0", "255.240.0.0") ||
isInNet(resolved_ip, "192.168.0.0", "255.255.0.0") ||
isInNet(resolved_ip, "127.0.0.0", "255.255.255.0"))
return "DIRECT";

// If not on a internal/LAN IP address, send traffic direct.
if (!isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0"))
return "DIRECT";

// All other traffic uses below proxies, in fail-over order.
return "PROXY 1.2.3.4:8080; PROXY 4.5.6.7:8080; DIRECT";

}

Пример 2:

function FindProxyForURL(url, host) {

// If IP address is internal or hostname resolves to internal IP, send direct.

var resolved_ip = dnsResolve(host);

if (isInNet(resolved_ip, "10.0.0.0", "255.0.0.0") ||
isInNet(resolved_ip, "172.16.0.0", "255.240.0.0") ||
isInNet(resolved_ip, "192.168.0.0", "255.255.0.0") ||
isInNet(resolved_ip, "127.0.0.0", "255.255.255.0"))
return "DIRECT";

// Use a different proxy for each protocol.
if (shExpMatch(url, "http:*")) return "PROXY proxy1.domain.com:3128";
if (shExpMatch(url, "https:*")) return "PROXY proxy2.domain.com:3128";
if (shExpMatch(url, "ftp:*")) return "PROXY proxy3.domain.com:3128";

}