Зачастую есть необходимость направлять трафик до различных хостов на разные прокси. Причиной может быть необходимость, чтобы вы обращались к тому или иному сайту с определенным IP (это будет IP прокси сервера), или в случае изолированных контуров сети, чтобы попасть из одной сети в другую, иногда это можно сделать только через определенный пограничный прокси. Другим случаем применения множественных прокси является случай, когда часть трафика нужно маршрутизировать через прокси в одной стране, а основной трафик — через другой. Это аналогично случаю, когда на маршрутизаторе настраивается маршрутизация со статическими маршрутами по подсетям, чтобы попасть в тот или иной шлюз.
Этого можно достичь как на стороне сервера, так и клиента. Но в случае с сервером не всегда можно поднять прокси-сервер, который имеет доступ до всех остальных подсетей, а вот подключаться к разным прокси в разных сетях на клиенте можно всегда.
Принцип автоматического выбора прокси
Чтобы сделать динамическую маршрутизацию запросов браузера к разным прокси, нужно воспользоваться proxy pac файлами. PAC (proxy auto config) — это технология автоматического конфигурация клиентов прокси через использование специальных pac файлов. Эти файлы содержат инструкции для клиента (браузера или другого агента), как найти IP адрес прокси сервера. Браузер при запуске читает pac файл, получает правила и согласно правила вычисляет IP адреса необходимых прокси серверов. настроить расположение pac файла можно как вручную, так и автоматически.
Существует общепринятый протокол Web Proxy Auto-Discovery (WPAD), который описывает, как донести pac конфигурацию до клиента. Сделать это можно через сетевые протоколы DHCP и DNS. Обычно, такое решение используется в корпоративной среде, а файл pac должен быть размещен на веб сервере в локальной сети (традиционно его именуют wpad.dat, хотя он не отличается от *.pac).
- Чтобы использовать DHCP для обнаружения, в DHCP сервере необходимо настроить опцию 252 («auto-proxy-config») со строковым значением адреса, где лежит pac файл, например,
http://company.net.local/wpad.dat; - Для использования DNS метода, необходимо добавить DNS запись для хоста с именем WPAD. В этом случае, файл wpad.dat должен размещаться в корневой директории хоста веб сервера;
- В обоих случаях веб сервер должен быть настроен отдавать WPAD файл с MIME типом
application/x-ns-proxy-autoconfig.
Настройка клиента для использования pac файлов
В нашем случае более интересна настройка клиента без использования веб сервера. В этом случае pac файл нужно расположить локально на компьютере. Файл написан на языке JavaScript и содержит функцию FindProxyForURL(url, host), с помощью которой определяется нужный IP. host в данном случае — это имя целевого хоста, к которому вы хотите подключиться, полученный из URL. В конце этой функции выполняется команда return, которая и возвращается IP прокси сервера или инструктирует клиента подключаться напрямую (DIRECT).
Доступные значения:
DIRECT | PROXY | SOCKS | HTTP | HTTPS | SOCKS4 | SOCKS5 host:port
Во всех типах, кроме DIRECT, указывается хост (имя или IP) и порт. Можно указать несколько прокси через ; и клиент будет их пробовать по очереди в указанном порядке.
Вот пример настройки pac файла для нескольких прокси серверов в зависимости от адреса назначения:
function FindProxyForURL(url, host) {
var mmHosts = [
"host1.mm.net",
"host2.mm.net"
];
var sblHosts = [
"host1.sbl.local",
"host2.sbl.local"
];
var pubHosts = [
"registry.terraform.io"
];
if (mmHosts.includes(host)) {
return "SOCKS5 10.250.10.100:1080";
}
if (sblHosts.includes(host)) {
return "SOCKS5 10.250.20.200:1080";
}
if (pubHosts.includes(host)) {
return "SOCKS5 10.66.0.10:1080";
}
if (shExpMatch(host, '*.corp.local')) {
return "SOCKS5 10.66.0.10:1080";
}
return "DIRECT";
}В данном коде мы создаем 3 списка для трех разных прокси и наполняем их хостами. Также мы указываем, что все хосты, названия которых попадают под маску *.corp.local должны ходить через прокси 10.66.0.10:1080
Если все эти правила не удовлетворяются, то использовать прямое соединение. Правила применяются в порядке их следования до первого совпадения.
После того, как файл готов, необходимо настроить браузер. Есть отличия в настройке — Firefox настраивается через внутреннюю конфигурацию, а все Chrome-подобные браузеры и EDGE используют системную настройку.
Файл proxy.pac необходимо разместить в общедоступной папке, например C:\TEMP, после чего указать такой путь к файлу в настройках (обратите внимание на тройной слэш): file:///C:/TEMP/proxy.pac
В системных настройках Windows включить использование файла автоконфигурации (Windows 11: Параметры > Сеть и интернет > Прокси-сервер):

Минус такого подхода в том, что эта настройка применяется ко всем браузерам — системным и на движке Chromium. В тому же, в этом случае резолвинг DNS имени хостов происходит через системный DNS, а не через прокси. Это может быть критично, если имена хостов зарегистрированы в DNS только в той сети, куда подключен прокси.
Для избавления от перечисленных проблем необходимо использовать браузер Firefox: он имеет независимую конфигурацию и умеет резолвить хосты прямо через прокси.
Заходим в настройки Firefox (адрес about:preferences) и через поле поиска ищем в настройках «прокси». Вы получите вот такую картинку:
Указываем «URL автоматической настройки прокси» и включаем галки «Отправлять DNS-запросы через прокси...»
Изменения в proxy.pac подтягиваются при рестарте браузера.

