Как сделать pac файл proxy

Обновлено: 02.07.2024

Настройка параметров прокси в браузере может производиться автоматически при помощи PAC-файла (proxy auto configuration file) — программы на языке JavaScript, благодаря которой, браузер может узнать, каким образом соединяться с сайтами в Интернете с учётом доступности/блокировки серверов, даты, времени суток, IP-адреса компьютера в сети и др.

Спецификация сценария была разработана в Netscape для браузера Netscape Navigator 2.0 в 1996 году. Далее на странице находится её перевод.

Для просмотра страницы с подсветкой синтаксиса разрешите, пожалуйста, исполнение JavaScript.

Формат файла автонастройки прокси в Navigator’е

Март 1996

(В конце документа приводятся несколько примеров и советов.)

Файл автонастройки прокси пишется на JavaScript. Скрипт должен определить одну функцию:

которая будет вызываться Navigator-ом для каждого URL, который он собирается загрузить, следующим способом:

url — полный URL, к которому нужно получить доступ.
host — имя хоста, которое извлекается из URL. Это сделано только для удобства, это просто строка между « :// » и первым символом « : » или « / » после неё. Номер порта в неё не включается, его можно извлечь при необходимости.
ret — (возвращаемое значение) строка конфигурации прокси. Формат строки описан ниже.

Сохранение файла автонастройки и настройка MIME-типа

JavaScript-функцию необходимо сохранить в файле с расширением .pac , например:

Примечание 1: Сохранять нужно саму JavaScript-функцию, а не встроенную в HTML.

Примечание 2: Примеры в конце этого документа готовы к работе. Чтобы их использовать, в них не нужно вносить никаких синтаксических изменений (но конечно, нужно отредактировать скрипт так, чтобы в нём упоминались ваши домены и/или подсети).

Далее необходимо сконфигурировать ваш сервер так, чтобы расширению .pac соответствовал следующий MIME-тип:

Если используется сервер Netscape, нужно отредактировать файл mime.types в каталоге config . Если используются серверы Apache, CERN или NCSA, нужно использовать директиву AddType .

Формат возвращаемой строки

JavaScript-функция должна возвращать строку.

Если строка — null , прокси использоваться не будет.

Строка может содержать произвольное число блоков, разделённых точками с запятой:

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

Если указано несколько настроек, будет использована самая левая, пока Navigator может установить соединение с прокси. В случае недоступности этого прокси будет использовано следующее значение и т.д.

Navigator будет автоматически пробовать соединиться с недоступным прокси спустя сначала 30 минут, потом через 1 час после предыдущей попытки (каждый раз добавляя дополнительные 30 минут).

Если все прокси недоступны, а опция DIRECT не указана, Navigator запросит пользователя игнорировать ли настройки прокси и попытается использовать прямое соединение. Через 20 минут Navigator запросит о необходимости обновления настроек прокси (затем через 40 минут после предыдущего запроса, добавляя каждый раз 20 минут).

Первичный прокси — w3proxy:8080 ; если он становится недоступным, использовать mozilla:8081 пока первичный вновь не станет доступным.

То же, что и выше, но если оба прокси недоступны, автоматически начать использовать прямое соединение. (В предыдущем примере Netscape запросит подтверждение пользователя на использование прямого соединения; здесь применение третьего способа соединения не потребует вмешательства пользователя.)

Использовать SOCKS, если первичный прокси не доступен.

Предопределённые функции и окружение для JavaScript-функции

  • Проверка имени хоста:
  • ProxyConfig.bindings

host — имя хоста в URL (без номера порта).

Истина, если имя хоста не содержит доменного имени (нет точек).

isPlainHostName("www") — истина.
isPlainHostName("www.netscape.com") — ложь.

host — имя хоста из URL.
domain — доменное имени для сравнения с именем хоста.

Возвращает «истину», если имя домена соответствует имени хоста.

dnsDomainIs("www.netscape.com", ".netscape.com") — истина.
dnsDomainIs("www", ".netscape.com") — ложь.
dnsDomainIs("www.mcom.com", ".netscape.com") — ложь.

host — имя хоста из URL.
hostdom — полностью указанное имя хоста для сравнения.

«Истина», если имя хоста в точности совпадает с указанным именем или в имени хоста отсутствует часть с доменным именем, а неуказанная часть соответствует.

