INTEGRITY Документация

Рекомендации по PAC-файлам

PAC-файл представляет собой текстовый файл, который определяет, какой трафик нужно перенаправлять на прокси-сервер. Когда браузер отправляет веб-запрос, он обращается к функции PAC-файла FindProxyForURL() функцию, которая оценивает запрос и возвращает инструкции по маршрутизации, такие как прямое соединение, прокси-сервер или последовательность отказоустойчивости.

Формат PAC-файла

PAC-файл Cloudflare по умолчанию имеет следующий стандартный формат:

default-pac.js
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 и разместите его там, где к нему сможет обратиться ваш браузер.

Особенности форматирования

Шаблон PAC-файла с обходом поставщика идентификации

При использовании конечные точки авторизации, вам необходимо исключить домены вашего поставщика идентификации (IdP) в PAC-файле. Это позволяет избежать циклов аутентификации, когда браузер пытается пройти аутентификацию через прокси прежде, чем успевает обратиться к IdP.

Следующий пример PAC-файла представляет собой подробный шаблон, включающий типичные правила обхода IdP. Замените значения-заполнители своей конфигурацией:

pac-idp-template.js
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 для всех пользователей организации протестируйте его на сайтах и в приложениях, которыми обычно пользуются ваши сотрудники. Это поможет убедиться в следующем:

Проверить синтаксис

PAC-файлы используют синтаксис JavaScript. Одна синтаксическая ошибка (например, отсутствующая закрывающая скобка ) или скобку ]) приведёт к сбою всего PAC-файла. Используйте текстовый редактор с поддержкой JavaScript, чтобы найти и исправить синтаксические ошибки перед развёртыванием.

Устранение неполадок конфигураций

Отладка решений маршрутизации в файле PAC

Если у вас возникла проблема с маршрутизацией через прокси, в большинстве браузеров есть инструменты отладки для проверки работы PAC-файла:

Браузеры на основе Chromium (Chrome, Edge, Brave)

  1. В браузере перейдите в chrome://net-export/ (или edge://net-export/).
  2. Выберите Начать запись на диск.
  3. Перейдите на сайт, который нужно проверить в затронутом браузере.
  4. Выберите Остановить журналирование.
  5. Откройте загруженный файл с помощью netlog-viewer.
  6. Найдите свой домен, чтобы увидеть решения о его разрешении через прокси.

Firefox

  1. В Firefox перейдите в Инструменты > Инструменты браузера > Browser Console.
  2. Перейдите на сайт, который нужно проверить в затронутом браузере.
  3. Найдите сообщения, связанные с разрешением прокси-сервера.

Safari

  1. В Safari перейдите в Safari > Настройки, затем выберите Продвинутый уровень.
  2. Включите Показать меню Разработка в строке меню.
  3. Выберите Разработка > Показать Web Inspector.
  4. Перейдите в Сеть на вкладке.
  5. Проверьте использование прокси-сервера, изучив детали запроса.

Медленный просмотр веб-страниц на устройстве, использующем PAC-файл

Избыточные DNS-запросы в PAC-файле могут вызывать задержки. Проверьте свой PAC-файл и сведите к минимуму использование dnsResolve(), isInNet(), а также isResolvable() функции.

Браузер некорректно кеширует PAC-файлы

При обновлении PAC-файла браузеры могут продолжать использовать кешированную версию, что приводит к непредвиденному поведению. После обновления PAC-файла очистите кеш браузера и перезапустите его, чтобы браузер использовал актуальную версию.