Главная

Thursday, 3 October 2024

Автоматическая настройка proxy сервера.

Всем привет. 

В сети сравнительно мало информации об такой замечательной вещи как «Автоматическая настройка прокси сервера». Суть технологии заключается в том, что браузер читает специальный файл написаный на языке 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.

Теперь остановлюсь на вопросе как указать браузеру использовать автоматическую конфигурацию прокси серверов. Для этого есть несколько вариантов:

  1. задать адрес скрипта вручную. Скрипт выкладывается на сервер доступный для пользователя. Обычно имя скрипта proxy.dat, однако если следовать спецификации WPAD скрипт следует назвать wpad.dat. Так же сервер должен отдавать файл с MIME типом application/x-ns-proxy-autoconfig
  2. второй способ WPAD метод основанный на DNS. Подробнее можно прочесть по ссылке ru.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol
  3. третий способ WPAD, основанный на DHCP. WPAD просто выдает PAC скрипт с выбранный номером 252 в «аренду» запросившему IP. Браузер получает URL скрипта и просто качает его по ссылке. Для этого необходимо:

Добавим в /etc/dhcp/dhcpd.conf следующие строчки.

option local-pac-server code 252 = text;

option local-pac-server "wpad.example.com:80/wpad.dat\000";

Перезапустите DHCP сервер.


Небольшой нюанс - у DHCP приоритет выше, чем у DNS, как следствие — гораздо быстрее. И можно вместо имени сайта указать его IP, в этом случае отсутствуют расходы времени на преобразование адреса в имя, что добавляет скорости.

Настройка браузеров. В параметрах программы нужно указать определение прокси-сервера:

в браузере Explorer/Chrome:

Сервис -> Свойства обозревателя -> Подключения -> Настройка сети поставить галочку напротив опции «Автоматическое определение параметров» или поставить галочку напротив опции «Использовать сценарий автоматической настройки» и в поле «Адрес» написать путь до PAC файла. Например: wpad.example.com:80/wpad.dat

в браузере Opera:

Настройки -> Дополнительно -> Сеть -> Прокси-серверы поставить галочку напротив опции «Автоматическая конфигурация прокси-сервера» и в поле «Адрес» написать путь до PAC файла.

в браузере Firefox:

Инструменты->Настройки->Дополнительно->Сеть->Соединение(Настроить) выбирать опции «Автоматически определять настройки прокси для этой сети» или выбирать опцию «URL автоматической настройки сервиса прокси» и в поле «Адрес» написать путь до PAC файла.

Еще один пример файла proxy.pac:

function FindProxyForURL(url, host) {

// If the hostname matches, send direct.

if (dnsDomainIs(host, "intranet.domain.com") ||

shExpMatch(host, "(*.abcdomain.com|abcdomain.com)"))

return "DIRECT";

// If the protocol or URL matches, send direct.

if (url.substring(0, 4)=="ftp:" ||

shExpMatch(url, "http://abcdomain.com/folder/*"))

return "DIRECT";

// If the requested website is hosted within the internal network, send direct.

if (isPlainHostName(host) ||

shExpMatch(host, "*.local") ||

isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||

isInNet(dnsResolve(host), "172.16.0.0",  "255.240.0.0") ||

isInNet(dnsResolve(host), "192.168.0.0",  "255.255.0.0") ||

isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))

return "DIRECT";

// If the IP address of the local machine is within a defined

// subnet, send to a specific proxy.

if (isInNet(myIpAddress(), "10.10.5.0", "255.255.255.0"))

return "PROXY 1.2.3.4:8080";

// DEFAULT RULE: All other traffic, use below proxies, in fail-over order.

return "PROXY 4.5.6.7:8080; PROXY 7.8.9.10:8080";

}

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

Успехов.

No comments:

Post a Comment

А что вы думаете по этому поводу?