INTEGRITY Dokumentace

Osvědčené postupy pro soubory PAC

Soubor PAC je textový soubor, který určuje, jaký provoz se má přesměrovat na proxy server. Když prohlížeč vytvoří webový požadavek, podívá se do souboru PAC na jeho FindProxyForURL() funkci, která vyhodnotí požadavek a vrátí pokyny pro směrování, například přímé připojení, proxy server nebo sekvenci failover.

Formát souboru PAC

Výchozí soubor PAC Cloudflare má standardní formát:

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";
}

Můžete přizpůsobit soubor PAC a umístěte jej někam, kam má váš prohlížeč přístup.

Úvahy o formátování

Šablona souboru PAC s obejitím poskytovatele identity

Při použití autorizační endpointy, musíte v souboru PAC obejít domény poskytovatele identity (IdP). Tím zabráníte smyčkám ověřování, kdy se prohlížeč pokouší ověřit u proxy dříve, než se dostane k IdP a ověří se tam.

Následující ukázkový soubor PAC je komplexní šablona, která zahrnuje běžná pravidla pro obejití IdP. Nahraďte zástupné hodnoty svou konfigurací:

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";
}

Optimalizace výkonu

Prohlížeče vyhodnocují soubory PAC při každém požadavku. Optimalizace výkonu souborů PAC je klíčová, aby uživatelům nevznikaly zpoždění a problémy při procházení webu.

Mezipaměť výsledků DNS v proměnných

Při provádění překladu DNS pomocí dnsResolve(), uložte výsledek do proměnné, abyste ho mohli znovu použít napříč více kontrolami. Tím se předejde zbytečným DNS dotazům:

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";
}

Nejprve zkontrolujte obyčejné hostname

Názvy NetBIOS (hostitelské názvy bez teček) jsou obvykle interní a měly by obcházet proxy. Nejprve zkontrolujte tyto:

if (isPlainHostName(host)) return "DIRECT";

Pokročilé techniky

Zpracování rozlišování velkých a malých písmen

JavaScript rozlišuje velká a malá písmena. Pro konzistentní porovnávání převádějte názvy hostitelů na malá písmena:

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";
}

Časté pravidla pro obcházení

Pokud používáte soubory PAC i pro procházení veřejného internetu, a ne jen interních služeb, může být pro některé domény potřeba proxy obejít, aby nedocházelo k problémům s funkčností webu. Následují typické scénáře, kdy může proxy zasahovat do provozu.

Poskytovatelé fontů a statického obsahu

Poskytovatelé Font API a statického obsahu by obvykle měli obcházet proxy, aby se předešlo problémům s vykreslováním:

// Bypass font providers
if (
	shExpMatch(host, "*.googleapis.com") ||
	shExpMatch(host, "*.gstatic.com") ||
	shExpMatch(host, "fonts.adobe.com")
) {
	return "DIRECT";
}

Streamování a mediální služby

Streamování videa a stahování rozsáhlých mediálních souborů může fungovat lépe s přímými připojeními:

// Bypass streaming services
if (
	shExpMatch(host, "*.netflix.com") ||
	shExpMatch(host, "*.youtube.com") ||
	shExpMatch(host, "*.googlevideo.com")
) {
	return "DIRECT";
}

Aplikace s připnutím certifikátu

Když je zapnutá kontrola HTTPS, aplikace a služby, které používají připnutí certifikátu (certificate pinning), odmítnou certifikát vložený Cloudflare a při směrování přes proxy se nenačtou. Tyto domény obejděte ve svém souboru PAC:

// Bypass certificate-pinned apps
if (
	shExpMatch(host, "*.example-bank.com") ||
	shExpMatch(host, "*.example-pinned-app.com")
) {
	return "DIRECT";
}

zásady Do Not Inspect (DNI) nezabrání chybám certificate pinning u těchto připojení, je nutné v souboru PAC obejít aplikace využívající certificate pinning.

Testování souborů PAC

Otestujte pomocí očekávaných webů

Před nasazením souboru PAC všem uživatelům ve vaší organizaci ho otestujte s weby a aplikacemi, které vaši uživatelé běžně používají. Pomůže vám to zajistit:

Ověřit syntaxi

Soubory PAC používají syntaxi JavaScriptu. Jediná syntaktická chyba (například chybějící uzavírací závorka ) nebo závorku ]) způsobí selhání celého souboru PAC. Před nasazením použijte textový editor s podporou JavaScriptu, abyste našli a opravili syntaktické chyby.

Odstraňování problémů s konfiguracemi

Ladění směrovacích rozhodnutí souboru PAC

Pokud máte problém se směrováním přes proxy, většina prohlížečů nabízí nástroje pro ladění, kterými můžete ověřit chování souboru PAC:

Prohlížeče založené na Chromiu (Chrome, Edge, Brave)

  1. V prohlížeči přejděte na chrome://net-export/ (nebo edge://net-export/).
  2. Vyberte Spustit protokolování na disk.
  3. Přejděte na web, který chcete otestovat v postiženém prohlížeči.
  4. Vyberte Zastavit protokolování.
  5. Otevřete stažený soubor pomocí netlog-viewer.
  6. Vyhledejte svou doménu a zobrazte rozhodnutí o rozlišení proxy.

Firefox

  1. Ve Firefoxu přejděte do Nástroje > Nástroje prohlížeče > Konzole prohlížeče.
  2. Přejděte na web, který chcete otestovat v postiženém prohlížeči.
  3. Vyhledejte zprávy týkající se překladu proxy.

Safari

  1. V Safari přejděte do Safari > Nastavení, pak vyberte Pokročilé.
  2. Zapněte Zobrazit nabídku Vývoj v panelu nabídek.
  3. Vyberte Vývoj > Zobrazit Web Inspector.
  4. Přejděte na Síť kartě.
  5. Zkontrolujte podrobnosti požadavku a ověřte použití proxy.

Procházení na zařízení pomocí souboru PAC je pomalé

Nadměrný počet vyhledávání DNS v souboru PAC může způsobit zpoždění. Zkontrolujte svůj soubor PAC a omezte používání dnsResolve(), isInNet(), a isResolvable() funkce.

Prohlížeč ukládá soubory PAC do mezipaměti nesprávně

Když aktualizujete soubor PAC, prohlížeče mohou nadále používat verzi uloženou v mezipaměti, což způsobí neočekávané chování. Po aktualizaci souboru PAC vymažte mezipaměť prohlížeče a prohlížeč restartujte, aby se zajistilo použití nejnovější verze.