13.09.2013

Автоопределение прокси в домене Windows

Автоматизация - дело хорошее. И автоматизирование всего и вся поможет улучшить жизнь системного администратора если не в текущий момент, то в обозримом будущем точно. Для этого решил я настроить автоконфигурирование настроек прокси-сервера на клиентских машинах.
Имеется апдейт!

Как прокси мы используем Usergate (будь он неладен. На человеческие прокси пока не могу уломать начальство). В нем есть свой DHCP сервер с нужной нам функцией. Но в качестве DHCP мы используем стандартные средства Windows Server, поэтому простой вариант с одной галочкой нам не подходит.
 Тут нам на помощь приходит протокол автонастройки прокси (WPAD). Смысл его работы в следующем:
  1. Клиент ищет в сети сервер с именем wpad.domain.local (domain.local тут - имя нашего домена), если такой сервер не находится клиент идет выше - wpad.local (в этом кстати заключается брешь этого протокола, о которой говорили на одной из blackhat-конференций).
  2. Если сервер найден, клиент пытается прочитать файл wpad.dat, лежащий в корневом каталоге.
  3. Из этого файла берутся настройки, исходя из которых клиент понимает, в каких случаях нужно идти в сеть через прокси, а в каких напрямую.
Пример простейшего файла wpad.dat:
function FindProxyForURL(url, host)
{
    return "PROXY 192.168.0.254:3128";
}

Здесь мы видим, что в качестве адреса прокси-сервера клиенты получают 192.168.0.254:3128. Настройки можно кастомизировать, у файла может быть огромное количество опций. Их вы можете найти в поисковике.

Итак, будем считать, что файл настроек создан. Нужно положить его в корневую директорию веб-сервера и настроить сам веб-сервер, чтобы он умел отдавать этот файл. У нас используется Apache под виндой, поэтому привожу его конфигурацию: в httpd.conf в секции <IfModule mime_module> нужно добавить строку AddType application/x-ns-proxy-autoconfig .dat .

Следующий этап - настройка DNS-сервера. Нужно внести запись типа CNAME в зону прямого просмотра, указывающую, что под именем wpad.domain.local будет пониматься ваш веб-сервер. На этом натыкаемся на проблему - винда не разрешает использовать имя wpad. Об этом вам ничего не скажет, но найти сервер по имени wpad в сети вы не сможете. Нужно выполнить в командной строке dnscmd /config /enableglobalqueryblocklist 0 (подробнее здесь).

Очищаем кэш ДНС или просто идем курить пить кофе. Выставляем в браузере автонастройку прокси-сервера и получаем счастье. Теперь, если изменится адрес или порт прокси, или просто добавится сервер, на который нужно ходить в обход прокси, то настройки делаются в одном месте, а до клиентов доходят сами.

Спасибо ит-бложику за наводку.

UPD 24.12.2013
Описание параметров в файле wpad.dat производится на языке JavaScript, т.е. можно построить довольно сложную конфигурацию. Вот пример моего файла, проверяющего соответствие IP-адресов и закомментированными сообщениями для дебага (строки, начинающиеся с var и ниже проверяют, находится ли адрес в диапазоне 192.168.100.65 - 192.168.100.240):

function FindProxyForURL(url, host)
{
// If specific URL needs to bypass proxy, send traffic direct.
if (shExpMatch(host,"*subd.domain.local*") ||
shExpMatch(host,"*subd.domain1.local*") ||
shExpMatch(host,"192.168.*") ||
shExpMatch(host,"127.*") ||
dnsDomainIs(host,".subd.domain.local") ||
dnsDomainIs(host,".subd.domain1.local") ||
isPlainHostName(host))
return "DIRECT";

// All other traffic uses below proxies, in fail-over order.
//debug="host=" + host + "\n" + "url=" + url + "\n" + "MyIP=" + myIpAddress() +  "\n";
var myip = myIpAddress();  // Set a variable for the local IP address.
var myAddrArray = myip.split(".");  // Split that IP address var into an array.
var mysubnet3=parseInt(myAddrArray[2]);  // Convert array element #2 into a number and store it in a new variable
var mysubnet4=parseInt(myAddrArray[3]);
//debug += "Subnet=" + mysubnet3 + "." + mysubnet4 + "\n";
if ((mysubnet3 == 100) && (mysubnet4 >=65) && (mysubnet4 <= 240)) {
return "PROXY 192.168.100.14:8080";}
else {
return "DIRECT";}
}

В качестве веб-сервера для этой системы очень удобно использовать tinyhttpd, если нет уже работающих серверов. tynihttpd очень маленький и удобный, не нужно делать ничего лишнего - только index.html, wpad.dat и запустить экзешник из cmd.
Ещё DNS сервер Windows не дает разрешить доменные имена wpad и isatap, поэтому с ним нужно поколдовать: в командной строке пишем dnscmd /config /globalqueryblocklist и будет счастье.

UPD 01.09.2014
Здесь интересная статейка по этой теме.

UPD 08.08.2016
О безопасности при использовании WPAD

Комментариев нет:

Отправить комментарий