Перейти к содержимому
Глоссарий 7 мин чтения 2 просмотров

PAC-файл

PAC-файл: что это и как он автоматизирует настройку прокси? Узнайте, как этот скрипт выбирает оптимальный сервер для стабильной и быстрой работы в сети.

PAC-файл (Proxy Auto-Configuration) — это скрипт на JavaScript, который автоматически определяет, как браузер или другая клиентская программа должна подключаться к интернету: напрямую, через прокси-сервер, или через несколько прокси, основываясь на URL-адресе запроса.

Что такое PAC-файл?

PAC-файл представляет собой текстовый файл, содержащий JavaScript-функцию FindProxyForURL(url, host). Эта функция вызывается клиентским приложением (например, веб-браузером) для каждого запроса к внешнему ресурсу. На основе переданных url (полный URL запроса) и host (имя хоста из URL) функция возвращает строку, указывающую метод подключения.

Принцип работы PAC-файла

Процесс работы с PAC-файлом включает следующие шаги:
1. Загрузка файла: Клиентское приложение загружает PAC-файл по указанному URL. Это может быть локальный файл, файл с HTTP-сервера или обнаруженный через WPAD.
2. Кэширование: Файл кэшируется клиентом для ускорения дальнейших запросов.
3. Выполнение функции: При каждом новом запросе к URL, клиент вызывает JavaScript-функцию FindProxyForURL из PAC-файла, передавая ей текущий URL и имя хоста.
4. Определение маршрута: Функция FindProxyForURL выполняет логику, определенную в скрипте, и возвращает одну или несколько инструкций по подключению.
5. Подключение: Клиент использует полученную инструкцию для установления соединения: напрямую, через указанный прокси-сервер или SOCKS-прокси.

Преимущества использования PAC-файлов

Применение PAC-файлов обеспечивает гибкость и контроль над маршрутизацией трафика:
* Гранулированный контроль: Возможность определять различные прокси для разных доменов, подсетей или даже отдельных URL.
* Балансировка нагрузки: Распределение запросов между несколькими прокси-серверами для равномерной загрузки.
* Отказоустойчивость: Автоматическое переключение на резервный прокси-сервер в случае недоступности основного.
* Динамическая маршрутизация: Изменение правил проксирования в зависимости от времени суток, дня недели или IP-адреса клиента.
* Упрощенное управление: Централизованное изменение правил проксирования для всех клиентов путем обновления одного PAC-файла.

Основы синтаксиса PAC-файла

PAC-файл должен содержать единственную функцию:

function FindProxyForURL(url, host) {
    // Логика определения прокси
    return "PROXY proxy.example.com:8080"; // Пример возвращаемого значения
}

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

Допустимые инструкции:
* DIRECT: Подключение напрямую к ресурсу, без прокси.
* PROXY host:port: Использовать HTTP-прокси по указанному адресу и порту.
* SOCKS host:port: Использовать SOCKS-прокси по указанному адресу и порту.
* SOCKS5 host:port: Использовать SOCKSv5-прокси.
* SOCKS4 host:port: Использовать SOCKSv4-прокси.

Пример возврата нескольких прокси для отказоустойчивости:
return "PROXY proxy1.example.com:8080; PROXY proxy2.example.com:8080; DIRECT";
Клиент попробует подключиться к proxy1, затем к proxy2, и если оба недоступны, подключится напрямую.

Встроенные функции PAC-файла

PAC-файлы поддерживают стандартные JavaScript-конструкции и ряд специфических функций для работы с сетевыми параметрами:

  • isPlainHostName(host): Возвращает true, если имя хоста не содержит точек (например, localhost, intranet).
  • dnsResolve(host): Разрешает DNS-имя хоста и возвращает его IP-адрес в виде строки. Если разрешение не удается, возвращает null.
  • shExpMatch(str, shexp): Сопоставляет строку str с шаблоном shexp, который может содержать символы подстановки * (любая последовательность символов) и ? (любой один символ).
  • isInNet(host, pattern, mask): Возвращает true, если IP-адрес host (или IP-адрес, полученный через dnsResolve для имени хоста) находится в подсети, заданной pattern и mask.
  • myIpAddress(): Возвращает IP-адрес локального хоста. Может возвращать несколько адресов, если у хоста несколько сетевых интерфейсов.
  • dnsDomainIs(host, domain): Возвращает true, если домен хоста host совпадает с domain или является его поддоменом.
  • localHostOrDomainIs(host, domain): Возвращает true, если хост совпадает с domain или является localhost без доменного имени.
  • isResolvable(host): Возвращает true, если имя хоста может быть разрешено в IP-адрес.
  • weekdayRange(wd1, wd2, gmt): Возвращает true, если текущий день недели находится в диапазоне от wd1 до wd2. wd1 и wd2 — сокращения дней недели (например, MON, TUE). gmt (необязательно) указывает использование GMT.
  • dateRange(day1, day2, month1, month2, year1, year2, gmt): Возвращает true, если текущая дата находится в указанном диапазоне.
  • timeRange(hour1, hour2, min1, min2, sec1, sec2, gmt): Возвращает true, если текущее время находится в указанном диапазоне.

