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(host, domain) вернет true если domain принадлежит host
  • localHostOrDomainIs(host, hostdomain) возвращает true если строка host (имя хоста или домена) содержится в строке hostdomain
  • isResolvable(host) возвращает true если возможно определить IP адрес для заданной строки host
  • isInNet(host, pattern, mask) возвращает true если IP адрес или имя хоста в строке host соответствует шаблону pattern и маске mask
  • dnsResolve(host) возвращает IP адрес для заданного host
  • myIpAddress() возвращает IP адрес компьютера
  • dnsDomainLevels(host) возвращает количество точек в строке host. Другими словами уровень домена
  • shExpMatch(str, shellexp) вернет 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(hour1, minute1, second1, hour2, minute2, second2 [, "GMT"])
  • timeRange(hour1, minute1, hour2, minute2 [, "GMT"])
  • timeRange(hour1, hour2 [, "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
Tags:
proxy, PAC, auto config

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.