Creare file PAC
Questo piccolo post è stato scritto per aiutare chi è stufo, così come lo era il sottoscritto, di continuare a cambiare l'indirizzo del proxy-server(*) nel proprio browser quando si sposta tra casa e ufficio; questo obiettivo è raggiunto utilizzando un file che in gergo è denominato "PAC", acronimo di "Proxy Auto-Config".
In realtà questi file possono fare molto di più, visto che sono alla base del funzionamento del protocollo WPAD (Web Proxy-Auto Discovery Protocol), per cui i Sysadmin che leggono possono pensare di utilizzarli per la configurazione automatica dei proxy-server nei browser utilizzati sulla rete da loro amministrata; oppure essere di aiuto per far puntare un gruppo di utenti ad un nuovo proxy appena installato senza per questo dover riconfigurare tutti i PC; utilizzarli per suddividere gli utenti in gruppi bilanciando così il carico tra più proxy-server; o ancora utilizzarli per bloccare parte del traffico a seconda dell'ora o di altre condizioni da voi scelte e molto altro... Non male, vero?
Leggendo questo intervento sarete in grado di costruirvi autonomamente il vostro file di configurazione PAC. Le sole nozioni richieste per raggiungere questo scopo sono giusto degli accenni di programmazione e una conoscenza di base del funzionamento della rete Internet.
Dal punto di vista tecnico un PAC e' molto semplice, si tratta infatti di una funzione realizzata in Java Script che riceve dal broswer utilizzato per la navigazione due parametri: l'indirizzo URL e l'host a cui l'utente vuole collegarsi. La funzione restituisce al browser il nome host o l'indirizzo IP e la porta di ascolto del proxy da utilizzare [ host | IP : port ], oppure la stringa [ DIRECT ] utilizzata per indicare una connessione diretta.
Vediamo di espliciatare meglio: se l'utente digita nel browser il seguente indirizzo: www.mondo-digitale.it/content/creare-un-file-proxy-auto-config
il parametro URL è: http://www.mondo-digitale.it/content/creare-file-PAC (notare http, un url può iniziare anche come ftp, file, ecc.)
il paramtero host è: www.mondo-digitale.it
La funzione riceve in ingresso questi due parametri e li elabora attraverso la configurazione da noi redatta, ritornando al browser come dovrà collegarsi al suddetto indirizzo internet.
Detto questo ora siamo pronti per vedere il primo esempio di PAC:
function FindProxyForURL(url, host) {
// se è un pagina del sito mondo digitale vai diretto
if (shExpMatch(url, "http://www.mondo-digitale.it*")) {
return "DIRECT";
}
// altrimenti usa questo proxy
return "PROXY 192.168.0.1:8080";
}
Come vedete per prima cosa è dichiarata la funzione FindProxyForUrl() che riceve, attraverso il nostro browser, i parametri url e host. Fino a questo punto tutti i PAC sono uguali, quello che cambia è quello che viene scritto all'interno del blocco della funzione, cioè tra le due parentesi graffe più esterne, nel nostro esempio è invocata la funzione shExpMatch() la quale è in grado di verificare se le pagine richieste iniziano con "http://mondo-digitale.it", nel caso lo fossero indica al browser di collegarsi direttamente al sito web, altrimenti di usare il proxy-server attivo sull'indirizzo IP 192.168.0.1 e in ascolto sulla porta 8080.
Ovviamente esistono moltissime altre funzioni utilizzabili per costruire il nostro file PAC, le quali combinate attraverso i costrutti di programmazione ci permettono di fare praticamente qualsiasi controllo possiamo immaginare. Vediamo brevemente quali sono queste funzioni disponibili:
isPlainHostName()
Ritorna il valore booleano (da ora in poi omesso) true se l'indirizzo host non è utilizzato il carattere . (punto).
E' utile per intercettare gli indirizzi interni, che per questo motivo spesso non hanno l'estensione FDQN .
Esempio:
if (isPlainHostName(host)) return "DIRECT";
dnsDomainIs()
Verifica se il nome dominio usato da host è lo stesso della stringa fornita per confronto, ritorando true se lo è. Questa funzione è utile per intercettare dei servizi locali o esterni.
Esempio:
if (dnsDomainIs(host, ".mydomain.priv")) return "DIRECT";
localHostOrDomainIs()
Verifica hostname con la stringa fornita e ritorna true solo se sono uguali.
Esempio:
if (localHostOrDomainIs(host, "www.google.com")) return "DIRECT";
isResolvable()
Tenta di risolvere il nome host e ritorna true solo se è risolvibile. ATTENZIONE se non lo fosse il broswer potrebbe bloccarsi per qualche secondo, per via del time out di attesa utilizzato per le query al DNS.
Esempio:
if (isResolvable(host)) return "PROXY proxy1.example.com:8080";
isInNet()
Questa funzione verifica se l'indirizzo IP o il nome host appartengono alla rete specificata, ritornando true se lo è. Se viene passato un nome host la funzione prima risolve il suo indirizzo IP. (nota: vedere funzione dnsResolve() )
Esempio:
if (isInNet(host, "172.16.0.0", "255.240.0.0")) return "DIRECT";
dnsResolve()
Risolve hostname in un indirizzo IP. Questa funzione può essere usata per ridurre il numero delle query verso il DNS.
Esempio:
var resolved_ip = dnsResolve(host);
if (isInNet(resolved_ip, "10.0.0.0", "255.0.0.0") ||
isInNet(resolved_ip, "172.16.0.0", "255.240.0.0") ||
isInNet(resolved_ip, "192.168.0.0", "255.255.0.0") ||
isInNet(resolved_ip, "127.0.0.0", "255.255.255.0"))
return "DIRECT";
myIpAddress()
Ritorna l'indirizzo IP della macchina dove sta girando il Browser.
Esempio:
if (isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0")) return "DIRECT";
dnsDomainLevels()
Questa funzione ritorna il numero di livello DNS del parametro hostname. Può essere usata per effettuare delle eccezioni come: http://intranet
Esempio:
if (dnsDomainLevels(host) > 0) return "PROXY proxy1.example.com:8080";
else return "DIRECT";
shExpMatch()
Prova a verificare se hostname o URL sono compatibili con la "shell expression", ritornando true se lo sono.
Esempio:
if (shExpMatch(url, "*vpn.domain.com*") ||
shExpMatch(url, "*abcdomain.com/folder/*")) return "DIRECT";
weekdayRange()
Verifica se la sysdate è compatibile con il range di giorni della settimana specificato e se lo è ritorna true. Può essere usato per specificare diversi proxy-server in funzione del giorno della settimana.
Esempio:
if (weekdayRange("MON", "FRI")) return "PROXY proxy1.example.com:8080";
else return "DIRECT";
dateRange()
Verifica se la sysdate è compatibile con il range di mesi specificato e se lo è ritorna true. Può essere usato per specificare diversi proxy-server in funzione del giorno dei mesi dell'anno.
Esempio:
if (dateRange("JAN", "MAR")) return "PROXY proxy1.example.com:8080";
else return "DIRECT";
timeRange()
Verifica se la sysdate è compatibile con il range di orario specificato e se è lo ritorna true. Può essere usato per specificare diversi proxy-server in funzione dell'ora di utilizzo.
Esempio:
if (timeRange(8, 18)) return "PROXY proxy1.example.com:8080";
else return "DIRECT";
Spiegate brevemente le funzioni, mi sento di fornire anche alcuni consigli per scrivere un buon file PAC:
- Keep it simple - utilizzate script di limitate dimensioni e fatelo semplice. Questo è il modo migliore per ottenere una buona configurazione.
- Per accedere ai sistemi locali ( ad esempio attivi sulla intranet) l'accesso piu' efficiente e' DIRECT.
- Se possibile evitate di utilizzare la risoluzione DNS degli indirizzi. Tale risoluzione infatti richiede tempo ed e' opportuno venga utilizzata solo se non si riesce altrimenti ad indirizzare un host, ad esempio per specificare l'indirizzo proxy preferite l'uso dell'IP address piuttosto che del nome host.
I PAC sono supportati da tutte le piu' recenti versioni di browser più comuni, come: Firefox, Internet Explorer, Opera, ecc. Create un file con estensione .pac e inserite al suo interno la funzione FindProxyForUrl() corredata dalla vostra configurazione. Una volta fatto questo per utilizzare il nuovo PAC e' sufficente ospitarlo in uno spazio accedibile da tutti i computer che lo devono usare, per cui su un singolo pc può andare bene una qualsiasi cartella locale, per una piccola rete LAN il file si può trovare in una cartella condivisa e infine in una rete di medio grosse dimensioni la scelta migliore è quella di usare un web server.
A titolo di esempio è mostrata la procedura di configurazione di firefox per l'utilizzo dei PAC:
- Cliccare sul menu "Strumenti" --> "Opzioni"
- Selezionate il menu "Avanzate" e cliccate sul tab: "rete"
- Cliccate sul bottone "Impostazioni"
- Cliccate sul radio button "Configurazione automatica del proxy (url)"
- Digitate l''url dove il browser può recuperare il file PAC.

NB: se l'avete il PAC in una cartella locale, così come nell'esempio qui sopra, potete indicare semplicemente il path del file. A creare l'url corretto ci penserà firefox.
(*) Indica una macchina facente parte di una rete locale che intercettando le richieste di URL esterne, cerca i file necessari nella cache locale (creata nel tempo in base alla navigazione dell'utenza che lo utilizza), se i file sono trovati li restituisce all'utente, altrimenti li va a recuperare dal sito indicato per servirli all'utente, oltre cheo memorizzarli nella cache per usi futuri. E' palese come questo dispositivo velocizzi l'accesso pagine frequentemente richieste riducendo così la banda utilizzata per la navigazione, così come sia in grado di controllare qualsiasi movimento dei suoi utenti e di filtrarli, se necessario, con particolari permessi di ingresso/uscita.