localHostOrDomainIs("www.netscape.com", "www.netscape.com") — истина (точное соответствие).
localHostOrDomainIs("www", "www.netscape.com") — истина (имя хоста совпадает, а домен не указан).
localHostOrDomainIs("www.mcom.com", "www.netscape.com") — ложь (не совпадает имя домена).
localHostOrDomainIs("home.netscape.com", "www.netscape.com") — ложь (не совпадает имя хоста).

host — имя хоста из URL.

Выполняет попытку узнать IP-адрес хоста. Возвращает «истину», если попытка была удачной.

isResolvable("www.netscape.com") — истина (если при получении адреса не было ошибки DNS из-за фаервола или по каким-либо другим причинам).
isResolvable("bogus.domain.foobar") — ложь.

isInNet(host, pattern, mask)

host — имя хоста или IP-адрес. Если указано имя хоста, функция сама выяснит его адрес.
pattern — шаблон IP-адреса в формате чисел разделённых точками.
mask — маска IP-адреса для указания части, с которой необходимо сравнить. 0 — игнорировать, 255 — сравнивать.

«Истина», если IP-адрес хоста соответствует шаблону. Шаблон и маска указываются также, как и в конфигурации SOCKS.

isInNet(host, "198.95.249.79", "255.255.255.255") — истина, если IP-адрес хоста точно равен 198.95.249.79 .
isInNet(host, "198.95.0.0", "255.255.0.0") — истина, если IP-адрес совпадает в первых двух числах ( 198.95.*.* ).

host — имя хоста для определения адреса.

Получает IP-адрес хоста и возвращает его в виде строки чисел разделённых точками.

dnsResolve("home.netscape.com") возвращает строку "198.95.249.79" .

Возвращает IP-адрес хоста, на котором запущен Navigator, в виде строки чисел разделённых точками.

myIpAddress() вернёт строку "198.95.249.79" , если Navigator запущен на машине с таким адресом.

host — имя хоста из URL.

Возвращает уровень (целое число) домена (количество точек в имени).

dnsDomainLevels("www") возвращает 0 .
dnsDomainLevels("www.netscape.com") возвращает 2 .

str — произвольная строка для проверки соответствия (например URL или имя хоста).
shexp — шаблон для проверки.

Возвращает «истину», если str соответствует shexp . Здесь шаблон является выражением в стиле оболочки (как в bash или командной строке Windows), а не регулярным выражением.

shExpMatch("http://home.netscape. ari/index.html", "*/ari/*") — истина.
shExpMatch("http://home.netscape. lli/index.html", "*/ari/*") — ложь.

weekdayRange(wd1, wd2, gmt)

wd1 и wd2 — строки с названием дня недели, одна из: SUN MON TUE WED THU FRI SAT .
gmt — либо строка GMT , либо не указывается.

Обязателен только первый параметр. И второй, и третий могут быть опущены. Если указан только первый параметр, функция возвращает «истину» в день недели, который представлен первым параметром. Если в качестве второго параметра указана строка "GMT" , время определяется по GMT, иначе используется локальное время.

Если указаны оба параметра, и wd1 , и wd2 , «истина» возвращается когда текущий день недели находится между этими днями включительно. Если указан параметр "GMT" , используется время по Гринвичу, иначе — локальное.

weekdayRange("MON", "FRI") — истинно с понедельника по пятницу (время локальное).
weekdayRange("MON", "FRI", "GMT") — то же самое, но по Гринвичу (GMT).
weekdayRange("SAT") — истинно по субботам (время локальное).
weekdayRange("SAT", "GMT") — истинно по субботам (GMT).
weekdayRange("FRI", "MON") — истинно с пятницы по понедельник (внимание — порядок имеет значение!).

dateRange(day)
dateRange(day1, day2)
dateRange(mon)
dateRange(month1, month2)
dateRange(year)
dateRange(year1, year2)
dateRange(day1, month1, day2, month2)
dateRange(month1, year1, month2, year2)
dateRange(day1, month1, year1, day2, month2, year2)
dateRange(day1, month1, year1, day2, month2, year2, gmt)

day — день месяца от 1 до 31 (целое).
month — одна из строк сокращённого названия месяца: JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
year — полный номер года, например 1995 (а не просто 95). Целое.
gmt — либо строка "GMT", что приводит к сравнению дат по Гринвичу, либо, если не указано, будет использоваться локальное время.

Несмотря на то, в предыдущих примерах это не показано, параметр "GMT" может быть использован в любом из 9 способов вызова, всегда в качестве последнего параметра.

Если указано только одно значение (из каждой категории — день, месяц, год), функция возвращает «истину» только в день, который указан. Если указаны оба значения, результат будет истинным между двумя датами включительно.

