Proxy Auto Config(PAC)

什麼是 Proxy Auto Config ?

首先,我們一定要知道什麼是 Proxy?他的功用是什麼?如果還不知道,可以參照這份文件。
而 PAC(Proxy Auto Config) 又是什麼呢?它實際上是一個 Script;經由編寫這個 Script,我們可以讓系統判斷在怎麼樣的情形下,要利用哪一台 Proxy 來進行連線。這樣做主要的好處有:

分散 Proxy 的流量,避免 Proxy Server 負載過高
針對個別條件設定、加快瀏覽速度
設定要求順序,在某台 Proxy 無法連線時,可自動嘗試別種連線方式

--------------------------------------------------------------------------------

Proxy Auto Config File 的格式

基本上 Proxy Auto Config File(以下簡稱 PAC)是一個純文字檔,他的語法採用 JavaScript;所以建議要學習編寫 PAC 的人,最好先學習基本的 JavaScript。一個 PAC 檔必需是單獨的 JavaScript,其中不能包含任何 HTML 標籤。

在 PAC 檔中,一定要定義 Function FindProxyForURL 如下:

function FindProxyForURL( url, host ) { ... } 如果使用了 PAC 檔,則瀏覽器在接受我們要求的網址後,會去執行

ret = FindProxyForURL( url, host );這樣的指令。其中,url 是所要求網址的完整路徑,host 是對方的電腦名稱(就是在 :// 和 / 之中的部份);而 return 值 ret 則是 Proxy 的組態,它的格式有下列三種:

DIRECT 直接連線而不透過 Proxy
PROXY host:port 使用指定的 Proxy 伺服機
SOCKS host:port 使用指定的 Socks 伺服機
比如說當瀏覽器得到的是 Proxy proxy.ncu.edu.tw:3128; Proxy proxy.csie.ncu.edu.tw:3128; DIRECT 的話,那瀏覽器會先嘗試透過 proxy.ncu.edu.tw 來開啟網頁,如果無法使用,則嘗試 proxy.csie.ncu.edu.tw,還是不行的話,就直接連線。


--------------------------------------------------------------------------------

PAC 中特別的 Function

在 PAC 中,除了可以使用一般 JavaScript 的 Function 外,它還定義了一些特別的 Function 可以使用:


--------------------------------------------------------------------------------

isPlainHostName( host )

host 由網址取得的主機名稱。

此 Function 會判斷 host 是否為不包含網域 (Domain)。如果是,則 return true;如果包含,則 return false。

範例:

isPlainHostName("www") 會 return true
isPlainHostName("www.netscape.com") 會 return false

--------------------------------------------------------------------------------

dnsDomainIs( host, domain )

host 由網址取得的主機名稱。
domain 指定的網域。

此 Function 會判斷 host 是否屬於網域 domain。如果是,則 return true;否,則 return false。

範例:

dnsDomainIs("www.netscape.com", ".netscape.com") 會 return true
dnsDomainIs("www", ".netscape.com") 會 return false
dnsDomainIs("www.mcom.com", ".netscape.com") 會 return false

--------------------------------------------------------------------------------

localHostOrDomainIs( host, hostdom )

host 由網址取得的主機名稱。
hostdom 完整的網域名稱。

此 Function 會判斷 host 是否為 hostdom,或 host 是否為 hostdom 的主機名稱。如果是,則 return true;否,則 return false。

範例:

localHostOrDomainIs("www.netscape.com", "www.netscape.com") 會 return true (完全相同)
localHostOrDomainIs("www", "www.netscape.com") 會 return true (主機名稱相同)
localHostOrDomainIs("www.mcom.com", "www.netscape.com") 會 return false (網域不同)
localHostOrDomainIs("home.netscape.com", "www.netscape.com") 會 return false (主機名稱不同)

--------------------------------------------------------------------------------

isResolvable( host )

host 由網址取得的主機名稱。

此 Function 會嘗試透過 DNS 去解析 host,如果解析成功,則 return true;否則 return false。

範例:

isResolvable("www.netscape.com") 會 return true (除非 DNS 無法正常運作)
isResolvable("bogus.domain.foobar") 會 return false (除非真的冒出這個 domain 出來…)

--------------------------------------------------------------------------------

isInNet( host, pattern, mask )

host 主機名稱,可以是 Domain Name 或 IP。如果是 Domain Name,則會透過 DNS 查出 IP。
pattern IP。
mask對應於 pattern 的遮罩。

此 Function 會 host 是否在指定的 IP 範圍內,如果是,則 return true;否則 return false。

範例:

isInNet(host, "198.95.249.79", "255.255.255.255") 當 host 為 198.95.249.79 時,會 return true。
isInNet(host, "140.115.0.0", "255.255.0.0") 當 host 為 140.115.*.* 時,會 return true。

--------------------------------------------------------------------------------

dnsResolve( host )

host 要透過 DNS 解晰的主機名稱。


此 Function 會透過 DNS 去解析 host,return 值即為解析之結果。

範例:

dnsResolve("www.math.ncu.edu.tw") 會 return "140.115.25.9"。

--------------------------------------------------------------------------------

myIpAddress()

此 Function 會 return 瀏覽器所在電腦之 IP 位址。


--------------------------------------------------------------------------------

dnsDomainLevels( host )

host 由網址取得的主機名稱。

此 Function 會 return host 的 Domain 層數(點的數目)。

範例:

dnsDomainLevels("www") 會 return 0。
dnsDomainLevels("www.netscape.com") 會 return 2。

--------------------------------------------------------------------------------

shExpMatch( str, shexp )

str 要進行比對的字串。
shexp 比對的條件。

此 Function 會比對 str 是否符合 shexp 的表示式(此表示式為 shell expression 而非 regular expressions)。如果是,則 return true;否則 return false。

範例:

shExpMatch("http://home.netscape.com/people/ari/index.html", "*/ari/*") 會 return true
shExpMatch("http://home.netscape.com/people/montulli/index.html", "*/ari/*") 會 return false

--------------------------------------------------------------------------------

weekdayRange()、dateRange()、timeRange()

這三個 Function 的功用都是檢查線在時間是否在指定範圍內,用這些 Function 就可以設定分時段使用 Proxy Server。但由於較為繁瑣,如有興趣或需要,請參考原始文件。

範例:


function FindProxyForURL( url, host ){
if ( dnsDomainIs( host, "locahost" ) || dnsDomainIs( host, ".edu.tw" ) || isInNet( host, "140.0.0.0", "255.0.0.0" ) || isPlainHostName( host ) )
{
return "DIRECT; PROXY proxy.csie.ncu.edu.tw:3128;" + " PROXY cache.math.ncu.edu.tw:3128";
//localhost、 domain 是 .edu.tw、IP 為 140.*.*.* 或只有 Host Name
//則直接連線;如果直接連線不行,則嘗試使用 proxy.csie 和 cache.math
}else if ( dnsDomainIs( host, ".tw" ) )
{
return "PROXY proxy.edu.tw:8080;" + " PROXY cache.edu.tw:8080;" + " DIRECT";
//如果網域是 .tw,則依序嘗試 proxy or cache or 直接連線
}else
return "PROXY cache.edu.tw:8080;" + " PROXY proxy.edu.tw:8080;" + " DIRECT";
//其他:依序嘗試 cache or proxy or 直接連線

Comments

Popular posts from this blog

TCP/IP 明確擁塞通知 (ECN)

L2TPv3 Enables Layer 2 Services for IP Networks

Q-in-Q(Dot1Q Tunnel) Sample Configuration