Примеры конфигураций PAC-файлов

Базовая настройка: прокси по умолчанию и прямой доступ

Этот пример направляет весь трафик через прокси, если он не является локальным.

function FindProxyForURL(url, host) {
    // Подключение напрямую для локальных хостов
    if (isPlainHostName(host) || host == "localhost") {
        return "DIRECT";
    }

    // Весь остальной трафик через основной прокси
    return "PROXY proxy.example.com:8080";
}

Обход прокси для локальных ресурсов и исключений

Расширенный пример, включающий обход прокси для внутренних IP-адресов и определенных доменов.

function FindProxyForURL(url, host) {
    var internalProxy = "PROXY internal-proxy.example.com:8080";
    var externalProxy = "PROXY external-proxy.example.com:8080";
    var direct = "DIRECT";

    // Прямое соединение для локальных хостов и IP-адресов
    if (isPlainHostName(host) ||
        isInNet(host, "127.0.0.1", "255.255.255.0") || // localhost
        isInNet(host, "10.0.0.0", "255.0.0.0") ||      // Внутренняя сеть A
        isInNet(host, "172.16.0.0", "255.240.0.0") ||  // Внутренняя сеть B
        isInNet(host, "192.168.0.0", "255.255.0.0")) { // Внутренняя сеть C
        return direct;
    }

    // Прямое соединение для определенных внутренних доменов
    if (dnsDomainIs(host, ".internal-domain.com") ||
        shExpMatch(host, "*.local")) {
        return direct;
    }

    // Использование внутреннего прокси для трафика к определенным внешним доменам
    if (shExpMatch(host, "*.partner.com") ||
        shExpMatch(host, "secure.external-app.com")) {
        return internalProxy;
    }

    // Весь остальной трафик через внешний прокси
    return externalProxy;
}

Разделение трафика по доменам

Конфигурация для использования разных прокси в зависимости от домена назначения.

function FindProxyForURL(url, host) {
    // Прокси для социальных сетей
    if (shExpMatch(host, "*.facebook.com") ||
        shExpMatch(host, "*.vk.com")) {
        return "PROXY social.proxy.com:8080";
    }

    // Прокси для новостных сайтов
    if (shExpMatch(host, "*.news.com") ||
        shExpMatch(host, "*.cnn.com")) {
        return "PROXY news.proxy.com:8080";
    }

    // Прокси по умолчанию для всего остального
    return "PROXY default.proxy.com:8080";
}

Балансировка нагрузки и отказоустойчивость

Использование нескольких прокси для распределения нагрузки и обеспечения непрерывности работы.

function FindProxyForURL(url, host) {
    // Балансировка нагрузки между двумя прокси, с прямым подключением как запасным вариантом
    // Браузеры обычно пробуют прокси слева направо.
    // Это не настоящая балансировка, а скорее отказоустойчивость с ручным распределением.
    return "PROXY proxy1.example.com:8080; PROXY proxy2.example.com:8080; DIRECT";
}

Для более сложной "балансировки нагрузки" можно использовать хэширование URL или другие методы, но это требует более сложной логики JavaScript:

function FindProxyForURL(url, host) {
    var proxies = [
        "PROXY proxy1.example.com:8080",
        "PROXY proxy2.example.com:8081",
        "PROXY proxy3.example.com:8082"
    ];

    // Простой метод распределения на основе хэша URL
    // Это не гарантирует идеальное распределение, но может помочь.
    var hash = 0;
    for (var i = 0; i < url.length; i++) {
        hash = (hash << 5) - hash + url.charCodeAt(i);
        hash |= 0; // Преобразование в 32-битное целое
    }
    var index = Math.abs(hash % proxies.length);

    return proxies[index] + "; DIRECT";
}

Использование прокси в зависимости от времени суток

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