dateRange(1) — истинно в первый день любого месяца по локальному времени.
dateRange(1, "GMT") — истинно в первый день любого месяца, время зоны GMT.
dateRange(1, 15) — истинно в первой половине любого месяца.
dateRange(24, "DEC") — истинно 24 декабря любого года.
dateRange(24, "DEC", 1995) — истинно 24 декабря 1995 года.
dateRange("JAN", "MAR") — истинно в первом квартале года.
dateRange(1, "JUN", 15, "AUG") — истинно с 1 июня по 15 августа любого года, включая и 1 июня, и 15 августа.
dateRange(1, "JUN", 15, 1995, "AUG", 1995) — истинно с 1 июня 1995 года по 15 августа того же года.
dateRange("OCT", 1995, "MAR", 1996) — истинно с октября 1995 года по март 1996 (включая весь октябрь 1995 года и весь март 1996-го).
dateRange(1995) — истинно в течение всего 1995 года.
dateRange(1995, 1997) — истинно с начала 1995 года до конца 1997-го.

timeRange(hour)
timeRange(hour1, hour2)
timeRange(hour1, min1, hour2, min2)
timeRange(hour1, min1, sec1, hour2, min2, sec2)
timeRange(hour1, min1, sec1, hour2, min2, sec2, gmt)

hour — час с 0 по 23 (0 — полночь, 23 — 11 пополудни).
min — минуты от 0 до 59.
sec — секунды от 0 до 59.
gmt — либо строка "GMT" для временной зоны GMT (по Гринвичу). Если не указано, будет использоваться локальное время. И опять, хотя это и не отражено в примерах, этот параметр может использоваться в любом случае, всегда последним.

Истинно в течение (или в диапазоне) указанного времени.

timeRange(12) — истинно с полудня до 1 часа пополудни.
timeRange(12, 13) — то же самое.
timeRange(12, "GMT") — истинно с полудня по 1 час дня по Гринвичу (GMT).
timeRange(9, 17) — истинно с 9 часов утра по 5 часов вечера.
timeRange(8, 30, 17, 00) — истинно с 8:30 по 17:00.
timeRange(0, 0, 0, 0, 0, 30) — истинно с полуночи в течение 30 секунд.

Примеры

Пример 1: Использовать прокси для всех адресов за исключением локальных

Это будет работать в домене Netscape. Соединение с неполностью указанными хостами или хостами находящимися в локальном домене будет осуществляться напрямую. Всё остальное будет направлено через w3proxy:8080 . Если прокси не будет отвечать, соединение будет сделано напрямую.

Примечание: Это простейший и самый эффективный файл автонастройки для случая, когда есть только один прокси-сервер.

Пример 1б: То же, что и выше, но использовать прокси для локальных серверов, которые находятся за фаерволом

Если есть хосты (такие как основной веб-сервер), которые находятся в локальном домене, но за фаерволом, и доступны только через прокси-сервер, то такое исключение может быть обработано с помощью функции localHostOrDomainIs() :

Обратите внимание на порядок перечисления хостов, который влияет на эффективность: localHostOrDomainIs() будет вызвана только для URL в локальном домене, а не для всех. Обратите внимание на скобки в выражении, которые добавлены для достижения вышеупомянутой эффективности.

Пример 2: Использовать прокси только для хостов с неизвестным адресом

Этот пример будет работать только в окружении, где внутренний DNS настроен так, что он может распознавать только внутренние имена хостов, и цель такой настройки — использовать прокси только для неопознанных хостов:

Этот код требует обращения к DNS при каждом вызове; его можно сгруппировать с другими правилами, чтобы обращение к DNS требовалось только тогда, когда другие правила не дадут результата:

Пример 3: Принятие решения на основе информации о подсети

В этом примере соединение с хостами в данной подсети производятся напрямую, а все остальные — через прокси.

И снова, использование обращения к DNS может быть минимизировано путём добавления дополнительных проверок перед вызовом isInNet() :

Пример 4: Распределение нагрузки и перенаправление по шаблону URL

Этот пример — более сложный. Имеется четыре (4) прокси-сервера, один из которых, резервный (hot stand-by), подменяет остальных в случае их отказа.

Кроме того, три первых прокси-сервера обслуживают свои URL — у каждого своя зона, что добавляет эффективности кэшированию (у любого загруженного документа — только одна копия на одном из трёх серверов, а не на каждом из них). Нагрузка распределяется примерно так:

