SafeChildren Banner

Havoc Oracle Solaris Experts

lunes, 28 de septiembre de 2009

Configuración Automática Proxy usando archivo PAC

Introducción
Básicamente el sistema de autoconfiguración no es más que un método JavaScript que devuelve si ha de utilizar proxy o no y el navegador hace una llamada a FinProxyForURL(url,host) por cada URL que quiere visitar.

UPDATED:  He creado una versión nueva, donde se muestra una solución a los equipos que, por diferentes motivos necesitan archivos de configuració dinámicos. Puedes ver el post de Archivos de Configuración Automática Múltiples Localizaciones

La función FindProxyForURL(url,host)
Esta función es la que indicará al navegador si debe utilizar un proxy o no, para ello debe devolver los siguientes valores
  • DIRECT. La URL se puede alcanzar sin Proxy
  • PROXY _proxy:port_. La URL debe utilizar el proxy
A continuación se muestra un ejemplo sencillo donde todas las URL acceden por el PROXY a excepción de las salidas HTTPS.

// ---------------------------------------------
// FindProxyForURL
//
// Autor: Urko Benito
// Version: 1.0
// ---------------------------------------------
function FindProxyForURL(url, host)
{
//
// Acceso HTTPS directamente sin pasar por el PROXY
//
if (shExpMatch(url, "https:*") ) return "DIRECT";

return "PROXY user-proxy-01.test.com:3128;";
} //End PAC File
Este archivo, lo podemos guardar en nuestro desktop aunque la forma más correcta será ubicarlo en un servidor Web (Apache/Tomcat/etc.) y configurar nuestro clientes para que accedan a él, a continuación puedes ver un ejemplo de configuración en FireFox



Funciones FindProxyForURL
Existen un conjunto de funciones incluidas en la expecificación, entre las que destacamos:
  • myIPAddress: Devuelve la IP del host cliente
  • shExpMatch: Evalúa una expresión regular
Nota Sobre la Función myIPAddress: Se da una extraña circustancia en los FireFox 1.5.x sobre MacOS X (aunque sobre algún Linux también) por un fallo en la implementacion de la función myIpAddress() del sistema de configuracion automatica PAC que devuelve 127.0.0.[1|2] pero *NO EN TODOS LOS FIREFOX*
A partir de aquí, podemos evolucionar nuestro archivo de configuración como queramos, por ejemplo, utilizar script perl para generar el archivo PAC en función de IPs de origen, horas, etc. ya que con perl es relativamente sencillo y mucho más potente.

Si queremos añadir nuestro archivo pac al apache, debemos tener en cuenta que hay que incluir el MimeType para que Apache reconozca ".pac" como ProxyAutoConfig File, para ello, incluiremos en $APACHE_HOME/conf/httpd.conf la siguiente linea:
AddType application/x-ns-proxy-autoconfig .pac
He puesto algunos ejemplos para que los puedas descargar

Referencias

