Файл автоматической настройки прокси-сервера ( PAC ) определяет, как веб-браузеры и другие пользовательские агенты могут автоматически выбирать соответствующий прокси-сервер (метод доступа) для получения заданного URL-адреса .
Файл PAC содержит функцию JavaScript . Эта функция возвращает строку с одной или несколькими спецификациями метода доступа. Эти спецификации заставляют пользовательский агент использовать определенный прокси-сервер или подключаться напрямую. [1] FindProxyForURL(url, host)
Множественные спецификации обеспечивают запасной вариант, когда прокси-сервер не отвечает. Браузер извлекает этот PAC-файл перед запросом других URL-адресов. URL-адрес файла PAC либо настраивается вручную, либо определяется автоматически протоколом автоматического обнаружения веб-прокси.
Современные веб-браузеры реализуют несколько уровней автоматизации; пользователи могут выбрать уровень, соответствующий их потребностям. Обычно применяются следующие методы:
localhost
), которые будут обходить этот прокси.Формат файла автоконфигурации прокси-сервера был первоначально разработан Netscape в 1996 году для Netscape Navigator 2.0 [2] и представляет собой текстовый файл , который определяет по крайней мере одну функцию JavaScript.
По соглашению файл PAC обычно называется proxy.pac
. Стандарт WPAD использует wpad.dat
. .pac
Ожидается, что файл будет содержать хотя бы одну функцию :
FindProxyForURL(url, host)
с двумя аргументами и возвращаемым значением в определенном формате:url
URL-адрес объектаhost
— имя хоста, полученное из этого URL-адреса. Синтаксически это та же строка, что и между ://
первой :
и /
последующей. [3]return "..."
— строка подписей в следующем формате (см. примеры ниже): [примечание 1] returnValue = тип хоста , ":" , порт ,[{ ";" , returnValue }]; тип = "ПРЯМОЙ" | "ПРОКСИ" | "НОСКИ" | «HTTP» | «HTTPS» | "НОСКИ4" | Хост «SOCKS5» = UTF16String (* ECMA262-совместимая строка UTF16 *) порт = UTF16String (* Цифры *)
Для его использования PAC-файл публикуется на HTTP-сервере , и клиентские пользовательские агенты получают указание использовать его либо путем ввода URL-адреса в настройках прокси-соединения браузера, либо с помощью протокола WPAD. URL-адрес также может ссылаться на локальный файл, например: file:///etc/proxy.pac
.
Несмотря на то, что большинство клиентов будут обрабатывать сценарий независимо от типа MIME, возвращаемого в ответе HTTP, для полноты и максимальной совместимости HTTP-сервер должен быть настроен так, чтобы объявлять тип MIME этого файла либо application/x-ns-proxy-autoconfig
или application/x-javascript-config
.
Существует мало доказательств в пользу использования одного типа MIME перед другим. Однако было бы разумно предположить, что он application/x-ns-proxy-autoconfig
будет поддерживаться большим количеством клиентов, чем application/x-javascript-config
это было определено в исходной спецификации Netscape, причем последний тип стал использоваться совсем недавно.
Очень простой пример файла PAC:
функция FindProxyForURL ( url , хост ) { return 'PROXY proxy.example.com:8080; ПРЯМОЙ' ; }
Эта функция дает браузеру указание получать все страницы через прокси-сервер через порт 8080 сервера proxy.example.com
. Если этот прокси-сервер не отвечает, браузер связывается с веб-сайтом напрямую, без использования прокси-сервера. Последнее может дать сбой, если межсетевые экраны или другие промежуточные сетевые устройства отклоняют запросы от источников, отличных от прокси-сервера (обычная конфигурация в корпоративных сетях).
Более сложный пример демонстрирует некоторые доступные функции JavaScript, которые можно использовать в FindProxyForURL
функции:
function FindProxyForURL ( url , host ) { // нашим локальным URL-адресам из доменов ниже example.com не нужен прокси: if ( shExpMatch ( host , '*.example.com' )) { return 'DIRECT' ; } // URL-адреса внутри этой сети доступны через // порт 8080 на fastproxy.example.com: if ( isInNet ( host , '10.0.0.0' , '255.255.248.0' )) { return 'PROXY fastproxy.example.com:8080 ' ; } // Все остальные запросы проходят через порт 8080 proxy.example.com. // если он не отвечает, перейдите непосредственно в WWW: return 'PROXY proxy.example.com:8080; ПРЯМОЙ' ; }
По умолчанию ключевое слово PROXY означает, что используется прокси, соответствующий протоколу исходного запроса, будь то http, https или ftp. Другие поддерживаемые типы ключевых слов и прокси включают:
Кодировка сценариев PAC обычно не определена, и разные браузеры и сетевые стеки имеют разные правила кодирования сценариев PAC. В общем, полностью ASCII -скрипты PAC будут работать с любым браузером или сетевым стеком. Mozilla Firefox 66 и более поздние версии дополнительно поддерживают сценарии PAC в кодировке UTF-8 . [4]
DnsResolve
Эта функция dnsResolve
(и подобные другие функции) выполняет поиск DNS , который может заблокировать браузер на длительное время, если DNS-сервер не отвечает.
myIpAddress
myIpAddress
Часто сообщается, что эта функция дает неправильные или непригодные для использования результаты, например 127.0.0.1
, IP-адрес локального хоста. [5]
Может помочь удалить в файле хоста системы (например, /etc/hosts
в Linux) все строки, относящиеся к имени хоста машины, при этом эта строка 127.0.0.1 localhost
может и должна остаться. [ нужна цитата ]
В 2013 году исследователи начали предупреждать об угрозах безопасности, связанных с автоматической настройкой прокси. [6] Угроза предполагает использование PAC, автоматически обнаруженного системой, для перенаправления трафика браузера жертвы на сервер, контролируемый злоумышленником.
Другая проблема с pac-файлом заключается в том, что типичная реализация включает получение открытого HTTP-текста, который не включает в себя какие-либо функции безопасности, такие как подписывание кода или веб-сертификаты. Злоумышленники могут легко выполнить атаку «человек посередине» .
Кэширование результатов автоматической настройки прокси-сервера по имени домена в Microsoft Internet Explorer 5.5 или новее ограничивает гибкость стандарта PAC. Фактически вы можете выбрать прокси-сервер на основе имени домена, а не пути URL-адреса. Как вариант, нужно отключить кэширование результатов автонастройки прокси, отредактировав реестр . [7]
Рекомендуется всегда использовать IP-адреса вместо имен доменов хостов в isInNet
функции для совместимости с другими компонентами Windows, которые используют конфигурацию PAC Internet Explorer, например .NET 2.0 Framework . Например,
if ( isInNet ( host , dnsResolve ( sampledomain ), '255.255.248.0' )) {} // .NET 2.0 будет правильно разрешать прокси if ( isInNet ( host , sampledomain , '255.255.248.0' )) {} // .NET 2.0 не будет правильно разрешать прокси
Текущее соглашение заключается в переключении на прямое соединение, когда файл PAC недоступен.
Вскоре после переключения между конфигурациями сети (например, при входе в VPN или выходе из нее) dnsResolve
результаты могут оказаться устаревшими из-за кэширования DNS.
Например, Firefox обычно хранит 20 записей домена в кэше в течение 60 секунд. Это можно настроить с помощью переменных конфигурации network.dnsCacheEntries
и network.dnsCacheExpiration
. Также может помочь очистка кэша DNS системы , чего можно добиться, например, в Linux с помощью sudo service dns-clean startили в Windows с помощью ipconfig /flushdns.
В Internet Explorer 9 isInNet('localHostName', 'second.ip', '255.255.255.255')
возвращается true
и может быть использован в качестве обходного пути.
Функция myIpAddress
предполагает, что устройство имеет один IPv4-адрес. Результаты не определены, если устройство имеет более одного адреса IPv4 или имеет адреса IPv6.
Дальнейшие ограничения связаны с движком JavaScript на локальном компьютере.
Более продвинутые файлы PAC могут снизить нагрузку на прокси, выполнить балансировку нагрузки, аварийное переключение или даже внесение в черный / белый список перед отправкой запроса через сеть. Можно вернуть несколько прокси:
вернуть 'ПРОКСИ proxy1.example.com:80; ПРОКСИ proxy2.example.com:8080' ;
Вышеуказанное сначала пробует прокси1, а если он недоступен, затем пробует прокси2.