Весь локальный доступ будет осуществляться напрямую. Все прокси-серверы работают на порту 8080. Обратите внимание, что строки объединены при помощи оператора « + » языка JavaScript.

Пример 5: Настройка прокси для конкретного протокола

В функции FindProxyForURL() можно использовать большинство стандартных функций JavaScript. Например, чтобы для разных протоколов использовать разные прокси, можно использовать функцию substring() :

Обратите внимание, что того же можно добиться, используя описанную ранее функцию shExpMatch() ; например:

15 июня 2022 г. настольное приложение Internet Explorer 11 будет снято с службы поддержки. Список того, что имеется в области, см. в faq. Те же приложения и сайты IE11, которые вы используете сегодня, можно открывать в Microsoft Edge в режиме Internet Explorer. Более подробную информацию см. здесь.

Здесь приведены различные способы использования файла автоматической настройки прокси-сервера (PAC) для указания URL-адреса автоматического прокси-сервера. Мы добавили здесь некоторые примеры в помощь. Однако нужно будет изменить имена прокси-серверов, номера портов и IP-адреса в соответствии со сведениями о вашей организации.

Пример1. Прямое подключение для локального узла.

В этом примере возможно прямое подключение для локального узла. Если же сервер не является локальным, то он должен устанавливать подключение через прокси-сервер. В частности, функция isPlainHostName проверяет наличие точек (.) в имени узла. Если функция находит точки, это значит, что узел не является локальным, и она возвращает значение false. В противном случае она возвращает значение true.

Пример2. Прямое подключение для узла за брандмауэром.

В этом примере возможно прямое подключение для узла за брандмауэром. Если же сервер находится вне брандмауэра, то он должен устанавливать подключение через прокси-сервер. В частности, функция localHostOrDomainIs работает только для URL-адресов в локальном домене. Если доменное имя узла соответствует предоставленным данным о домене, то функция dnsDomainIs возвращает значение true.

Пример3. Прямое подключение для разрешимого имени узла.

В этом примере возможно прямое подключение для узла, имя которого удается разрешить. Если же имя не удается разрешить, то сервер должен устанавливать подключение через прокси-сервер. В частности, эта функция запрашивает DNS-сервер для разрешения переданного ей имени узла. Если удается разрешить имя, устанавливается прямое подключение. В противном случае устанавливается подключение через прокси-сервер. Это особенно полезно, если внутренний DNS-сервер используется для разрешения всех внутренних имен узлов.

Пример4. Прямое подключение для узла в указанной подсети.

В этом примере возможно прямое подключение для узла в указанной подсети. Если же сервер находится вне указанной подсети, то он должен устанавливать подключение через прокси-сервер. В частности, функция isInNet (узел, шаблон, маска) возвращает значение true, если IP-адрес узла соответствует указанному шаблону. Маска указывает, какую часть IP-адреса сопоставлять (255 = сопоставлять, 0 = игнорировать).

Пример5. Определение типа подключения на основе домена узла.

В этом примере возможно прямое подключение сервера для локального узла. Если же узел не является локальным, то эта функция определяет используемый прокси-сервер по домену узла. В частности, функция shExpMatch(str, shexp) возвращает значение true, если str соответствует параметру shexp , который использует шаблоны выражения оболочки. Это особенно удобно, если доменное имя узла является одним из критериев выбора прокси-сервера.

Пример6. Определение типа подключения на основе протокола.

В этом примере используемый протокол извлекается из сервера и служит для выбора прокси-сервера. Если соответствие протокола не обнаруживается, то сервер устанавливает прямое подключение. В частности, функция substring извлекает указанное количество символов из строки. Это особенно удобно, если протокол является одним из критериев выбора прокси-сервера.

Пример7. Определение прокси-сервера по имени узла, соответствующему IP-адресу.

В этом примере прокси-сервер выбирается путем преобразования имени узла в IP-адрес с последующим сравнением адреса с указанной строкой.

Пример8. Подключение через прокси-сервер, если IP-адрес узла соответствует указанному IP-адресу.

В этом примере прокси-сервер выбирается путем явного получения IP-адреса с последующим сравнением его с указанной строкой. Если соответствие протокола не обнаруживается, то сервер устанавливает прямое подключение. В частности, функция myIpAddress возвращает IP-адрес (в формате целых чисел, разделенных точками) для узла, на котором работает браузер.

Пример9. Подключение через прокси-сервер, если имя узла содержит точки.