11 comentarios:

  1. Interesante, y creo que me puede servir, mas lo que necesito es que todas las URL salgan directamente, unicamente la conexion del Windows LIve Messenger salga por el proxy, como tendria que configurar el archivo PAC?.

    Muchas gracias por tu ayuda.

    ResponderEliminar
  2. Hola Mauricio,

    Puedes utilizar el siguiente archivo PAC que he creado para enviar las peticiones de TEST.COM y TEST.ES por PROXY y el resto utilice DIRECT.

    Sin embargo, si lo que quieres es limitar el acceso al messenger, de esta forma no es correcta, ya que como tienes todas las direcciones permitidas, simplemente con quitar el proxy podrá utilizar el messenger.

    Deberás, por tanto, añadir una regla en tu firewall para que el acceso a las IPs de Live Messenger sólo se pueda realizar por el proxy.

    Si quieres, podemos comentar más soluciones para esto.

    Un Saludo,
    Urko

    ResponderEliminar
  3. Hola Urko, muchas gracias por tu respuesta. La solución que me das parece que me puede funcionar, te explico.

    Yo tengo un servidor Proxy Squid, es de uso personal, en la oficina yo no tengo ningún tipo de restricciones, mas mi esposa tiene bastantes restricciones, entre ellas pues el acceso al Messenger (no es necesario en la vida, pero al final pues lo quiere, y si puedo ayudarla porque no hacerlo), con el Proxy squid solucionamos todo en realidad, no tiene restricciones en paginas Web ni en servicios, etc. Se conecta al Messenger por el aMSN.

    Ahora bien, yo quería probar otras opciones para que pudiera conectarse directamente por el Messenger Live, que en este caso no trae habilitada la opción de Servidor Proxy http, para hacerlo hay que habilitar el Proxy de Internet Explorer en Opciones de Internet, y de esta manera se “habilita” la conexión Proxy HTTP en Messenger Live, al asunto aquí es que al hacer esto pues todo el trafico se direcciona por el Proxy y no quiero eso, puesto que tiene servicios de dominio, de IP’s, etc.; podría agregar excepciones para esos servicios en la misma configuración de Internet Explorer, mas como me gusta este asunto de probar de todo y ver nuevas opciones y así aprender un poco mas, se me ocurría usar un archivo PAC, donde mande todo el trafico DIRECT excepto el de Messenger Live, conseguí las direcciones URL (http://support.microsoft.com/kb/927847/es) que usa Messenger Live para su conexión.

    Entonces.. para no hacer mas largo el cuento, con el script que me hiciste favor de poner en tu Web, lo que tengo que hacer es reemplazar TEST.COM y TEST.ES (claro además de agregar mas dnsDomainIs para completar las URL que usa Messenger para su conexión), con esto todas las URL de Messenger van por el Proxy, y lo demás DIRECT. Estoy en lo correcto?

    Espero no confundirte mas!!! escribo con las patas, lo se.

    Muchas gracias por la ayuda.

    Saludos cordiales

    Mauricio.

    ResponderEliminar
  4. Hola Mauricio,

    Tranquilo, te he entendido perfectamente.

    Entonces, la respuesta es SI, esta solución te vale para hacer lo que quieres, y, como bien dices, si sustituyes TEST por los dominios de Live Messenger, algo así

    if (
    dnsDomainIs(host,".messenger.msn.com") ||
    dnsDomainIs(host,"rad.msn.com")
    ){
    RETURN "PROXY ...";
    }else{
    RETURN "DIRECT;";
    }


    Un Saludo,
    Y si quieres, puedes Experimentar con perl para Crear Archivos de Configuración de Proxy (PAC) Dinámicos.

    Urko,

    ResponderEliminar
  5. Hola Urko, soy administrador de una red de unas 100 PCs, a esta red se alimenta con Internet desde otra red con proxy, es decir, Mi RED 100 Pcs y mi proveedor de Internet filtrado con un Proxy, al cual yo NO tengo acceso. Ahora el problema es el siguiente para q una estación navegue en Internet hay que configurar le el proxy manual ej: proxyempresa.com.ar:8080 a cada una, y ademas si tengo Laptops para los usuarios es un lió explicarles y ademas uno por uno.

    La Red le entrega por DHCP una IP dinamica, solo resta que se configure el Proxy en cada estacion, como puedo hacer para entregar el proxy de forma automatica???
    nose si con estos archvos es posible hacer lo que quiero.

    ResponderEliminar
    Respuestas
    1. Hola Fede,

      Mira esta entrada del blog http://sparcki.blogspot.com/2010/03/archivos-de-configuracion-de-proxy.html donde hablo de cómo solucionar tu problema.

      Necesitas crear un archivo "pac" dinámico que te devuelva el proxy cuando estés dentro de tu Red, y "DIRECT" -es decir sin proxy- cuando estés fuera.

      Necesitas:

      1.- Un servidor Web
      2.- Direccionamiento público
      3.- Algún tipo de script (perl, php, java) que te permita crear el PAC dinámico
      4.- Añadir en tu DHCP la entrada para el Proxy (sólo para equipos Windows) (o habilitar WPAD)

      Ya está,

      Échales un vistazo a la opción del DHCP http://tools.ietf.org/html/draft-ietf-dhc-proxyserver-opt-05

      Un Saludo,
      Urko

      Eliminar
  6. Ayuda, y creo que podrás,
    necesito un fichero pac que me dirija exclusivamente unas urls determinadas por un proxy, el resto sin utilizar el proxy,

    Gracias por anticipado,

    ResponderEliminar
  7. Hola Luis,

    Para hacer lo que propones, simplemente tienes que evaluar la URL que quieres que sea sacada por un PROXY y el resto hacer que devuelva DIRECT.

    Si utilizamos el ejemplo, tenemos, que la función "shExpMatch(url, EXPRESION_REGULAR)" por lo tanto, podemos hacer lo siguiente:

    1) Si queremos que sólo la URL http://www.safechildrenguardian.com/ salga por el PROXY


    -------------- Archivo PAC ----------------
    function FindProxyForURL(url, host)
    {
    if (shExpMatch(url, "http://www.safechildrenguardian.com/*") ) return "PROXY user-proxy-01.test.com:3128;";

    return "DIRECT";
    }
    -------------- Fin Archivo PAC ----------------


    Como ves, es muy sencillo, aunque hay que comentar alguna cosa.

    1.- La evaluación de URLs mediante la función shExpMatch se produce en el Navegador, y, por lo tanto, es mucho más lenta que si se hace a nivel de PROXY o sistema de configuración.

    ResponderEliminar
    Respuestas
    1. hola amigo me puedes ayudar. tengo una pagina en internet de mi propiedad y quiero que ella tenga su proxy pero no se como o donde subir el archivo o codigo. me puedes dar tu mail gracias

      Eliminar
  8. Hola Urko!

    He leído tus artículos sobre la configuración automática de proxys.

    En mi empresa también tenemos uno así. (He cambiado los nombres por web1, web2... para mantener anonimato)

    //Declare variables
    function FindProxyForURL(url, host)
    {
    var PROXYa = "PROXY V2GATE.web1.eu:8080; ";
    var PROXYb = "PROXY V2GATE2.web1.eu:8080; ";

    if (shExpMatch(host,"rise.web2.com")) return "DIRECT"; //Allow connection to VPN
    if (dnsDomainIs(host,".web3.eu")) return "DIRECT";
    if (isPlainHostName(host)) return "DIRECT";
    if (shExpMatch(host,"www.web4.com")) return "DIRECT";
    if (shExpMatch(host,"web5.co.jp")) return "DIRECT";
    if (shExpMatch(host,"web6.com")) return "DIRECT";
    if (dnsDomainIs(host,".web7.org")) return "DIRECT";
    if (dnsDomainIs(host,".web8.spain")) return "DIRECT";
    if (shExpMatch(host,"web9.com")) return "DIRECT";
    if (shExpMatch(host,"web10.com")) return "DIRECT";
    if (shExpMatch(host,"web11.com")) return "DIRECT";
    if (shExpMatch(host,"211.172.214.197")) return "DIRECT";


    if (isRFC1918(host) || isRFC1918(dnsResolve(host))) return "DIRECT";

    return PROXYa + PROXYb


    Antes tenía una IP y puerto para configurar el proxy en cualquier programa externo que usaba (torrent, juegos online...)

    Ahora nose cómo configurarlo.

    http://oi45.tinypic.com/69fg9w.jpg

    Cómo configurarías esa imagen?

    Nose qué tipo de proxy poner, si SOCKS 5 u otro.

    Por lo que se es bastante complicado usar programas en esta empresa sin saltarse el proxy.

    ResponderEliminar
  9. hola amigo me puedes ayudar con esto. tengo un host con varias paginas html quiero poder mandar los enlaces de las paginas html a mis usuarios y que al entrar por el enlace ya este configurado el proxy gracias

    ResponderEliminar