Корпоративный прокси: PAC, WPAD и почему netsh winhttp не видит настройки браузера
Очень частая картина в корпоративной сети: браузер открывает сайты (через прокси), а Windows Update, Microsoft Store и служебные компоненты — нет. Или наоборот. Причина в том, что в Windows две независимые подсистемы прокси, и они не синхронизируются автоматически.
Две подсистемы
| WinINET | WinHTTP | |
|---|---|---|
| Кто использует | браузеры (Edge/Chrome через системные настройки), приложения с UI | службы, Windows Update, служебные компоненты, часть установщиков |
| Область | профиль пользователя | машина |
| Где настраивается | Параметры → Сеть и Интернет → Прокси; реестр HKCU\...\Internet Settings |
netsh winhttp / advproxy |
| PAC/WPAD | поддерживается | поддерживается (через AutoProxySvc) |
| SOCKS5 | да (в браузере) | нет |
Отсюда классика: пользователь настроил прокси в браузере, но служба, работающая от SYSTEM, этих настроек не видит.
Как проверить обе подсистемы
WinINET (пользователь):
Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" |
Select-Object ProxyEnable, ProxyServer, ProxyOverride, AutoConfigURL
WinHTTP (машина):
netsh winhttp show proxy
Если первая команда показывает прокси, а вторая — «Direct access (no proxy server)», вы нашли причину.
Что изменилось с netsh winhttp
Microsoft переводит настройку прокси WinHTTP на новые командлеты/утилиту advproxy. Старые команды netsh winhttp set proxy и netsh winhttp show proxy помечены как устаревшие (deprecated) — они продолжают работать, но в новых сборках и документации рекомендуется advproxy.
Практический совет: в скриптах и инструкциях проверяйте, какая утилита доступна в вашей версии Windows, и фиксируйте это в документации.
PAC и WPAD
PAC (Proxy Auto-Config) — это JavaScript-файл с функцией FindProxyForURL(url, host), которая возвращает строку вида PROXY proxy.corp.local:8080; DIRECT. Браузер (и WinHTTP, если настроено) загружает его и решает, куда отправлять каждый запрос.
WPAD (Web Proxy Auto-Discovery) — автоматический поиск PAC-файла: через DHCP-опцию 252 или DNS-имя wpad.<домен>. Уязвим к подмене, поэтому в современных сетях часто отключён.
Проверка:
# адрес PAC в пользовательских настройках
(Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings").AutoConfigURL
# служба автопоиска
Get-Service WinHttpAutoProxySvc
Если WinHttpAutoProxySvc остановлена, WPAD и часть сценариев PAC для служб работать не будут.
Почему браузер работает, а обновления нет
- Прокси задан только в WinINET (пользователь).
- WinHTTP настроен напрямую.
- Служба обновлений выходит в интернет без прокси и получает таймаут.
Решение — настроить WinHTTP отдельно:
# пример: явный прокси для служб
netsh winhttp set proxy proxy.corp.local:8080 bypass-list="*.corp.local;<local>"
# или через PAC: в качестве proxy-server указывается полный адрес .dat-файла,
# который раздаёт ваш прокси-сервер (схема http, путь /wpad.dat)
netsh winhttp set proxy proxy-server="<адрес-PAC-файла>"
Обратите внимание на синтаксис: параметр называется proxy-server, но принимает и адрес PAC-файла — Windows отличает его по расширению. После смены настроек службы, уже держащие соединение, могут продолжать работать по-старому: перезапустите затронутую службу или компьютер.
Проверка:
netsh winhttp show proxy
Обратный случай: VPN и прокси конфликтуют
При подключении VPN внутренние ресурсы могут быть доступны напрямую, но системный прокси продолжает отправлять запросы на внешний прокси-сервер, который из туннеля недоступен. Симптомы: таймауты, «сайт не отвечает».
Что проверить:
ProxyOverride/ bypass-list — содержит ли внутренние домены;- PAC-файл — учитывает ли он адреса, доступные через VPN;
- не задан ли прокси с внешним IP, недоступным из корпоративной сети.
Bypass-список: что в него кладут
Bypass-list (в WinINET — ProxyOverride) перечисляет адреса, которые идут напрямую. Минимальный рабочий набор для корпоративной машины:
*.corp.local— внутренние домены;10.*,192.168.*,172.16.*— внутренние подсети (в PAC это описывают черезisInNet);<local>— имена без точки (принтеры, NAS по NetBIOS/mDNS);- адреса серверов обновлений и антивирусного ПО, если они доступны напрямую.
Два подводных камня:
- Слишком широкий bypass — трафик уходит мимо прокси, и компания теряет логирование/фильтрацию. Это нарушение политики, а не оптимизация.
- Пустой bypass — внутренние адреса начинают ходить через прокси, который из корпоративной сети может быть недоступен; получаются таймауты на каждом локальном запросе.
Правило: bypass-список должен совпадать с тем, что описано в политике прокси, и обновляться вместе с ней.
Другие подсистемы, которые путают с системным прокси
- Браузер Chromium берёт настройки из WinINET, но может иметь свои расширения-прокси и флаги запуска.
- .NET-приложения читают
defaultProxyизmachine.config/app.configили переменные окружения. - Java использует
-Dhttp.proxyHostиjava.net.useSystemProxies. - WSL и контейнеры имеют собственные сетевые пространства; системный прокси Windows им не передаётся автоматически.
- Приложения Electron часто используют Chromium-стек напрямую.
Если «не работает только одно приложение», проверяйте не netsh winhttp, а конфигурацию самого приложения.
Типичные ошибки
- Считать, что настройка браузера = настройка системы. Это разные подсистемы.
- Использовать SOCKS5 для WinHTTP. WinHTTP его не поддерживает — нужен HTTP-прокси или PAC.
- Оставлять WPAD включённым в незащищённой сети. Риск подмены PAC.
- Жёстко прописывать прокси-IP. При смене инфраструктуры всё ломается; PAC удобнее.
- Забыть про bypass-список. Внутренние адреса начнут ходить через прокси и тормозить.
Диагностика
# проверка доступности прокси
Test-NetConnection proxy.corp.local -Port 8080
# какие настройки видит служба
netsh winhttp show proxy
# журнал AutoProxySvc
Get-WinEvent -LogName System -MaxEvents 50 |
Where-Object ProviderName -like "*WinHttp*"
Ограничения
- Часть приложений (Java, .NET, Electron) использует свои настройки прокси и игнорирует системные.
- Поведение
netsh winhttpиadvproxyзависит от версии Windows. - WPAD в современных сетях часто отключён политикой.
- PAC-файл может содержать ошибки JavaScript — тогда автоконфигурация молча не работает.
FAQ
Почему браузер открывает сайты, а Windows Update — нет? Прокси задан только для WinINET (пользователь). Для служб нужна отдельная настройка WinHTTP.
Поддерживает ли WinHTTP SOCKS5? Нет. Нужен HTTP-прокси или PAC.
Что лучше: PAC или фиксированный прокси? PAC гибче: можно направлять разные адреса по-разному. Фиксированный проще, но ломается при изменении инфраструктуры.
Почему netsh winhttp показывает «Direct access»? Настройки WinHTTP не заданы, даже если в браузере прокси включён.
Нужен ли WPAD? В большинстве современных сетей — нет; используйте явный PAC-адрес.