В этом примере функция проверяет наличие точек (.) в имени узла. Если имя содержит точки, то подключение устанавливается через прокси-сервер. Если точек нет, то устанавливается прямое подключение. В частности, функция dnsDomainLevels возвращает целое число, равное количеству точек в имени узла.

Примечание
Это другой способ определения типа подключения, основанный на характеристиках имени узла.

Пример10. Подключение через прокси-сервер в зависимости от дня недели.

В этом примере функция определяет необходимость подключения через прокси-сервер в зависимости от дня недели. В дни, которые не попадают в указанный диапазон дат, сервер может устанавливать прямое подключение. В частности, функция weekdayRange(day1 [,day2] [,GMT] ) возвращает, в зависимости от того, находится ли текущее системное время в диапазоне, указанном в параметрах day1 , day2 и GMT . Обязателен только первый параметр. Параметр GMT указывает, что задано время по Гринвичу, а не местное. Эта функция особенно удобна в случаях, когда прокси-сервер нужно использовать в период высокой загрузки, а в относительно свободное время допускается прямое подключение.

WPAD или автоматическая настройка параметров прокси

Если автоматическая настройка сетевых параметров сегодня стала "нормой жизни" даже в небольших сетях, то автоматическое получение настроек прокси-сервера по-прежнему вызывает некоторые затруднения. Для этих целей существует протокол автоматической настройки прокси - WPAD, который позволяет достаточно гибко управлять трафиком и избежать необходимости настраивать браузеры и иное сетевое ПО вручную.

Прежде всего немного теории. Давайте разберемся, как работает протокол и какие сетевые службы нужны для этого.

Автоматическая настройка системы на работу с прокси-сервером производится специальным набором инструкций на JavaScript, который называется PAC-файл (Proxy Auto Configuration), для нахождения его расположения в локальной сети используется протокол WPAD (Web Proxy Auto-Discovery Protocol).

Рассмотрим следующую схему:

wpad-pac-001.jpg

Получив запрос от пользователя браузер пытается найти расположение PAC-скрипта используя различные сетевые механизмы. В первую очередь отправляется DHCP-запрос, ответ на который должен содержать URL PAC-файла в специальном поле ответа, для этого используется опция 252 протокола DHCP.

Если в ответе DHCP-сервера искомый адрес не найден, то посылается DNS-запрос для хоста wpad в текущем домене. Некоторые браузеры, например, Firefox, не используют DHCP-запросы, а сразу обращаются к DNS. С механизмом поиска службы WPAD через DNS связана одна серьезная уязвимость. Если в текущем домене хост с именем wpad не найден, то поиск будет произведен в вышестоящем домене, при этом выход за пределы домена организации никак не контролируется.

В связи с этим DNS-сервер от Microsoft начиная с Windows Server 2008 содержит хост wpad в черном списке и не разрешает данное имя, даже если соответствующая запись на данном сервере существует.

В среде OC Windows, если предыдущие попытки не принесли результата, производится поиск хоста WPAD на WINS-сервере и посредством широковещательных протоколов LLMNR ( Link-Local Multicast Name Resolution) и NBNS (NetBIOS Name Service).

Поэтому, если данный веб-сервер использует виртуальные хосты, хост wpad должен являться хостом по умолчанию (или корневым хостом), т.е. его содержимое должно отдаваться при обращении к данному серверу без указания имени хоста, просто по IP-адресу.

Также, в целях безопасности, PAC-файл не должен быть доступен за пределами локальной сети.

PAC-файл

Как мы уже упоминали, PAC-файл является JavaScript-скриптом, однако количество инструкций в нем жестко ограничено. Разберем некоторые из них.

isPlainHostName(host) - истина если host - "плоское" имя хоста, т.е. обычное NetBIOS-имя и т.п. Позволяет определять обращения к хостам локальной сети по простому имени.

dnsDomainIs(host, domain) - истина, если домен в запросе (host) совпадает с заданным в директиве domain.

isResolvable(host) - истина, если доменное имя удается разрешить. Данную инструкцию следует использовать осторожно, так как она делает дополнительный DNS-запрос, что может увеличить нагрузку на сервера и ухудшить время отклика.

isInNet(host, pattern, mask) - истина, если IP-адрес хоста совпадает с шаблоном, где pattern - шаблон сети, mask - маска. Например, 192.168.0.0, 255.255.255.0.

shExpMatch(str, shexp) - истина, если строка совпадает с шаблоном, в качестве строки можно использовать host или url, при этом следует помнить, что шаблон не является регулярным выражением.

Этих инструкций вполне достаточно, чтобы составить достаточно подробные и разветвленные правила для работы с прокси-сервером. Попробуем составить реальный сценарий.

