Proxy Auto Configuration (PAC)

Proxy Auto Configuration (PAC)


В рунете мало информации об такой замечательной вещи как «Автоматическая настройка прокси сервера». В этой статье я постараюсь подробно остановиться на данном вопросе.

Суть технологии заключается в том, что браузер читает специальный файл написаный на языке Javascript, в котором определена только одна функция:

function FindProxyForURL(url, host)
{
 ...
}

где,
url – полный URL запрашиваемого документа
host – имя поста извлекаемое из URL. Этот параметр необходим только для удобства. Он содержит всё от :// и до первого / или :. Номер порта не включается в этот параметр.

Функция возвращает строку содержащую один или несколько способов доступа к запрашиваемому документу. Формат строки следующий:

null — если строка null, то использовать прокси сервер не нужно;
DIRECT — прямое соединение без использования прокси;
PROXY host:port — определяет какой прокси сервер необходимо использовать;
SOCKS host:port — определяет SOCKS сервер который необходимо использовать.

Строка может содержать несколько приведенных выше параметров разделенных точкой с запятой. Тогда браузер будет перебирать их по очереди пока не найдёт доступный прокси сервер.
В главной функции могут быть вызваны следующие функции:
  • isPlainHostName(host) возвращает true если строка host не содержит точек ("."). 
  • dnsDomainIs(hostdomain) вернет true если domain принадлежит host
  • localHostOrDomainIs(hosthostdomain) возвращает true если строка host (имя хоста или домена) содержится в строке hostdomain
  • isResolvable(host) возвращает true если возможно определить IP адрес для заданной строки host
  • isInNet(hostpatternmask) возвращает true если IP адрес или имя хоста в строке host соответствует шаблону pattern и маске mask
  • dnsResolve(host) возвращает IP адрес для заданного host
  • myIpAddress() возвращает IP адрес компьютера
  • dnsDomainLevels(host) возвращает количество точек в строке host. Другими словами уровень домена
  • shExpMatch(strshellexp) вернет true если строка str соответствует регулярному выражению в строке shellexp (формат регулярных выражений shellexp, а не regexp). Например shExpMatch("a/b/c","*/b/*") вернет true
  • weekdayRange(wd1 [, wd2 ][, "GMT"]) вернет true если текущая дата или дата заданная в параметре GTM, соответствует заданному дню недели или диапазону дней. Дни недели записываются в закавыченной строке из следующих вариантов (SUN|MON|TUE|WED|THU|FRI|SAT)
  • dateRange([day1] [,month1] [,year1] [,day2] [,month2] [,year2] [,"GMT"]) вернет true если текущая дата или дата заданная в параметре GTM попадает в указанный диапазон. Название месяца задается закавыченной строкой из следующих вариантов (JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)
  • timeRange(hour1minute1second1hour2minute2second2 [, "GMT"])
  • timeRange(hour1minute1hour2minute2 [, "GMT"])
  • timeRange(hour1hour2 [, "GMT"])
  • timeRange(hour [, "GMT"])

Браузеры Firefox и Internet Explorer поддерживает только системную кодировку в PAC файле и не поддерживают Unicode кодировки, такие как UTF-8.

Приведу небольшой пример:

function FindProxyForURL(url, host)
{
 if (isPlainHostName(host) || dnsDomainIs(host, ".mydomain.com"))
  return "DIRECT";
 else if (shExpMatch(host, "*.com"))
  return "PROXY proxy1.mydomain.com:8080; " +
   "PROXY proxy4.mydomain.com:8080";
 else if (shExpMatch(host, "*.edu"))
  return "PROXY proxy2.mydomain.com:8080; " +
   "PROXY proxy4.mydomain.com:8080";
 else
  return "PROXY proxy3.mydomain.com:8080; " +
   "PROXY proxy4.mydomain.com:8080";
}


Данный скрип говорить устанавливать браузеру прямое соединение для локальных хостов или под доменов домена .mydomain.com. Для доменов из зоны .com используются прокси серверы 1 и 4, для доменов из зоны .edu прокси 2 и 4 ну и для всех оставшихся вариантов прокси 3 и 4.

Теперь остановлюсь на вопросе как указать браузеру использовать автоматическую конфигурацию прокси серверов. Для этого есть несколько вариантов:
  • Задать адрес скрипта вручную. Скрипт выкладывается на сервер доступный для пользователя. Обычно имя скрипта proxy.dat, однако если следовать спецификации WPAD скрипт следует назвать wpad.dat. Так же сервер должен отдавать файл с MIME типом application/x-ns-proxy-autoconfig
  • Второй способ WPAD метод основанный на DNS. Подробнее можно прочесть по ссылке ru.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol
  • И третий способ WPAD, основанный на DHCP. WPAD просто выдает PAC скрипт с выбранный номером 252 в «аренду» запросившему IP. Браузер получает URL скрипта и просто качает его по ссылке. Для этого необходимо:
    1. Добавим в /etc/dhcp/dhcpd.conf следующие строчки.
      option local-pac-server code 252 = text;
      option local-pac-server "wpad.example.com:80/wpad.dat\000";
    2. Перезапустите DHCP сервер.
    Небольшой нюанс — у DHCP приоритет выше, чем у DNS, как следствие — гораздо быстрее. И можно вместо имени сайта указать его IP, в этом случае отсутствуют расходы времени на преобразование адреса в имя, что добавляет скорости. 

Настройка браузеров. В параметрах программы нужно указать определение прокси-сервера:
  1. В браузере Explorer
    Сервис -> Свойства обозревателя -> Подключения -> Настройка сети
    поставить галочку напротив опции «Автоматическое определение параметров»
    или поставить галочку напротив опции «Использовать сценарий автоматической настройки» и в поле «Адрес» написать путь до PAC файла. Например: wpad.example.com:80/wpad.dat
  2. В браузере Opera 
    Настройки -> Дополнительно -> Сеть -> Прокси-серверы
    поставить галочку напротив опции «Автоматическая конфигурация прокси-сервера» и в поле «Адрес» написать путь до PAC файла.
  3. В браузере Firefox
    Инструменты->Настройки->Дополнительно->Сеть->Соединение(Настроить)
    выберать опции «Автоматически определять настройки прокси для этой сети»
    или выберать опцию «URL автоматической настройки сервиса прокси» и в поле «Адрес» написать путь до PAC файла.

Ещё несколько полезной информации можно почерпнуть по адресу en.wikipedia.org/wiki/Proxy_auto-config