Файл автоматичної конфігурації проксі (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 з обережністю та відповідними заходами безпеки.