Прежде всего укажем функцию:

Данная функция получает от браузера URL и host из запроса и в ответ должна вернуть адрес прокси-сервера. Внутри фигурных скобок следует располагать инструкции и условия, в зависимости от выполнения которых браузеру будет возвращен тот или иной результат.

Согласно данной записи, если в поле host запроса содержится "плоское" имя, то возвращаем браузеру директиву DIRECT, что означает, что прокси-сервер для этого соединения использовать не следует.

Таким же образом предписываем обращаться напрямую по запросам с IP-адресами локальной сети:

И локальным адресам:

Кстати, первое правило можно переписать по-другому:

В доменной сети также следует настроить прямое соединение для внутренних ресурсов:

Тоже самое следует сделать и для ftp запросов:

И наконец все, что не попало ни под одно правило отправляем на прокси:

Разобравшись с тем, как устроен PAC-файл перейдем к сценариям практической реализации служб WPAD в сети.

Сети Active Directory

Так как все наши статьи преемственны, то далее будет подразумеваться что WPAD настраивается для работы с роутером в сети Active Directory, описанного нами в цикле Настраиваем Squid для работы с Active Directory, таким образом данный материал может служить его логическим завершением.

Начнем с настройки DHCP, откроем соответствующую оснастку и перейдем к списку серверов, щелкните правой кнопкой мыши на пункт IPv4 и выберите Предопределенные параметры.

wpad-pac-002.jpg

В открывшемся окне нажмите Добавить

wpad-pac-003.jpg

И заполните поля следующим образом:

  • Имя - WPAD
  • Тип данных - строка
  • Код - 252

wpad-pac-004.jpg

После чего перейдите в Область - Параметры области - Настроить параметры и добавьте созданную нами опцию WPAD.

wpad-pac-005.jpg

Если в вашей сети более одного DHCP-сервера, то аналогичные настройки нужно выполнить на каждом их них.

Следующим шагом будет настройка DNS, прежде всего откорректируем черный список, для этого на DNS-сервере откроем редактор реестра и перейдем в раздел:

Откроем опцию GlobalQueryBlockList и удалим оттуда значение wpad, после чего службу DNS нужно перезапустить.

wpad-pac-006.jpg

Данную операцию следует выполнить на каждом DNS-сервере в вашей сети.

Затем добавьте запись типа A для хоста wpad, которая должна указывать на веб-сервер с PAC-файлом.

wpad-pac-007.jpg

После установки роли перейдите в Диспетчер служб IIS - Сайты - Default Web Site в настройках которого выберите Типы MIME.

wpad-pac-009.jpg

Для правильной работы с PAC-файлом добавьте новый тип MIME, указав расширение .dat и тип MIME application/x-ns-proxy-autoconfig.

wpad-pac-010.jpg

Выполнив данную настройку не забудьте перезапустить веб-сервер и разместите в его корневой директории C:\inetpub\wwwroot файл wpad.dat.

Как правило, дальнейших действий не требуется. Internet Explorer и Edge по умолчанию имеют настройку автоматического определения настройки параметров прокси-сервера. Но можно подстраховаться и создать отдельную политику в GPO, для этого используйте Конфигурация пользователя - Настройка - Параметры панели управления - Параметры обозревателя.

wpad-pac-011.jpg

Браузеры на основе Google Chrome (в т.ч. Opera, Яндекс) используют настройки, заданные для IE. Проблемы, как всегда, возникают с Firefox, который с настройкой по умолчанию Использовать системные настройки прокси игнорирует их и ходит напрямую, поэтому данную опцию следует изменить на Автоматически определять настройки прокси для этой сети.

wpad-pac-012.jpg
Одноранговая сеть

В одноранговых сетях обычно применяются прозрачные прокси, не требующие настройки параметров браузера, однако в ряде случаев, например, для аутентификации, от прозрачности приходится отказываться, следовательно, возникает потребность в WPAD. Далее мы будем рассматривать настройку на примере роутера, настроенного по нашей статье: Ubuntu Server. Настраиваем роутер NAT + DHCP + Squid3.

А теперь вспомним, как происходит поиск PAC-файла. Если браузер не получил нужной опции по DHCP или не умеет ее получать, он делает DNS-запрос для хоста wpad в текущем домене. Мы специально выделили ключевой момент - в текущем домене. А какой текущий домен в одноранговой сети? Правильно, никакого.

