Перейти до вмісту
Глоссарий 6 хв читання 34 переглядів

PAC-файл

Зрозумійте PAC-файли, ключ до автоматичної конфігурації проксі за допомогою скриптів. Спростіть керування мережею та підвищте безпеку за допомогою цього потужного методу.

PAC-файл

Файл автоматичної конфігурації проксі (PAC) — це файл JavaScript, який веббраузери та інші клієнтські програми виконують для визначення того, який проксі-сервер, якщо такий є, використовувати для заданої URL-адреси. Цей механізм дозволяє динамічно та детально контролювати маршрутизацію клієнтського трафіку через проксі-інфраструктуру.

Розуміння PAC-файлів

PAC-файл централізує логіку конфігурації проксі на вебсервері, усуваючи необхідність ручних налаштувань проксі на стороні клієнта. Коли клієнт налаштований на використання PAC-файлу, він завантажує та виконує скрипт перед кожним HTTP/HTTPS-запитом. Основна функція скрипта, FindProxyForURL(url, host), повертає рядок, що вказує, чи потрібно підключатися безпосередньо, використовувати певний проксі, чи використовувати SOCKS-проксі.

Переваги використання PAC-файлів

Впровадження PAC-файлів пропонує кілька експлуатаційних переваг:

  • Детальний контроль: Визначення конкретних правил маршрутизації на основі шаблонів URL, імен хостів, IP-адрес, часу доби або розташування в мережі.
  • Балансування навантаження: Розподіл трафіку між кількома проксі-серверами для запобігання перевантаженню.
  • Відмовостійкість: Визначення альтернативних проксі-серверів на випадок недоступності основного, що підвищує надійність.
  • Обхід певного трафіку: Направлення певних внутрішніх або довірених доменів для повного обходу проксі, зменшуючи затримку та споживання ресурсів.
  • Спрощена конфігурація клієнта: Клієнтам потрібна лише URL-адреса PAC-файлу, що спрощує розгортання та оновлення. Зміни в логіці проксі вносяться один раз на сервері, а не на кожному клієнті.

Структура та синтаксис PAC-файлу

PAC-файл — це звичайний текстовий файл, написаний на JavaScript, зазвичай названий proxy.pac або wpad.dat. Основою PAC-файлу є функція FindProxyForURL(url, host), яка повинна бути присутньою.

Функція FindProxyForURL(url, host)

Ця функція приймає два аргументи:
* url: Повна URL-адреса об'єкта, що запитується (наприклад, http://www.example.com/index.html).
* host: Ім'я хоста, витягнуте з URL-адреси (наприклад, www.example.com).

Функція повинна повертати строкове значення:

  • DIRECT: Підключитися безпосередньо до призначення без використання проксі.
  • PROXY <host>:<port>: Використовувати вказаний HTTP-проксі-сервер.
  • SOCKS <host>:<port>: Використовувати вказаний SOCKS-проксі-сервер.
  • Кілька варіантів: Розділіть кілька проксі-серверів або проксі та пряме підключення крапками з комою (наприклад, PROXY proxy1.example.com:8080; PROXY proxy2.example.com:8080; DIRECT). Клієнт намагається встановити з'єднання в зазначеному порядку.

Загальні функції JavaScript у PAC-файлах

Доступні стандартні функції JavaScript, а також кілька специфічних для браузерів функцій, розроблених для автоматичної конфігурації проксі:

  • isPlainHostName(host): Повертає true, якщо host не містить доменного імені (наприклад, localhost, intranet-server).
  • dnsDomainIs(host, domain): Повертає true, якщо host належить до domain (наприклад, dnsDomainIs("www.example.com", ".example.com")).
  • shExpMatch(str, pattern): Повертає true, якщо str відповідає pattern за допомогою зіставлення за шаблоном оболонки (наприклад, shExpMatch("http://www.example.com/index.html", "http://*.example.com/*")).
  • isInNet(host, pattern, mask): Повертає true, якщо IP-адреса host знаходиться в межах вказаної IP-мережі pattern та mask (наприклад, isInNet(host, "192.168.1.0", "255.255.255.0")). host може бути ім'ям хоста або IP-адресою.
  • myIpAddress(): Повертає IP-адресу машини, на якій працює браузер. Корисно для прийняття рішень щодо проксі на основі розташування.
  • dnsResolve(host): Розпізнає ім'я хоста host в IP-адресу. Повертає порожній рядок, якщо розпізнавання не вдалося.
  • weekdayRange(wd1, wd2, gmt): Повертає true, якщо поточний день тижня знаходиться у вказаному діапазоні. wd1, wd2 — це скорочення (наприклад, "MON", "FRI"). gmt є необов'язковим для часу за Гринвічем.
  • dateRange(day1, month1, year1, day2, month2, year2, gmt): Повертає true, якщо поточна дата знаходиться у вказаному діапазоні.
  • timeRange(hour1, min1, sec1, hour2, min2, sec2, gmt): Повертає true, якщо поточний час знаходиться у вказаному діапазоні.

