Un archivo de Configuración Automática de Proxy (PAC) es un archivo JavaScript que los navegadores web y otros agentes de usuario ejecutan para determinar qué servidor proxy, si lo hay, usar para una URL determinada. Este mecanismo permite un control dinámico y granular sobre cómo se enruta el tráfico del cliente a través de una infraestructura de proxy.
Comprensión de los Archivos PAC
Un archivo PAC centraliza la lógica de configuración del proxy en un servidor web, eliminando la necesidad de ajustes manuales del proxy en el lado del cliente. Cuando un cliente está configurado para usar un archivo PAC, descarga y ejecuta el script antes de cada solicitud HTTP/HTTPS. La función principal del script, FindProxyForURL(url, host), devuelve una cadena que indica si se debe conectar directamente, usar un proxy específico o usar un proxy SOCKS.
Beneficios de Usar Archivos PAC
La implementación de archivos PAC ofrece varias ventajas operativas:
- Control Granular: Defina reglas de enrutamiento específicas basadas en patrones de URL, nombres de host, direcciones IP, hora del día o ubicación de red.
- Balanceo de Carga: Distribuya el tráfico entre múltiples servidores proxy para evitar la sobrecarga.
- Conmutación por Error (Failover): Especifique servidores proxy alternativos en caso de que el principal no esté disponible, mejorando la fiabilidad.
- Omitir Tráfico Específico: Dirija ciertos dominios internos o de confianza para que omitan el proxy por completo, reduciendo la latencia y el consumo de recursos.
- Configuración Simplificada del Cliente: Los clientes solo necesitan la URL del archivo PAC, simplificando la implementación y las actualizaciones. Los cambios en la lógica del proxy se realizan una vez en el servidor, no en cada cliente.
Estructura y Sintaxis del Archivo PAC
Un archivo PAC es un archivo de texto plano escrito en JavaScript, típicamente llamado proxy.pac o wpad.dat. El núcleo de un archivo PAC es la función FindProxyForURL(url, host), que debe estar presente.
Función FindProxyForURL(url, host)
Esta función toma dos argumentos:
* url: La URL completa del objeto que se solicita (por ejemplo, http://www.example.com/index.html).
* host: El nombre de host extraído de la URL (por ejemplo, www.example.com).
La función debe devolver un valor de cadena:
DIRECT: Conectar directamente al destino sin usar un proxy.PROXY <host>:<port>: Usar el servidor proxy HTTP especificado.SOCKS <host>:<port>: Usar el servidor proxy SOCKS especificado.- Múltiples opciones: Separe múltiples servidores proxy o un proxy y una conexión directa con punto y coma (por ejemplo,
PROXY proxy1.example.com:8080; PROXY proxy2.example.com:8080; DIRECT). El cliente intenta las conexiones en el orden especificado.
Funciones Comunes de JavaScript dentro de Archivos PAC
Las funciones estándar de JavaScript están disponibles, junto con varias funciones específicas del navegador diseñadas para la configuración automática de proxy:
isPlainHostName(host): Devuelvetruesihostno contiene un nombre de dominio (por ejemplo,localhost,intranet-server).dnsDomainIs(host, domain): Devuelvetruesihostpertenece adomain(por ejemplo,dnsDomainIs("www.example.com", ".example.com")).shExpMatch(str, pattern): Devuelvetruesistrcoincide conpatternusando la coincidencia de expresiones de shell (por ejemplo,shExpMatch("http://www.example.com/index.html", "http://*.example.com/*")).isInNet(host, pattern, mask): Devuelvetruesi la dirección IP dehostestá dentro de la red IPpatternymaskespecificadas (por ejemplo,isInNet(host, "192.168.1.0", "255.255.255.0")).hostpuede ser un nombre de host o una dirección IP.myIpAddress(): Devuelve la dirección IP de la máquina que ejecuta el navegador. Útil para decisiones de proxy basadas en la ubicación.dnsResolve(host): Resuelve el nombre de hosthosta una dirección IP. Devuelve una cadena vacía si la resolución falla.weekdayRange(wd1, wd2, gmt): Devuelvetruesi el día de la semana actual está en el rango especificado.wd1,wd2son abreviaturas (por ejemplo, "MON", "FRI").gmtes opcional para la hora GMT.dateRange(day1, month1, year1, day2, month2, year2, gmt): Devuelvetruesi la fecha actual está en el rango especificado.timeRange(hour1, min1, sec1, hour2, min2, sec2, gmt): Devuelvetruesi la hora actual está en el rango especificado.
Ejemplo de Archivo PAC
Este ejemplo demuestra cómo omitir dominios internos, enrutar tráfico específico e implementar la conmutación por error.
function FindProxyForURL(url, host) {
// Define sus servidores proxy
var PRIMARY_PROXY = "PROXY proxy.example.com:8080";
var SECONDARY_PROXY = "PROXY backup-proxy.example.com:8080";
var SOCKS_PROXY = "SOCKS socks.example.com:1080";
// 1. Conexión directa para hosts locales y dominios internos
// Omitir proxy para nombres de host simples (por ejemplo, "localhost", "intranet-server")
if (isPlainHostName(host)) {
return "DIRECT";
}
// Omitir proxy para un dominio interno específico
if (dnsDomainIs(host, ".internal-domain.com")) {
return "DIRECT";
}
// Omitir proxy para rangos IP internos específicos
// Nota: myIpAddress() devuelve la IP del cliente. Esto verifica si el *destino* es interno.
// Para verificar la IP del cliente, use myIpAddress() e isInNet.
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";
}
// 2. Usar proxy SOCKS para aplicaciones o protocolos específicos
// Ejemplo: Enrutar todo el tráfico FTP a través de un proxy SOCKS
if (url.substring(0, 4) == "ftp:") {
return SOCKS_PROXY;
}
// 3. Enrutar dominios externos específicos a través de un proxy primario con conmutación por error
// Ejemplo: Enrutar el tráfico a partner-site.com a través del proxy primario,
// con un respaldo a un proxy secundario.
if (dnsDomainIs(host, ".partner-site.com")) {
return PRIMARY_PROXY + "; " + SECONDARY_PROXY;
}
// 4. Bloquear URLs específicas (devolviendo un proxy inexistente o un error)
// Nota: Algunos navegadores podrían tratar "PROXY 0.0.0.0:0" como un bloqueo.
// Un mecanismo de bloqueo más robusto se maneja típicamente por el propio proxy.
if (shExpMatch(url, "*bad-site.com*")) {
// Devolver un proxy inexistente para bloquear eficazmente, o usar un proxy de bloqueo específico
return "PROXY 127.0.0.1:1"; // O un proxy de bloqueo dedicado
}
// 5. Regla predeterminada: Todo el demás tráfico pasa por el proxy primario con conmutación por error
return PRIMARY_PROXY + "; " + SECONDARY_PROXY + "; DIRECT";
}
Implementación y Distribución
Para que los clientes utilicen un archivo PAC, deben estar configurados para recuperarlo.
Vía Servidor HTTP/HTTPS
El método más común es alojar el archivo PAC en un servidor web estándar (Apache, Nginx, IIS) y configurar los navegadores o sistemas operativos del cliente con su URL.
* Configuración del Servidor: Asegúrese de que el servidor sirva el archivo PAC con el tipo MIME correcto: application/x-ns-proxy-autoconfig.
* Configuración del Cliente: En la configuración del navegador (o la configuración de red del SO), especifique la opción "Usar script de configuración automática de proxy" y proporcione la URL completa (por ejemplo, http://proxyconfig.example.com/proxy.pac).
Protocolo de Detección Automática de Proxy Web (WPAD)
WPAD permite a los clientes descubrir automáticamente la URL del archivo PAC sin configuración manual. Esto típicamente implica:
1. DNS: Crear una entrada DNS para wpad.<dominio> que apunte al servidor web que aloja wpad.dat.
2. DHCP: Configurar una opción DHCP (opción 252) para proporcionar la URL del archivo PAC.
Aunque conveniente, WPAD tiene implicaciones de seguridad (por ejemplo, potencial de servidores WPAD maliciosos) y a menudo se deshabilita o se usa con precaución. La configuración directa de la URL generalmente se prefiere por seguridad y control explícito.
Objetos de Política de Grupo (GPO) para Windows
En dominios de Windows, las URLs de archivos PAC pueden distribuirse centralmente a las máquinas cliente usando la Política de Grupo:
* Navegue a Configuración de usuario > Políticas > Configuración de Windows > Mantenimiento de Internet Explorer > Conexión > Configuración de proxy.
* Habilite "Configuración automática" y proporcione la URL del archivo PAC.
Solución de Problemas de Archivos PAC
Los problemas con los archivos PAC a menudo se derivan de errores de sintaxis, caché o problemas de red.
- Errores de Sintaxis: Incluso errores menores de JavaScript pueden impedir que el archivo PAC funcione. Use un linter de JavaScript o un validador de archivos PAC dedicado. Los navegadores pueden registrar errores en su consola de desarrollador (por ejemplo, F12 en Chrome/Firefox).
- Tipo MIME Incorrecto: Si el servidor web sirve el archivo PAC con un tipo MIME incorrecto, los clientes pueden no procesarlo correctamente. Verifique
application/x-ns-proxy-autoconfig. - Problemas de Caché: Los navegadores almacenan en caché agresivamente los archivos PAC. Al realizar cambios, borre la caché del navegador o fuerce una actualización (por ejemplo,
Ctrl+F5). Algunos navegadores ofrecen una opción para deshabilitar el almacenamiento en caché de archivos PAC para depuración. - Accesibilidad de la Red: Asegúrese de que el cliente pueda alcanzar el servidor web que aloja el archivo PAC. Verifique la resolución de DNS y las reglas del firewall.
- Función
FindProxyForURL: Confirme que la funciónFindProxyForURL(url, host)está correctamente definida y devuelve cadenas de proxy válidas. - Herramientas de Prueba: Las herramientas de desarrollador del navegador (pestaña Red) pueden mostrar qué proxy se usó para una solicitud. Los probadores de archivos PAC en línea pueden simular solicitudes contra su script.
Archivo PAC vs. Otros Métodos de Configuración de Proxy
| Característica | Archivo PAC | Configuración Directa de Proxy | WPAD |
|---|---|---|---|
| Método de Configuración | URL de script JavaScript | Entrada manual de IP/Puerto | Detección automática vía DNS/DHCP |
| Control Granular | Alto (basado en lógica) | Bajo (todo el tráfico va a un proxy o directo) | Alto (usa archivo PAC) |
| Conmutación por Error/Balanceo de Carga | Sí (integrado en la lógica del script) | No (proxy único) | Sí (integrado en la lógica del archivo PAC) |
| Reglas de Omisión | Sí (integrado en la lógica del script) | Lista de exclusiones manual | Sí (integrado en la lógica del archivo PAC) |
| Complejidad de Implementación | Moderada (alojar archivo en servidor web, configurar URL) | Baja (manual por cliente) | Alta (configuración DNS/DHCP, servidor web) |
| Mantenimiento | Centralizado (editar script en el servidor) | Descentralizado (manual por cliente) | Centralizado (editar script en el servidor, DNS/DHCP) |
| Consideraciones de Seguridad | Inyección de script, distribución no cifrada | Básica | Suplantación de DNS/DHCP (mayor riesgo), inyección de script |
Consideraciones de Seguridad
- Integridad: Los archivos PAC contienen información de enrutamiento sensible. Asegúrese de que el archivo PAC esté alojado en un servidor web seguro y de confianza y se entregue a través de HTTPS para evitar manipulaciones o intercepciones durante la descarga.
- Scripts Maliciosos: Un archivo PAC comprometido puede redirigir el tráfico del cliente a proxies maliciosos, facilitando ataques de intermediario (man-in-the-middle), recolección de credenciales o exfiltración de datos. Use archivos PAC solo de fuentes confiables.
- Divulgación de Información: Evite incluir detalles sensibles de la red interna en archivos PAC que sean de acceso público. Aunque el archivo en sí es código, su lógica puede revelar la topología de la red.
- Vulnerabilidades de WPAD: El mecanismo de detección automática de WPAD puede ser explotado si un atacante puede controlar las respuestas de DNS o DHCP, dirigiendo a los clientes a un servidor WPAD malicioso. Use WPAD con precaución y las medidas de seguridad adecuadas.