Чтобы убедиться в этом, следует проверить DNS-суффикс текущего подключения. Для этого в консоли PowerShell выполните команду:

Ниже показан вывод команды для одноранговой и доменной сетей, разница в отсутствии DNS-суффикса отлично видна "невооруженным глазом".

wpad-pac-013.jpg

Если все оставить как есть, то тот же Firefox не сможет получить настройки прокси и будет требовать ручного ввода параметров. Что делать? К счастью в протоколе DHCP есть опция 015, позволяющая передавать клиенту DNS-суффикс подключения.

Откроем /etc/dnsmasq.conf и последовательно изменим в нем следующие опции:

Данная опция указывает, что домен interface31.local - локальный и разрешать его имена на вышестоящих DNS-серверах не следует.

Данная запись в формате dnsmasq является аналогом A-записи для хоста wpad, где 192.168.31.1 - адрес хоста, на котором будет расположен веб-сервер (в нашем случае это роутер).

DNS-имя домена, передаваемое клиенту в опции 015 DHCP.

Задает расположение PAC-файла.

Теперь заново получим IP-адрес и снова проверим DNS-суффикс, также можно попробовать разрешить любое плоское имя (существующего хоста) командой nslookup.

wpad-pac-014.jpg

Если все сделано правильно - у подключения появится указанный нами суффикс, а плоские имена будут дополняться до FQDN. Теперь можно переходить к настройке веб-сервера.

Это ограничит работу веб-сервера только локальной сетью.

После чего следует убедиться, что в файле /etc/mime.types присутствует запись:

Если такой записи нет, то ее следует добавить.

На этом настройка сервера закончена, осталось разместить PAC-файл в директории /var/www и проверить работу браузеров.

Поскольку одноранговая сеть не предоставляет таких возможностей по управлению клиентскими ПК как ActiveDirectory, то следует предпринять меры по предотвращению обхода прокси. Это можно сделать через iptables, запретив форвардинг пакетов с назначением на 80-й порт. Но лучше поступить иначе.

В /etc/nat добавим следующее правило:

Данная конструкция перенаправит все запросы к веб-серверам или сторонним прокси на порт 80 нашего роутера, где работает собственный веб-сервер.

Теперь в /var/www создадим файл index.html со следующим содержимым:

wpad-pac-015.jpg

В качестве примера мы привели самый простой вариант странички запрета, вам же ничего не мешает сделать ее более информативной, например, разместив на ней краткие инструкции по самостоятельной настройке браузера.

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

где xxx.xxx.xxx.xxx - IP-адрес требуемого ресурса.

Как видим, настроить автоматическое получение параметров прокси совсем несложно и можно эффективно применять данную технологию как в крупных, так и в небольших сетях.


Возникла необходимость автоматически настраивать прокси для всех компьютеров и не бегать к ним, если, например, поменялось что-то на прокси сервере. Для этого существует технология Proxy Auto Configuration (PAC).

Создадим файл будущего скрипта:

И немного ознакомимся с основными понятиями:

Теперь необходимо указать нужные настройки для браузеров. Возможен выбор из двух вариантов, используйте тот, который вам удобнее, например, я использую второй вариант.

Первый вариант

Подготовка Apache
Необходимо, чтобы Apache выдавал скрипт при запросе. Для этого надо разрешить обращаться к файлам типа .dat:


Таким образом, браузер будет пытатся загрузить PAC скрипт известного доменного URL.
Для реализации данного метода сделаем следующее:

Второй метод WPAD, основанный на DHCP
WPAD просто выдает PAC скрипт с выбранный номером 252 в "аренду" запросившему IP. Браузер получает URL скрипта и просто качает его по ссылке.

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

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

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

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

Отдельное спасибо Andy за помощь в редактировании статьи =)

Хорошо бы упомянуть про вариант fallback:
"PROXY IP_proxy:3128; DIRECT"
Помогает, если прокси лежит.

Баян, но полезный. Почти всё в одном месте. Спасибо.

Если расширение файлу поставить wdat.pac апач перенастраивать не придется :)

Хм.. я вот не понимаю зачем это вообще нужно, если прокси как правило юзается в больших офисах, где 99% стоит AD. Используя GPO можно изменять адрес прокси не поднимая задницы со стула, да и правила ipfw fwd тоже никто не отменял на шлюзе из freebsd. нафига козе бойан? или я что-то не понимаю?

Не зацикливайтесь на продуктах M$
Во многих больших и крупных конторах за стандарт идёт Firefox

Internet Explorer отрезает последний символ в строке.
И как показала практика автоконфигурирование по DHCP работает только для Internet Explorer