Приклад PAC-файлу

Цей приклад демонструє обхід внутрішніх доменів, маршрутизацію певного трафіку та реалізацію відмовостійкості.

function FindProxyForURL(url, host) {
    // Визначте ваші проксі-сервери
    var PRIMARY_PROXY = "PROXY proxy.example.com:8080";
    var SECONDARY_PROXY = "PROXY backup-proxy.example.com:8080";
    var SOCKS_PROXY = "SOCKS socks.example.com:1080";

    // 1. Пряме підключення для локальних хостів та внутрішніх доменів
    // Обхід проксі для простих імен хостів (наприклад, "localhost", "intranet-server")
    if (isPlainHostName(host)) {
        return "DIRECT";
    }

    // Обхід проксі для конкретного внутрішнього домену
    if (dnsDomainIs(host, ".internal-domain.com")) {
        return "DIRECT";
    }

    // Обхід проксі для конкретних внутрішніх діапазонів IP
    // Примітка: myIpAddress() повертає IP клієнта. Це перевіряє, чи є *призначення* внутрішнім.
    // Для перевірки IP клієнта використовуйте myIpAddress() та isInNet.
    if (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")) {
        return "DIRECT";
    }

    // 2. Використання SOCKS-проксі для конкретних програм або протоколів
    // Приклад: Маршрутизація всього FTP-трафіку через SOCKS-проксі
    if (url.substring(0, 4) == "ftp:") {
        return SOCKS_PROXY;
    }

    // 3. Маршрутизація конкретних зовнішніх доменів через основний проксі з відмовостійкістю
    // Приклад: Маршрутизація трафіку до partner-site.com через основний проксі,
    // з резервним варіантом на вторинний проксі.
    if (dnsDomainIs(host, ".partner-site.com")) {
        return PRIMARY_PROXY + "; " + SECONDARY_PROXY;
    }

    // 4. Блокування конкретних URL-адрес (шляхом повернення неіснуючого проксі або помилки)
    // Примітка: Деякі браузери можуть розглядати "PROXY 0.0.0.0:0" як блокування.
    // Більш надійний механізм блокування зазвичай обробляється самим проксі.
    if (shExpMatch(url, "*bad-site.com*")) {
        // Поверніть неіснуючий проксі для ефективного блокування, або використовуйте спеціальний проксі для блокування
        return "PROXY 127.0.0.1:1"; // Або спеціальний проксі для блокування
    }

    // 5. Правило за замовчуванням: Весь інший трафік проходить через основний проксі з відмовостійкістю
    return PRIMARY_PROXY + "; " + SECONDARY_PROXY + "; DIRECT";
}

Розгортання та розповсюдження

Щоб клієнти могли використовувати PAC-файл, їх потрібно налаштувати для його отримання.

Через HTTP/HTTPS-сервер

Найпоширенішим методом є розміщення PAC-файлу на стандартному вебсервері (Apache, Nginx, IIS) та налаштування клієнтських браузерів або операційних систем з його URL-адресою.
* Конфігурація сервера: Переконайтеся, що сервер надає PAC-файл з правильним MIME-типом: application/x-ns-proxy-autoconfig.
* Конфігурація клієнта: У налаштуваннях браузера (або мережевих налаштуваннях ОС) вкажіть опцію "Використовувати скрипт автоматичної конфігурації проксі" та надайте повну URL-адресу (наприклад, http://proxyconfig.example.com/proxy.pac).

Протокол автоматичного виявлення вебпроксі (WPAD)

WPAD дозволяє клієнтам автоматично виявляти URL-адресу PAC-файлу без ручної конфігурації. Це зазвичай включає:
1. DNS: Створення запису DNS для wpad.<domain>, який вказує на вебсервер, що розміщує wpad.dat.
2. DHCP: Налаштування опції DHCP (опція 252) для надання URL-адреси PAC-файлу.

Хоча WPAD зручний, він має наслідки для безпеки (наприклад, потенціал для зловмисних WPAD-серверів) і часто вимикається або використовується з обережністю. Пряма конфігурація URL зазвичай є кращою для безпеки та явного контролю.

Об'єкти групової політики (GPO) для Windows

У доменах Windows URL-адреси PAC-файлів можуть централізовано розповсюджуватися на клієнтські машини за допомогою групової політики:
* Перейдіть до User Configuration > Policies > Windows Settings > Internet Explorer Maintenance > Connection > Proxy Settings.
* Увімкніть "Automatic configuration" та надайте URL-адресу PAC-файлу.

Усунення несправностей PAC-файлів

Проблеми з PAC-файлами часто виникають через синтаксичні помилки, кешування або проблеми з мережею.

  • Синтаксичні помилки: Навіть незначні помилки JavaScript можуть перешкодити функціонуванню PAC-файлу. Використовуйте лінтер JavaScript або спеціальний валідатор PAC-файлів. Браузери можуть реєструвати помилки в консолі розробника (наприклад, F12 у Chrome/Firefox).
  • Неправильний MIME-тип: Якщо вебсервер надає PAC-файл з неправильним MIME-типом, клієнти можуть не обробляти його коректно. Перевірте application/x-ns-proxy-autoconfig.
  • Проблеми з кешуванням: Браузери агресивно кешують PAC-файли. При внесенні змін очистіть кеш браузера або примусово оновіть сторінку (наприклад, Ctrl+F5). Деякі браузери пропонують опцію вимкнення кешування PAC-файлів для налагодження.
  • Доступність мережі: Переконайтеся, що клієнт може дістатися до вебсервера, що розміщує PAC-файл. Перевірте розпізнавання DNS та правила брандмауера.
  • Функція FindProxyForURL: Переконайтеся, що функція FindProxyForURL(url, host) правильно визначена та повертає дійсні рядки проксі.
  • Інструменти тестування: Інструменти розробника браузера (вкладка "Мережа") можуть показувати, який проксі використовувався для запиту. Онлайн-тестери PAC-файлів можуть симулювати запити до вашого скрипта.

PAC-файл проти інших методів конфігурації проксі

Функція PAC-файл Прямі налаштування проксі WPAD
Метод конфігурації URL-адреса скрипта JavaScript Ручне введення IP/порту Автоматичне виявлення через DNS/DHCP
Детальний контроль Високий (на основі логіки) Низький (весь трафік йде на один проксі або безпосередньо) Високий (використовує PAC-файл)
Відмовостійкість/Балансування навантаження Так (вбудовано в логіку скрипта) Ні (один проксі) Так (вбудовано в логіку PAC-файлу)
Правила обходу Так (вбудовано в логіку скрипта) Список ручних винятків Так (вбудовано в логіку PAC-файлу)
Складність розгортання Помірна (розміщення файлу на вебсервері, конфігурація URL) Низька (вручну для кожного клієнта) Висока (конфігурація DNS/DHCP, вебсервер)
Обслуговування Централізоване (редагування скрипта на сервері) Децентралізоване (вручну для кожного клієнта) Централізоване (редагування скрипта на сервері, DNS/DHCP)
Міркування безпеки Ін'єкція скрипта, нешифроване розповсюдження Базові Підробка DNS/DHCP (вищий ризик), ін'єкція скрипта

Міркування безпеки

  • Цілісність: PAC-файли містять конфіденційну інформацію про маршрутизацію. Переконайтеся, що PAC-файл розміщено на безпечному, довіреному вебсервері та доставляється через HTTPS для запобігання підробці або перехопленню під час завантаження.
  • Зловмисні скрипти: Компрометований PAC-файл може перенаправляти клієнтський трафік на зловмисні проксі, сприяючи атакам "людина посередині", збору облікових даних або витоку даних. Використовуйте PAC-файли лише з довірених джерел.
  • Розкриття інформації: Уникайте включення конфіденційних внутрішніх мережевих деталей у PAC-файли, які є загальнодоступними. Хоча сам файл є кодом, його логіка може розкривати топологію мережі.
  • Вразливості WPAD: Механізм автоматичного виявлення WPAD може бути використаний, якщо зловмисник може контролювати відповіді DNS або DHCP, направляючи клієнтів на зловмисний WPAD-сервер. Використовуйте WPAD з обережністю та відповідними заходами безпеки.
Оновлено: 03.03.2026
Назад до категорії

Спробуйте наші проксі

20,000+ проксі в 100+ країнах світу

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.