Если автоматическая настройка сетевых параметров сегодня стала "нормой жизни" даже в небольших сетях, то автоматическое получение настроек прокси-сервера по-прежнему вызывает некоторые затруднения. Для этих целей существует протокол автоматической настройки прокси - WPAD, который позволяет достаточно гибко управлять трафиком и избежать необходимости настраивать браузеры и иное сетевое ПО вручную.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Протокол WPAD
Прежде всего немного теории. Давайте разберемся, как работает протокол и какие сетевые службы нужны для этого.
Автоматическая настройка системы на работу с прокси-сервером производится специальным набором инструкций на JavaScript, который называется PAC-файл (Proxy Auto Configuration), для нахождения его расположения в локальной сети используется протокол WPAD (Web Proxy Auto-Discovery Protocol).
Рассмотрим следующую схему:
Получив запрос от пользователя браузер пытается найти расположение PAC-скрипта используя различные сетевые механизмы. В первую очередь отправляется DHCP-запрос, ответ на который должен содержать URL PAC-файла в специальном поле ответа, для этого используется опция 252 протокола DHCP.
Если в ответе DHCP-сервера искомый адрес не найден, то посылается DNS-запрос для хоста wpad в текущем домене. Некоторые браузеры, например, Firefox, не используют DHCP-запросы, а сразу обращаются к DNS. С механизмом поиска службы WPAD через DNS связана одна серьезная уязвимость. Если в текущем домене хост с именем wpad не найден, то поиск будет произведен в вышестоящем домене, при этом выход за пределы домена организации никак не контролируется.
Что это значит? Допустим клиент расположен в домене office.spb.example.com, то поочередно будет произведен поиск следующих хостов:
- wpad.office.spb.example.com
- wpad.spb.example.com
- wpad.example.com
- wpad.com
Пользуясь этим, злоумышленники могут расположить PAC-файл по адресу за пределами домена предприятия и направить весь трафик на свои прокси сервера, в том числе и зашифрованный, в отношении которого можно осуществить атаку типа "человек посередине" с подменой сертификата.
В связи с этим DNS-сервер от Microsoft начиная с Windows Server 2008 содержит хост wpad в черном списке и не разрешает данное имя, даже если соответствующая запись на данном сервере существует.
В среде OC Windows, если предыдущие попытки не принесли результата, производится поиск хоста WPAD на WINS-сервере и посредством широковещательных протоколов LLMNR (Link-Local Multicast Name Resolution) и NBNS (NetBIOS Name Service).
После того, как расположение PAC-файла установлено, система делает попытку получить его из корневой директории веб-сервера по полученному через WPAD адресу, предопределенное имя PAC-файла - wpad.dat. Здесь таится еще одна тонкость. Разные браузеры по-разному формируют запрос к веб-серверу. Например, Firefox обращается по доменному имени - http://wpad.example.com/wpad.dat, а Internet Explorer использует для этого IP-адрес - http://192.168.0.100/wpad.dat.
Поэтому, если данный веб-сервер использует виртуальные хосты, хост wpad должен являться хостом по умолчанию (или корневым хостом), т.е. его содержимое должно отдаваться при обращении к данному серверу без указания имени хоста, просто по IP-адресу.
Также, в целях безопасности, PAC-файл не должен быть доступен за пределами локальной сети.
PAC-файл
Как мы уже упоминали, PAC-файл является JavaScript-скриптом, однако количество инструкций в нем жестко ограничено. Разберем некоторые из них.
isPlainHostName(host) - истина если host - "плоское" имя хоста, т.е. обычное NetBIOS-имя и т.п. Позволяет определять обращения к хостам локальной сети по простому имени.
dnsDomainIs(host, domain) - истина, если домен в запросе (host) совпадает с заданным в директиве domain.
isResolvable(host) - истина, если доменное имя удается разрешить. Данную инструкцию следует использовать осторожно, так как она делает дополнительный DNS-запрос, что может увеличить нагрузку на сервера и ухудшить время отклика.
isInNet(host, pattern, mask) - истина, если IP-адрес хоста совпадает с шаблоном, где pattern - шаблон сети, mask - маска. Например, 192.168.0.0, 255.255.255.0.
shExpMatch(str, shexp) - истина, если строка совпадает с шаблоном, в качестве строки можно использовать host или url, при этом следует помнить, что шаблон не является регулярным выражением.
Этих инструкций вполне достаточно, чтобы составить достаточно подробные и разветвленные правила для работы с прокси-сервером. Попробуем составить реальный сценарий.
Прежде всего укажем функцию:
function FindProxyForURL(url, host)
{
...
}
Данная функция получает от браузера URL и host из запроса и в ответ должна вернуть адрес прокси-сервера. Внутри фигурных скобок следует располагать инструкции и условия, в зависимости от выполнения которых браузеру будет возвращен тот или иной результат.
Начнем с того, что не следует направлять на прокси. Прежде всего это "плоские" имена, когда к какому-либо ресурсу пытаются обратиться по короткому имени, например, http://server, так как это однозначно ресурс локальной сети.
if (isPlainHostName(host)) {return "DIRECT";}
Согласно данной записи, если в поле host запроса содержится "плоское" имя, то возвращаем браузеру директиву DIRECT, что означает, что прокси-сервер для этого соединения использовать не следует.
Таким же образом предписываем обращаться напрямую по запросам с IP-адресами локальной сети:
if (isInNet(host, "192.168.31.0", "255.255.255.0")) {return "DIRECT";}
И локальным адресам:
if (shExpMatch(host, "127.0.0.1" )) {return "DIRECT";}
if (shExpMatch(host, "*/localhost*" )) {return "DIRECT";}
Кстати, первое правило можно переписать по-другому:
if (isInNet(host, "127.0.0.1", "255.255.255.255")) {return "DIRECT";}
В доменной сети также следует настроить прямое соединение для внутренних ресурсов:
if (dnsDomainIs(host, ".interface31.lab")) {return "DIRECT";}
Аналогичным образом можно направить мимо прокси какие-либо критичные внешние ресурсы, например, интернет-банки или площадки электронных торгов.
Если ваш прокси не обрабатывает https запросы, то их тоже следует направить мимо, обратите внимание, что вместо host в данном правиле мы используем url:
if (shExpMatch(url, "https:*")) {return "DIRECT";}
Тоже самое следует сделать и для ftp запросов:
if (shExpMatch(url, "ftp:*")) {return "DIRECT";}
И наконец все, что не попало ни под одно правило отправляем на прокси:
return "PROXY srv-gw01.interface31.lab:3128";
Разобравшись с тем, как устроен PAC-файл перейдем к сценариям практической реализации служб WPAD в сети.
Сети Active Directory
Так как все наши статьи преемственны, то далее будет подразумеваться что WPAD настраивается для работы с роутером в сети Active Directory, описанного нами в цикле Настраиваем Squid для работы с Active Directory, таким образом данный материал может служить его логическим завершением.
Начнем с настройки DHCP, откроем соответствующую оснастку и перейдем к списку серверов, щелкните правой кнопкой мыши на пункт IPv4 и выберите Предопределенные параметры.
В открывшемся окне нажмите Добавить
И заполните поля следующим образом:
- Имя - WPAD
- Тип данных - строка
- Код - 252
Затем нажмите ОК и в поле Значение - Строковое введите адрес расположения PAC-файла, в нашем случае это http://wpad.interface31.lab
После чего перейдите в Область - Параметры области - Настроить параметры и добавьте созданную нами опцию WPAD.
Если в вашей сети более одного DHCP-сервера, то аналогичные настройки нужно выполнить на каждом их них.
Следующим шагом будет настройка DNS, прежде всего откорректируем черный список, для этого на DNS-сервере откроем редактор реестра и перейдем в раздел:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DNS\Parameters
Откроем опцию GlobalQueryBlockList и удалим оттуда значение wpad, после чего службу DNS нужно перезапустить.
Данную операцию следует выполнить на каждом DNS-сервере в вашей сети.
Затем добавьте запись типа A для хоста wpad, которая должна указывать на веб-сервер с PAC-файлом.
Закончив настройки DHCP и DNS следует наконец установить на выбранный хост веб-сервер и разместить на нем wpad.dat. Никаких ограничений здесь нет, вы можете настроить любой веб-сервер на любом узле сети. В нашем случае напрашиваются два варианта: веб-сервер непосредственно на роутере, мы рекомендуем для этих целей простой и легкий lighttpd или веб-сервер на одном из контроллеров домена, в этом случае предпочтение следует отдать IIS.
В данной части статьи мы рассмотрим вариант с IIS, а к lighttpd вернемся чуть позже, когда будем говорить об одноранговых сетях. Мы не будем подробно останавливаться на установке роли Веб-сервер (IIS), достаточно просто пройти все шаги мастера со значениями по умолчанию.
После установки роли перейдите в Диспетчер служб IIS - Сайты - Default Web Site в настройках которого выберите Типы MIME.
Для правильной работы с PAC-файлом добавьте новый тип MIME, указав расширение .dat и тип MIME application/x-ns-proxy-autoconfig.
Выполнив данную настройку не забудьте перезапустить веб-сервер и разместите в его корневой директории C:\inetpub\wwwroot файл wpad.dat.
Как правило, дальнейших действий не требуется. Internet Explorer и Edge по умолчанию имеют настройку автоматического определения настройки параметров прокси-сервера. Но можно подстраховаться и создать отдельную политику в GPO, для этого используйте Конфигурация пользователя - Настройка - Параметры панели управления - Параметры обозревателя.
Браузеры на основе Google Chrome (в т.ч. Opera, Яндекс) используют настройки, заданные для IE. Проблемы, как всегда, возникают с Firefox, который с настройкой по умолчанию Использовать системные настройки прокси игнорирует их и ходит напрямую, поэтому данную опцию следует изменить на Автоматически определять настройки прокси для этой сети.
Одноранговая сеть
В одноранговых сетях обычно применяются прозрачные прокси, не требующие настройки параметров браузера, однако в ряде случаев, например, для аутентификации, от прозрачности приходится отказываться, следовательно, возникает потребность в WPAD. Далее мы будем рассматривать настройку на примере роутера, настроенного по нашей статье: Ubuntu Server. Настраиваем роутер NAT + DHCP + Squid3.
Так как в большинстве случаев лишних серверов в небольших сетях нет, то все службы будем располагать в пределах роутера. DHCP и кэширующий DNS у нас уже есть, в виде пакета dnsmasq, а в качестве веб-сервера можно установить легковесный lighttpd. На первый взгляд все необходимое имеется и особых проблем возникнуть не должно.
А теперь вспомним, как происходит поиск PAC-файла. Если браузер не получил нужной опции по DHCP или не умеет ее получать, он делает DNS-запрос для хоста wpad в текущем домене. Мы специально выделили ключевой момент - в текущем домене. А какой текущий домен в одноранговой сети? Правильно, никакого...
Чтобы убедиться в этом, следует проверить DNS-суффикс текущего подключения. Для этого в консоли PowerShell выполните команду:
Get-DnsClient
Ниже показан вывод команды для одноранговой и доменной сетей, разница в отсутствии DNS-суффикса отлично видна "невооруженным глазом".
Если все оставить как есть, то тот же Firefox не сможет получить настройки прокси и будет требовать ручного ввода параметров. Что делать? К счастью в протоколе DHCP есть опция 015, позволяющая передавать клиенту DNS-суффикс подключения.
Откроем /etc/dnsmasq.conf и последовательно изменим в нем следующие опции:
local=/interface31.local/
Данная опция указывает, что домен interface31.local - локальный и разрешать его имена на вышестоящих DNS-серверах не следует.
address=/wpad.interface31.local/192.168.31.1
Данная запись в формате dnsmasq является аналогом A-записи для хоста wpad, где 192.168.31.1 - адрес хоста, на котором будет расположен веб-сервер (в нашем случае это роутер).
domain=interface31.local
DNS-имя домена, передаваемое клиенту в опции 015 DHCP.
dhcp-option=252,http://wpad.interface31.local/wpad.dat
Задает расположение PAC-файла.
Перезапустим службу:
service dnsmasq restart
Теперь заново получим IP-адрес и снова проверим DNS-суффикс, также можно попробовать разрешить любое плоское имя (существующего хоста) командой nslookup.
Если все сделано правильно - у подключения появится указанный нами суффикс, а плоские имена будут дополняться до FQDN. Теперь можно переходить к настройке веб-сервера.
Установим lighttpd:
apt-get install lighttpd
Затем откроем его конфигурационный файл /etc/lighttpd/lighttpd.conf и добавим туда опцию:
server.bind = "192.168.31.1"
Это ограничит работу веб-сервера только локальной сетью.
После чего следует убедиться, что в файле /etc/mime.types присутствует запись:
application/x-ns-proxy-autoconfig pac dat
Если такой записи нет, то ее следует добавить.
Перезапустим веб-сервер:
service lighttpd restart
На этом настройка сервера закончена, осталось разместить PAC-файл в директории /var/www и проверить работу браузеров.
Поскольку одноранговая сеть не предоставляет таких возможностей по управлению клиентскими ПК как ActiveDirectory, то следует предпринять меры по предотвращению обхода прокси. Это можно сделать через iptables, запретив форвардинг пакетов с назначением на 80-й порт. Но лучше поступить иначе.
В /etc/nat добавим следующее правило:
# Запрещаем обход прокси
iptables -t nat -A PREROUTING -i eth1 ! -d 192.168.31.0/24 -p tcp -m multiport --dport 80,8080,3128 -j REDIRECT --to-port 80
Данная конструкция перенаправит все запросы к веб-серверам или сторонним прокси на порт 80 нашего роутера, где работает собственный веб-сервер.
В конфигурацию lighttpd добавим опцию (не забудьте перезапустить веб-сервер):
server.error-handler-404 = "/index.html"
Теперь в /var/www создадим файл index.html со следующим содержимым:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h3>Ваш браузер настроен неправильно. Доступ запрещен!</h3>
<p>Обратитесь к системному администратору</p>
</body>
</html>
После чего при попытке обхода прокси пользователь увидит сообщение:
В качестве примера мы привели самый простой вариант странички запрета, вам же ничего не мешает сделать ее более информативной, например, разместив на ней краткие инструкции по самостоятельной настройке браузера.
Если вам нужно разрешить работу с некоторыми сайтами напрямую, минуя прокси, то перед запрещающим правилом добавьте:
iptables -t nat -A PREROUTING -i eth1 -d xxx.xxx.xxx.xxx -j ACCEPT
где xxx.xxx.xxx.xxx - IP-адрес требуемого ресурса.
Как видим, настроить автоматическое получение параметров прокси совсем несложно и можно эффективно применять данную технологию как в крупных, так и в небольших сетях.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Последние комментарии