function FindProxyForURL(url, host) {
    // Рабочее время: с 9:00 до 18:00 с понедельника по пятницу (GMT+3, например)
    // Используем GMT для универсальности, но в реальных условиях может потребоваться локальное время.
    // Для простоты примера будем считать, что клиентское время соответствует рабочему графику.
    var isWorkingHours = timeRange(9, 0, 0, 18, 0, 0) && weekdayRange("MON", "FRI");

    if (isWorkingHours) {
        return "PROXY work.proxy.com:8080";
    } else {
        return "PROXY off-hours.proxy.com:8080";
    }
}

Развертывание и настройка PAC-файла

Ручная настройка клиента

Большинство операционных систем и браузеров позволяют вручную указать URL PAC-файла.
* Windows: Настройки -> Сеть и Интернет -> Прокси -> Использовать скрипт настройки (указать URL).
* macOS: Системные настройки -> Сеть -> Выбрать активный сетевой интерфейс -> Дополнительно -> Прокси -> Автоматическая настройка прокси (указать URL).
* Браузеры: Некоторые браузеры имеют собственные настройки прокси, которые могут переопределять системные или использовать их. Например, в Chrome и Edge обычно используются системные настройки. Firefox имеет свои настройки (Настройки -> Сеть -> Параметры соединения -> URL автоматической настройки прокси).

Автоматическое обнаружение WPAD

WPAD (Web Proxy Auto-Discovery Protocol) позволяет клиентам автоматически обнаруживать PAC-файл без ручной настройки.
WPAD работает следующим образом:
1. DNS: Клиент пытается разрешить доменное имя wpad.localdomain или wpad.company.com.
2. DHCP: Клиент запрашивает у DHCP-сервера опцию 252 (Proxy Auto-Discovery).
Если один из этих методов успешен, клиент получает URL PAC-файла (обычно http://wpad.localdomain/wpad.dat или http://wpad.company.com/proxy.pac) и использует его.
Для работы WPAD требуется корректная настройка DNS-сервера (запись wpad типа A) или DHCP-сервера (опция 252).

Централизованное управление через групповые политики (Windows)

В доменных сетях Windows администраторы могут распространять настройки PAC-файлов с помощью групповых политик (GPO):
Конфигурация пользователя -> Политики -> Настройки Windows -> Настройка Internet Explorer -> Подключения -> Параметры локальной сети.
Здесь можно включить опцию "Использовать скрипт автоматической настройки" и указать URL PAC-файла. Это обеспечивает единообразную настройку для всех пользователей в домене.

Отладка PAC-файлов

Отладка PAC-файлов может быть сложной, так как они выполняются в контексте браузера или ОС.
* Логирование: В некоторых браузерах (например, Firefox, Chrome с расширениями) можно просматривать, как PAC-файл обрабатывает запросы.
* Функция alert(): Вставляя alert(message) в скрипт, можно выводить всплывающие окна с информацией о текущем состоянии или значениях переменных. Это полезно для проверки условий и значений url и host.
* Локальное тестирование: Сохраните PAC-файл локально и укажите его путь в настройках прокси (file:///path/to/proxy.pac). Это позволяет быстро тестировать изменения.
* Инструменты разработчика: Некоторые браузеры предоставляют инструменты для отладки JavaScript, которые могут быть применимы к PAC-файлам.

Сравнение методов настройки прокси

Метод Описание Преимущества Недостатки
Ручная настройка Пользователь вручную указывает IP-адрес и порт прокси в настройках браузера или ОС. Простота для одного прокси, не требует дополнительных серверов. Отсутствие гибкости (всегда один прокси), сложность масштабирования, ручное изменение при смене прокси.
PAC-файл Скрипт на JavaScript определяет прокси для каждого запроса. Высокая гибкость, отказоустойчивость, балансировка нагрузки, централизованное управление, возможность обхода прокси для внутренних ресурсов. Требует JavaScript-программирования, сложность отладки, зависимость от доступности PAC-файла (если размещен на сервере).
WPAD (с PAC) Автоматическое обнаружение PAC-файла через DHCP или DNS. Автоматическая настройка для конечных пользователей, централизованное управление, все преимущества PAC-файлов. Требует настройки DHCP/DNS-сервера, потенциальные проблемы безопасности (DNS-спуфинг), зависимость от корректной работы DNS/DHCP.
Обновлено: 03.03.2026
Назад к категории

Попробуйте наши прокси

20,000+ прокси в 100+ странах мира