← Cloudflare One / cloudflare-one / networks / resolvers-and-proxies / proxy-endpoints
Рекомендации по PAC-файлам
PAC-файл представляет собой текстовый файл, который определяет, какой трафик нужно перенаправлять на прокси-сервер. Когда браузер отправляет веб-запрос, он обращается к функции PAC-файла FindProxyForURL() функцию, которая оценивает запрос и возвращает инструкции по маршрутизации, такие как прямое соединение, прокси-сервер или последовательность отказоустойчивости.
Формат PAC-файла
PAC-файл Cloudflare по умолчанию имеет следующий стандартный формат:
function FindProxyForURL(url, host) {
// No proxy for private (RFC 1918) IP addresses (intranet sites)
if (
isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0")
) {
return "DIRECT";
}
// No proxy for localhost
if (isInNet(dnsResolve(host), "127.0.0.0", "255.0.0.0")) {
return "DIRECT";
}
// Proxy all
return "HTTPS 3ele0ss56t.proxy.cloudflare-gateway.com:443";
}Вы можете настроить файл PAC ↗ и разместите его там, где к нему сможет обратиться ваш браузер.
Особенности форматирования
- Убедитесь, что директива, используемая для endpoint, равна
HTTPSи неPROXY. Например:- Правильно:
return "HTTPS your-subdomain.proxy.cloudflare-gateway.com:443"; - Неверно:
return "PROXY your-subdomain.proxy.cloudflare-gateway.com:443";
- Правильно:
- Вместо того чтобы указывать конечную точку напрямую в настройках прокси браузера, нужно использовать PAC-файл: современные браузеры не поддерживают HTTPS-прокси без PAC-файлов.
- Используйте текстовый редактор, например VS Code, чтобы избежать лишних символов.
- Если вы используете файлы PAC для просмотра общедоступного интернета (а не только для внутренних служб), см. Распространённые правила обхода для доменов, которые может потребоваться исключить из прокси, чтобы избежать проблем с работой сайтов.
Шаблон PAC-файла с обходом поставщика идентификации
При использовании конечные точки авторизации, вам необходимо исключить домены вашего поставщика идентификации (IdP) в PAC-файле. Это позволяет избежать циклов аутентификации, когда браузер пытается пройти аутентификацию через прокси прежде, чем успевает обратиться к IdP.
Следующий пример PAC-файла представляет собой подробный шаблон, включающий типичные правила обхода IdP. Замените значения-заполнители своей конфигурацией:
function FindProxyForURL(url, host) {
// *** Identity Provider Bypass ***
// CRITICAL: Bypass your IdP to prevent authentication loops
// Uncomment and configure the section for your IdP:
// Okta
// if (host === "your-domain.okta.com" || shExpMatch(host, "*.oktacdn.com")) {
// return "DIRECT";
// }
// Microsoft Entra ID (Azure AD)
// if (
// host === "login.microsoftonline.com" ||
// host === "aadcdn.msauth.net" ||
// host === "aadcdn.msftauth.net"
// ) {
// return "DIRECT";
// }
// Google Workspace
// if (
// host === "accounts.google.com" ||
// shExpMatch(host, "*.gstatic.com")
// ) {
// return "DIRECT";
// }
// GitHub
// if (shExpMatch(host, "*.github.com")) {
// return "DIRECT";
// }
// *** Private Networks ***
// Bypass private RFC 1918 IP addresses
if (
isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0")
) {
return "DIRECT";
}
// Bypass localhost
if (isInNet(dnsResolve(host), "127.0.0.0", "255.0.0.0")) {
return "DIRECT";
}
// Bypass plain hostnames (no dots)
if (isPlainHostName(host)) {
return "DIRECT";
}
// Bypass .local domains
if (shExpMatch(host, "*.local")) {
return "DIRECT";
}
// *** Cloudflare Access Logout ***
// Optional: Redirect logout requests to your Access logout page
// if (shExpMatch(url, "*logout*")) {
// return "HTTPS your-team-name.cloudflareaccess.com/cdn-cgi/access/logout";
// }
// *** Proxy all other traffic ***
return "HTTPS your-subdomain.proxy.cloudflare-gateway.com:443";
}Оптимизация производительности
Браузеры обрабатывают PAC-файл при каждом запросе. Оптимизация производительности PAC-файла крайне важна, чтобы избежать задержек и проблем при просмотре веб-страниц у ваших пользователей.
Кэширование результатов DNS в переменных
При выполнении DNS-разрешения с помощью dnsResolve(), сохраните результат в переменной, чтобы использовать её в нескольких проверках. Это позволяет избежать повторных DNS-запросов:
function FindProxyForURL(url, host) {
// Resolve once and reuse
var hostIP = dnsResolve(host);
if (isInNet(hostIP, "10.0.0.0", "255.0.0.0")) {
return "DIRECT";
}
// Reuse hostIP for additional checks
if (isInNet(hostIP, "172.16.0.0", "255.240.0.0")) {
return "DIRECT";
}
return "HTTPS proxy.example.com:443";
}Сначала проверить обычные имена хостов
Имена NetBIOS (имена хостов без точек) обычно являются внутренними и должны обходить прокси. Сначала проверьте их:
if (isPlainHostName(host)) return "DIRECT";Расширенные техники
Обработка учёта регистра
В JavaScript учитывается регистр символов. Для единообразного сопоставления преобразуйте имена хостов в нижний регистр:
function FindProxyForURL(url, host) {
// Normalize to lowercase
host = host.toLowerCase();
url = url.toLowerCase();
if (shExpMatch(host, "*.example.com")) {
return "DIRECT";
}
return "HTTPS proxy.cloudflare-gateway.com:443";
}Распространённые правила обхода
При использовании PAC-файлов для просмотра публичного интернета (а не только внутренних сервисов) может потребоваться исключить определенные домены из-под действия прокси, чтобы избежать проблем с работой сайтов. Ниже перечислены типичные сценарии, в которых прокси может мешать прохождению трафика.
Поставщики шрифтов и статических ресурсов
API шрифтов и поставщики статических ресурсов обычно должны обходить прокси, чтобы избежать проблем с отображением:
// Bypass font providers
if (
shExpMatch(host, "*.googleapis.com") ||
shExpMatch(host, "*.gstatic.com") ||
shExpMatch(host, "fonts.adobe.com")
) {
return "DIRECT";
}Потоковое вещание и медиасервисы
Потоковое видео и загрузка больших медиафайлов могут работать быстрее при прямом подключении:
// Bypass streaming services
if (
shExpMatch(host, "*.netflix.com") ||
shExpMatch(host, "*.youtube.com") ||
shExpMatch(host, "*.googlevideo.com")
) {
return "DIRECT";
}Приложения с закреплением сертификатов
Когда включена проверка HTTPS, приложения и сервисы, использующие закрепление сертификатов, отклоняют сертификат, добавленный Cloudflare, и не загружаются при прохождении через прокси. Исключите эти домены в вашем PAC-файле:
// Bypass certificate-pinned apps
if (
shExpMatch(host, "*.example-bank.com") ||
shExpMatch(host, "*.example-pinned-app.com")
) {
return "DIRECT";
}Политики Do Not Inspect (DNI) не устранит ошибки certificate pinning для этих соединений: необходимо обойти приложения с certificate pinning в PAC-файле.
Тестирование файлов PAC
Протестировать на ожидаемых веб-сайтах
Перед развертыванием файла PAC для всех пользователей организации протестируйте его на сайтах и в приложениях, которыми обычно пользуются ваши сотрудники. Это поможет убедиться в следующем:
- Внутренние ресурсы доступны и не перенаправляются ошибочно через прокси
- Внешние веб-сайты корректно фильтруются через Gateway
- Производительность приемлема для типичных сценариев использования
Проверить синтаксис
PAC-файлы используют синтаксис JavaScript. Одна синтаксическая ошибка (например, отсутствующая закрывающая скобка ) или скобку ]) приведёт к сбою всего PAC-файла. Используйте текстовый редактор с поддержкой JavaScript, чтобы найти и исправить синтаксические ошибки перед развёртыванием.
Устранение неполадок конфигураций
Отладка решений маршрутизации в файле PAC
Если у вас возникла проблема с маршрутизацией через прокси, в большинстве браузеров есть инструменты отладки для проверки работы PAC-файла:
Браузеры на основе Chromium (Chrome, Edge, Brave)
- В браузере перейдите в
chrome://net-export/(илиedge://net-export/). - Выберите Начать запись на диск.
- Перейдите на сайт, который нужно проверить в затронутом браузере.
- Выберите Остановить журналирование.
- Откройте загруженный файл с помощью netlog-viewer ↗.
- Найдите свой домен, чтобы увидеть решения о его разрешении через прокси.
Firefox
- В Firefox перейдите в Инструменты > Инструменты браузера > Browser Console.
- Перейдите на сайт, который нужно проверить в затронутом браузере.
- Найдите сообщения, связанные с разрешением прокси-сервера.
Safari
- В Safari перейдите в Safari > Настройки, затем выберите Продвинутый уровень.
- Включите Показать меню Разработка в строке меню.
- Выберите Разработка > Показать Web Inspector.
- Перейдите в Сеть на вкладке.
- Проверьте использование прокси-сервера, изучив детали запроса.
Медленный просмотр веб-страниц на устройстве, использующем PAC-файл
Избыточные DNS-запросы в PAC-файле могут вызывать задержки. Проверьте свой PAC-файл и сведите к минимуму использование dnsResolve(), isInNet(), а также isResolvable() функции.
Браузер некорректно кеширует PAC-файлы
При обновлении PAC-файла браузеры могут продолжать использовать кешированную версию, что приводит к непредвиденному поведению. После обновления PAC-файла очистите кеш браузера и перезапустите его, чтобы браузер использовал актуальную версию.