Как-то тоже настраивал, но не пошло, потому как только для IE, а это можно задать и в групповых политиках.

to hsw
см в конце все на return "DIRECT"; разве не то?
to Kolesya
Самое интересное, что я при выпуске статьи это урезал
А было в статье еще
+ AddType application/x-ns-proxy-autoconfig .pac
+ Redirect / wpad.dat / proxy.paс
+ ln -s wpad.dat proxy.paс
to Sash
У меня так и есть на работе =) НО в домашней сети, где каждый сам ПК по себе и нет серверов маздая то это самое то и без разговоров =) Да и не забудь, бывает и шлюзов с фри нет и прокси на маздае нет и бессмысленно ставить AD =)
Да и у каждого от Сафари до Мозиллы
to Shemmy
пробовал с \000 и без разницы небыло замеченно тестил на IE, Firefox, Opera так что я это из статьи выкинул тк смысла не увидел (может не прав =) еще раз потестю).
Да и на счет IE про автоконфиг по DHCP ты прав в самую точку, но я в статье это указал В Опере авто по DHCP нет, а в Firefox нормально не пашет, что и написал
to Antonio
Ты не прав это не только для IE, а для всех грамотных браузерах работает и на счет AD писал для Kolesya выше

to Raven2000
IE кеширует настроки прокси. в Групповой политике есть настройка отключающая кеширование.

to Raven2000
Нет, не то.
Если сработает правило с "PROXY: . ", а прокси не ответит, браузер покажет ошибку.
Если будет "PROXY: . ; DIRECT" - через таймаут пойдёт DIRECT-ом.
Можно указать несколько проксей в порядке уменьшения приоритета.

to Shemmy & hsw
Fixed
Что еще можно добавить?

to Raven2000
упс. retrurn ". ";
";" в конце не хватает.

Блин фсе %0 сказывается последний день на работе и в отпуск =)

а не проще сделать "прозрачный" прокси на серваке? на стороне юзера вообще ничего делать не нужно

Не зацикливайтесь на продуктах M$
Во многих больших и крупных конторах за стандарт идёт Firefox

Хотел бы я увидеть те большое компании которые используют Firefox за стандарт :)

К сожаление, большинство прог заточенно как раз по ИЕ.

ostrik, 2012-07-06 в 12:55:09

ttys, 2012-12-27 в 8:29:01

после добавления:
AddType application/x-ns-proxy-autoconfig .dat
файл не открывается а пытается скачиваться
зато без неё всё намана ;)

Юрий, 2013-11-08 в 21:17:48

Ховди ttys, ты погляди на сам формат mime:

Добавляй без точки:

ttys, 2013-11-09 в 12:10:33

2 Юрий,
я забил на это т.к. решил отказаться от прокси и потушил сквид ;)
но спс за подсказку =)

Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
Если соизволите поставить автора в известность — то вообще почёт вам и уважение.


Для других браузеров на этой странице в разделе Прокси.

Примечание: Данное решение может блокироваться вашим провайдером.

После чего очень редко приходилось включать бесплатный CyberGhost VPN (ссылка) или свой любимый F-Secure Freedom VPN (ссылка). Серфинг в интернете проходил тихо, спокойно, не страдал от медленной загрузки сайтов (через АнтиЗапрет проксируются только заблокированные сайты), все интернет площадки открывались, не замечал, что они заблокированы. Ляпота.

Индексация для Яндекс

Как это работает:

Сценарий PAC (файл JavaScript), запускаемый при каждом запросе URL-адреса, который сообщает веб-обозревателю, какой прокси-сервер использовать для конкретного URL(а).

Расширение браузера устанавливает сценарий PAC в настройках и поддерживает его синхронизацию со сценарием PAC на сервере, предлагая Antizapret размещенный на выделенном сервере или Anticensority размещенный на GitHub.

По каждому запросу сценарий PAC проверяет, заблокирован ли хост или его IP-адрес.

Если адрес заблокирован, PAC-скрипт возвращает браузеру прокси-сервер. PAC-скрипт Antizapret использует собственные прокси-серверы, а PAC-скрипт Anticensority использует локальный Tor.

Проксирует только заблокированные сайты, оставляя нетронутыми все остальные.

После установки расширения нужно сделать следующее:

На этой же странице перейти в настройки расширения и Обновить:

Индексация для Яндекс

Индексация для Яндекс

Каким способом пользоваться вам, первым или вторым, решайте сами.

Читайте также: