- History
- PAC/WPAD script
- Hosting proxy.pac/wpad.dat file
- Adding script file to IE/EDGE
- Autodetection of script using DHCP and DNS servers – WPAD
- P.S
History
The first proxy automatic detection system, called PAC (proxy auto-config), was developed in time of Netscape Navigator (if you are old enough like me you will remember). It allowed you to specify a JavaScript location which told the browser which proxy to use or bypass request. It also provided a central position from which to change proxy servers. In years after, there was a problem with changing script location. Clients needed to change script location manually, or you, as admin, needed to change script location yourself. The solution for this problem is WPAD (Web Proxy Auto Discovery). This is a set of methods for finding the PAC script to be tried in order, leveraging DHCP and DNS services on network. Let start with script itself.
PAC/WPAD script
A PAC/WPAD file contains a JavaScript function “FindProxyForURL(url, host)”. JavaScript is case sensitive, and IE itself converts the variables url and host into lowercase before the FindProxyForURL function is called. This condition is not true for WinHTTP. This is because WinHTTP passes the host and the url directly to the function. That’s why we need conversion to lowercase in script. If you are familiar with proxy settings up to now all comments in script should be self explanatory. Function returns a string with one or more access method specifications. These specifications cause browser to use a particular proxy server or to connect directly. You can copy this function in any text editor and save it under proxy.pac or wpad.dat file . Names can be different but its usual naming convection you will encounter.
function FindProxyForURL(url, host) { /* Normalize the URL for pattern matching */ url = url.toLowerCase(); host = host.toLowerCase(); /* Don't proxy local hostnames */ if (isPlainHostName(host)) { return 'DIRECT'; } /* Don't proxy local domains */ if (dnsDomainIs(host, ".example1.com") || (host == "example1.com") || dnsDomainIs(host, ".example2.com") || (host == "example2.com") || dnsDomainIs(host, ".example3.com") || (host == "example3.com")) { return 'DIRECT'; } /* Don't proxy Windows Update */ if ((host == "download.microsoft.com") || (host == "ntservicepack.microsoft.com") || (host == "cdm.microsoft.com") || (host == "wustat.windows.com") || (host == "windowsupdate.microsoft.com") || (dnsDomainIs(host, ".windowsupdate.microsoft.com")) || (host == "update.microsoft.com") || (dnsDomainIs(host, ".update.microsoft.com")) || (dnsDomainIs(host, ".windowsupdate.com"))) { return 'DIRECT'; } if (isResolvable(host)) { var hostIP = dnsResolve(host); /* Don't proxy non-routable addresses (RFC 3330) */ if (isInNet(hostIP, '0.0.0.0', '255.0.0.0') || isInNet(hostIP, '10.0.0.0', '255.0.0.0') || isInNet(hostIP, '127.0.0.0', '255.0.0.0') || isInNet(hostIP, '169.254.0.0', '255.255.0.0') || isInNet(hostIP, '172.16.0.0', '255.240.0.0') || isInNet(hostIP, '192.0.2.0', '255.255.255.0') || isInNet(hostIP, '192.88.99.0', '255.255.255.0') || isInNet(hostIP, '192.168.0.0', '255.255.0.0') || isInNet(hostIP, '198.18.0.0', '255.254.0.0') || isInNet(hostIP, '224.0.0.0', '240.0.0.0') || isInNet(hostIP, '240.0.0.0', '240.0.0.0')) { return 'DIRECT'; } /* Don't proxy local addresses.*/ if (false) { return 'DIRECT'; } } if (url.substring(0, 5) == 'http:' || url.substring(0, 6) == 'https:' || url.substring(0, 4) == 'ftp:') { return 'PROXY 10.0.40.50:9090'; } return 'DIRECT'; }
Depending on configuration needed you can change script to fit your needs. For example if you have multiple branch offices, or subnets that have its own proxy server installed, you can configure script in next way to reflect your infrastructure
{ if (isInNet(myIpAddress(), "10.1.0.0", "255.255.0.0")) { return "PROXY wcg1.example.com:8080; " + "PROXY wcg2.example.com:8080"; } if (isInNet(myIpAddress(), "10.2.0.0", "255.255.0.0")) { return "PROXY wcg1.example.com:8080; " + "PROXY wcg2.example.com:8080"; } if (isInNet(myIpAddress(), "10.3.0.0", "255.255.0.0")) { return "PROXY wcg2.example.com:8080; " + "PROXY wcg1.example.com:8080"; } if (isInNet(myIpAddress(), "10.4.0.0", "255.255.0.0")) { return "PROXY wcg2.example.com:8080; " + "PROXY wcg1.example.com:8080"; } else return "DIRECT"; }
There is a lot of examples on the Net about possible configuration, but if you want to know more about function you can use in if statements ,visit next sites I consulted while creating this blog post.
https://www.websense.com/content/support/library/web/v76/pac_file_best_practices/PAC_best_pract.aspx
http://findproxyforurl.com/
Hosting proxy.pac/wpad.dat file
You need to present your PAC file on some location that is accessible to computers on your network. Usually it is web location hosted on local web service. For our example we will put PAC file on root of default web site in IIS.
Problem you will encounter is next one (see picture below). To correct it you need to add PAC extension to host header mime types.
Open IIS manager select website where you hosted pac file and open MIME types presented on next picture
Click add to add pac file with next values FileExtension=’.pac’;mimeType= ‘application/x-ns-proxy-autoconfig’
If you are using wpad.dat naming you will need same setting but you need to enter next values File extension: ‘dat’; MIME type: ‘application/x-javascript-config’
You can do same with PowerShell (example)
import-module WebAdministration md c:\AutoConfig New-Item 'IIS:\Sites\Default Web Site\AutoConfig' -Type VirtualDirectory -PhysicalPath c:\AutoConfig add-WebConfigurationProperty //staticContent -name collection -PSPath 'IIS:\Sites\Default Web Site\AutoConfig' -Value @{FileExtension='.pac';mimeType= 'application/x-ns-proxy-autoconfig'
After that client will be able to get PAC file from web location.
Adding script file to IE/EDGE
To use script file you need to add script location resembling example on picture. You can use this config in IE settings also, or deploy it with GPO (refer to part II of this guide)
What happens now is that every url you type in browser is evaluated with JavaScript function FindProxyForURL and accordingly, you will use or not use proxy for that url.
Autodetection of script using DHCP and DNS servers – WPAD
If you want to provide same proxy policy to all browsers, and ability to easily change PAC file location to all clients, you need two things:
- Standard Proxy auto-config (PAC): Create and publish a central proxy configuration file.
- Autodiscovery Protocol (WPAD) Web Proxy Standard
WPAD standard define method to retrieve location of PAC file using first DHCP or DNS if DHCP discovery fail or doesn’t exist (Firefox doesn’t support DHCP WPAD discovery). DHCP has a higher priority than DNS for automatic configuration. If DHCP provides the URL for configuration file, the process stops and the DNS lookup doesn’t happen.
For DHCP to work it need to support DHCPINFORM message, to obtain the DHCP options 252. Let first show configuration of that option on Windows Server DHCP.
First we need to add/configure that option on DHCP server level, and then to add that option to DHCP IP scope of our choice. Open DHCP management tools and right click on IPV4 and choose Set Predefined Options. In new window click Add and enter next values: Name: WPAD; Code : 252; Data type select String, and then click OK. In string type URL of PAC file : http://192.168.0.2/proxy.pac. It will be default value for this option. After you create it check for its existence. It should be present like on the picture below.
After that you need to turn on created option to IP scope. Right click Scope options, and then click Configure options. Select option 252 from existing list. Default location of script will be presented but you can change it.
For most of clients or browsers this setting is more than enough (except Firefox), but some clients have static ip addresses and they can not use DHCP. This is part where DNS comes in. If DHCP proxy discovery fails or doesn’t exist, DNS is next stop for WPAD. You need to create alias (CNAME) record in your local domain zone with name WPAD. It means that if your local domain name is contoso.com, client/browser will look for next URLs using WPAD method, trying to find autoproxy configuration file in next order
http://wpad.contoso.com/wpad.dat;
http://wpad.com/wpad.dat
wpad.dat vs proxy.pac
You probably noticed that client is looking for wpad.dat file. In our examples up to now we used proxy.pac naming. It would be beneficial to use wpad.dat file naming, even though, content of the file is same. Main reason is WPAD method mentioned above, where DNS discovery is trying to look for wpad.dat file. You can bypass it with HTTP URL rewrite rule on web site.
After yu setup everything usually what is happening is that if you try to resolve wpad entry in DNS you get nothing in response. Because of security reasons, and possible hijacking of wpad record in DNS, Microsoft decided to put wpad entry on DNS server global query block list. It exist from W2008 Server. To make it work you need to remove it with next command
after that your DNS resolution will work
Everything that is left is to click automatically detect setting button in browser or system proxy settings.
This should be the last post of proxy trilogy from me. I was really tired of collecting bits and pieces about proxy setting from around the web. somwhow it turns out it can be a small book. There is some more things about proxy configuration, but I will leave that for readers to discover.
I wish you to enjoy rest of this summer. I am going to use it also on vacation staring next week.
P.S
One more thing you can research is Autoprox.exe utility for testing and debugin your PAC file. Download link
If you like you can read also about optimizing PAC file functions on https://docs.microsoft.com/en-us/troubleshoot/developer/browsers/connectivity-navigation/optimize-pac-performance
Протокол WPAD (Web Proxy Auto-Discovery Protocol) позволяет упростить настройку параметров прокси сервера в браузерах на клиентах в вашей сети. Идея WPAD в том, что клиент сам обнаруживает (через DHCP или DNS) в вашей сети веб-сервер, где хранится конфигурационный файл с настройками прокси (
http://yourdomain/wpad.dat
).
Содержание:
- Настройка параметров прокси в файле wpad.dat
- Настройка WPAD записей в DHCP и DNS
- Использование WPAD с настройками прокси в браузерах
Настройка параметров прокси в файле wpad.dat
Правила использования прокси описываются в специальном файле PAC-файле (Proxy Auto Configuration). PAC файл имеет предопределенное имя wpad.dat. В этом файле указываются правила, в которых указано, нужно ли клиенту использовать прокси сервер при подключении или обращаться к запрошенному ресурсу (HTTP, HTTPS или FTP) напрямую.
В файле wpad.dat использует синтаксис Java-script. Вы можете задать адрес прокси сервера по-умолчанию, а также различные исключения и правила, когда клиент должен использовать (или не использовать) подключение через прокси.
Рассмотрим простой примера синтаксиса файла wpad.dat:
function FindProxyForURL(url, host)
{
if (shExpMatch(host, "127.0.0.1" )) {return "DIRECT";}
if (shExpMatch(host, "*/localhost*" )) {return "DIRECT";}
if (isInNet(host, "192.0.0.0", "255.0.0.0")) {return "DIRECT";}
if (isInNet(host, "10.0.0.0", "255.0.0.0")) {return "DIRECT";}
//отдельный прокси для одной подсети:
if (isInNet(myIpAddress(), "172.10.30.0", "255.255.255.0"))
{return "PROXY prx2.winitpro.ru:8080";
}
if (dnsDomainIs(host, "*.corp.winitpro.ru")) {return "DIRECT";}
// Локальные адреса с которыми нужно работать напрямую.
if (
shExpMatch(url,"http://*.winitpro.ru") ||
shExpMatch(url,"https://*.winitpro.ru") ||
shExpMatch(url,"ftp://*.winitpro.ru")
)
return "DIRECT";
// Если URL не содержит точек в адресе, то работаем напрямую.
if (isPlainHostName(host)) {return "DIRECT";}
if (shExpMatch(host,"bank.example.com")) {return "DIRECT";}
//используем отдельный прокси для одного домена
if (shExpMatch(url,"*.sbis.ru*")){return "PROXY prx2.winitpro.ru:8080";}
//адрес прокси-сервера по-умолчанию
return "PROXY proxy.winitpro.ru:3128";
}
PAC файл обычно состоит из одной функции
FindProxyForURL
, которая возвращает клиенту адрес прокси в зависимости от запрошенного URL адреса. В данном случае директива
return "DIRECT"
указывает, что для данных адресов и доменов нужно использовать прямое подключение (без прокси). Если сайт, к которому обращается клиент не подходит ни под одно из правил в файле WPAD, для доступа к нему используется прокси сервер
PROXY proxy.winitpro.ru:3128
.
В качестве прокси вы можете использовать любой из популярных прокси серверов, таких как squid или 3proxy.
PAC файл можно использовать в качестве средства простейшей фильтрации контента, чтобы запретить пользователям доступ к определенным сайтам или запретить обращаться к доменам с рекламой.
proxy_empty = "PROXY 127.0.0.1:3128"; // ссылка на несуществующий прокси
if ( shExpMatch(url,"*://twitter.com/*")) { return proxy_empty; }
if ( shExpMatch(url,"*://spam.*")) { return proxy_empty; }
if ( shExpMatch(url,"*doubleclick.net/*")) { return proxy_empty; }
В различных версиях ОС есть ограничения на максимальный размер PAC-файла. Для Windows – не превышайте размер 1 Мб.
Нужно разместить файл wpad.dat на HTTP веб сервере в локальной сети, который будет доступен для чтения всем пользователям. Можно использовать веб сервер на Linux (nginx, apache, lighttpd) или Windows (IIS, или даже простейший веб сервер на PowerShell).
В нашем примере я опубликую файл wpad.dat на веб сервере IIS на контроллере домена. Скопируйте файл wpad.dat в каталог C:\inetpub\wwwroot.
Если в вашей сети используются недоменные клиенты, нужно предоставить права на чтение каталога в IIS для «IUSR» и «IIS APPPOOL\DefaultAppPool.
Запустите консоли IIS Manager, в настройках сайта IIS выберите раздел MIME Types и добавьте новый тип:
- File name extension:
.dat
- MIME type:
application/x-ns-proxy-autoconfig
Перезапустите IIS.
Настройка WPAD записей в DHCP и DNS
Теперь нужно настроить сервера DHCP и DNS записи обнаружения PAC файла клиентами.
Если у вас используется сервер DHCP, можно задать адрес WPAD для клиентов с помощью опции 252.
В нашем примере для DHCP на Windows Server:
- Запустите консоль
dhcpmgmt.msc
, щелкните по разделу IPv4 и выберите опцию Set Predefined Options; - Нажмите кнопку Add и добавьте запись с параметрами:Name:
WPAD
Data type:
string
Code:
252
- Нажмите OK и укажите адрес вашего WPAD сервера (http://wpad.winitpro.ru);
- Затем откройте параметры DHCP области Scope Options и включите для нее опцию 252 WPAD (или настройте этот параметр в разделе Server Options).
Теперь нужно создать DNS записи типа A или CNAME для имени wpad в вашем домене.
Если у вас используется Active Directory, обратите внимание, что сервер Microsoft DNS по умолчанию блокирует использование имен wpad и isatap. Можете проверить это, выполнив команду:
dnscmd msk-dc02 /info /globalqueryblocklist
Чтобы разрешить использование этих имен в DNS, нужно выполнить команду:
dnscmd msk-dc02 /config /enableglobalqueryblocklist 0
Можно очистить этот список:
dnscmd /config /globalqueryblocklist
И добавить запись для isatap:
dnscmd /config /globalqueryblocklist isatap
Эти изменения нужно внести на всех DNS серверах.
Теперь создайте A запись с именем wpad, которая указывает на ваш веб-сервер, где находится WPAD файл. Можно создать A запись вручную через консоль DNS Manager (
dnsmgmt.msc
) или воспользоваться PowerShell командлетом Add-DnsServerResourceRecordA:
Add-DnsServerResourceRecordA -Name wpad -IPv4Address 192.168.13.10 -ZoneName winitpro.loc -TimeToLive 01:00:00
Использование WPAD с настройками прокси в браузерах
Теперь нужно настроить браузеры, чтобы при старте они автоматически получали PAC файл с настройками. Для этого в параметрах IE или в настройках прокси в Windows в панели Параметры (команда быстрого доступа
ms-settings:network-proxy
) должна быть включена опцию Automatic Detect Settings (Tools > Internet Options > Connections > LAN Settings).
Можно централизованно включи эту опцию с помощью групповой политики User Configuration -> Preferences -> Control Panel Settings -> Internet Settings –> New -> Internet Explorer 10.
Теперь браузеры на клиентских устройствах при загрузке будут искать wpad запись в DNS (или получат ее от DHCP). Если в сети найдет сервер с WPAD, браузер клиента скачает файл
http://wpad.%domain%/wpad.dat
, выполнит код JavaScript и применит правила прокси-сервера из PAC файла.
Windows например выполняет поиск имени wpad сначала по DNS, затем через Link-Local Multicast Name Resolution (LLMNR) и затем через NetBIOS (NBNS). Если LLMNR и NetBIOS отключены, используется только DNS поиск.
Вы можете проверить, что браузер использует PAC файл при доступе в интернет (для веб браузеров на движке Chromium: Google Chrome, Opera, Microsoft Edge):
- Откройте браузер и перейдите на
chrome://net-export/
- Выберите опцию Strip private information и нажмите кнопку Start Logging to Disk;
- Затем укажите имя json файла для сохранения данных;
- Нажмите Stop Logging;
- Откройте полученный json файл с помощью любого текстового редактора и выполните поиск по ключу
proxySettings
. В нашем примере видно, что браузер использует настройки прокси из wpad.dat:"proxySettings":{"effective":{"pac_url":"http://wpad/wpad.dat"},"original":{"auto_detect":true,"from_system":true}}
Если вы хотите запретить использовать WPAD на компьютере Windows, нужно создать параметр Dword параметр с именем DisableWpad и значением 1 в ветке
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp\
.
Настройка параметров прокси через файл WPAD (PAC) позволяет добавить гибкость, недоступные при настройке параметров прокси в Windows через GPO. Кроме того, WPAD поддерживается не только на Windows, но и на Linux, MacOS и мобильных устройствах.
Proxy PAC is a simple “hack” to force a client to pass through your proxy server, but in Windows10 doesn’t work anymore as regular file.
Before you could simply copy your proxy.pac file in the client drive, but now to work with Windows10 (and its folder limitations) you have to publish it, so the client can read it through a regular www session.
The proxy pac is not useful only in a private network but could be used also for capturing (and forcing the connection through your proxy) an external request.
A typical scenario could be that a client must connect to a specific website/domain showing the same public IP address from both LAN or external connection.
So the proxy PAC file could be something:
function FindProxyForURL(url, host){ var proxy_yes = "PROXY my_proxy_ip:3128"; var proxy_no = "DIRECT"; if (shExpMatch(url, "*mybank*")) { return proxy_yes; return proxy_no; } if (shExpMatch(url, "*mylanservice*")) { return proxy_yes; return proxy_no; } if (shExpMatch(url, "*bbc*")) { return proxy_yes; return proxy_no; } if (shExpMatch(url, "*whatever*")) { return proxy_yes; return proxy_no; } return proxy_no; }
Copy the proxy.pac configuration file in the root of your website (for example: /usr/local/www/data), then add proxy.pac internet path to your client or simply use a .reg file to do it (or force) automatically (for example upon a logon):
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings] "AutoConfigURL"="http://www.mywebsite.com/proxy.pac" [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\Internet Settings] "EnableLegacyAutoProxyFeatures"=dword:00000001 [HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Privacy] "EnableInPrivateBrowsing"=dword:00000000 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Internet Explorer\Privacy] "EnableInPrivateBrowsing"=dword:00000000
So the client that will connect to one or more patterns included in the proxy.pac file will be forced to navigate through your proxy server.
Of course if you want to intercept an external connection your proxy must be configured properly (pay attention to security), for example in Squid proxy (remember 1st to deny_all as last line) configuration file should appear a line like:
auth_param basic program /usr/local/libexec/squid/basic_ncsa_auth /usr/local/etc/squid/passwd
Long life to proxy pac!
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Sign up
Если автоматическая настройка сетевых параметров сегодня стала «нормой жизни» даже в небольших сетях, то автоматическое получение настроек прокси-сервера по-прежнему вызывает некоторые затруднения. Для этих целей существует протокол автоматической настройки прокси — 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.