伺服器架設篇 - CentOS 6.x

第十七章、區網控制者: Proxy 伺服器

透過 squid 來進行代理伺服器 (proxy) 的設定輔助區網的 www 瀏覽控制!

最近更新時間: 2011/08/02

代理伺服器的功能是可以代理區域網路的個人電腦來向網際網路取得網頁或其他資料的一種服務, 由於代理取得的資料可以保存一份在伺服器的快取上,因此以往有類似『假象加速』的功能!不過,目前網路頻寬已經比以前好很多, 因此代理伺服器倒是很少使用在這方面。取而代之的是區域網路『高階防火牆』的角色!這裡的『高階』指的是 OSI 七層協定裡面的高層,因為代理伺服器是用在應用層上的一種防火牆方式啦!不像 iptables 是用在網路、傳輸層。Linux 上啟動代理伺服器的是 squid 這個軟體呦!

17.1 什麼是代理伺服器 (Proxy)

代理伺服器 (Proxy) 的原理其實很簡單啦!就是以類似代理人的身份去取得使用者所需要的資料就是了! 但是由於它的『代理』能力,使得我們可以透過代理伺服器來達成防火牆功能與用戶瀏覽資料的分析! 此外,也可以藉由代理伺服器來達成節省頻寬的目的,以及加快內部網路對網際網路的 WWW 存取速度!總之, 代理伺服器對於企業來說,實在是一個很不錯的東西啊!

17.1.1 什麼是代理伺服器

在真實世界中,我們或許會幫忙家人去辦理一些雜務吧!舉個例子來說,例如繳費或者是申辦提款卡等等的, 由於你並不是『申請者本人』而是『代理人』的角色,因此有時候會需要秀出一些證件就是了。 那麼在網路上面的代理伺服器 (Proxy Server) 是怎麼回事呢?它最主要的功能就如同我們上面提的真實世界一樣, 當用戶端有網際網路的資料要求時,Proxy 會幫用戶去向目的地取得用戶所需要的資料。 所以,當用戶端指定 WWW 的代理伺服器之後,用戶的所有 WWW 相關要求就會通過代理伺服器去捉取囉! 整個代理伺服器與用戶端的相關性可以由下圖約略看出一個端倪:

代理伺服器、用戶端與網際網路的相關性示意圖
圖 17.1-1、代理伺服器、用戶端與網際網路的相關性示意圖

一般來說,代理伺服器會架設在整個區網的單點對外防火牆上頭,而在區網內部的電腦就都是透過 Proxy 來向網際網路要求資料的,這就是所謂的『代理伺服器』啦!當然,上面的架構僅只是一個案例,但是這個架構比較多人用的原因, 是因為這樣的 Proxy server 還可以兼做高階防火牆之用啦!

在 Proxy 與用戶端的相關性當中,你必需要瞭解的是:用戶端向外部要求的資料事實上都是 Proxy 幫用戶取得的,因此網際網路上面看到要求資料者,將會是 Proxy 伺服器的 IP 而不是用戶端的 IP。 舉個例子來說,假如鳥哥在我的瀏覽器設定了我們學校的代理伺服器主機 proxy.ksu.edu.tw 做為我的 Proxy 好了,再假設我的 IP 是 120.114.141.51 ,那麼當我想要取得 Yahoo 的新聞資訊時,事實上,都是 proxy.ksu.edu.tw 幫我去取得的,所以在 Yahoo 的網站上面看到要求資料的人是誰呢?呵呵!當然就是 proxy.ksu.edu.tw 而不是 120.114.141.51 囉!這樣可以瞭解 Proxy 的功能了嗎?

除了這個功能之外,Proxy 還有一個很棒的額外功能,那就是防火牆的功能! 看一下上面的圖示,你可以發現一件事情,那就是用戶端的個人電腦要連上網際網路一定要經過 Proxy 伺服器。並且,如果有人想要入侵你的系統時,由於你的 proxy 在最外部啊,所以攻擊者就會攻擊錯方向,如此一來,不就比較安全! 此外,由於整個網際網路對外都是經過 proxy ,也就是『單點對外』的情況,這種狀態底下要來管理防火牆也是比較簡單的喔!^_^

17.1.2 代理伺服器的運作流程

瞭解了 Proxy 的功能之後,我們來談一談那麼 Proxy 到底是怎樣運作的呢?為何它會有『加快網路存取效率』的好處? 這就必需要以底下的圖示來說明了!

代理伺服器的運作流程圖:快取資料與用戶端
圖 17.1-2、代理伺服器的運作流程圖:快取資料與用戶端

當用戶端指定了代理伺服器之後,在用戶端想要取得網際網路上面的資訊時,它是這樣取得資料的 (註:那個 Cache 表示為 Proxy 伺服器的硬碟的意思):

    當 Proxy 的快取擁有用戶所想要的資料時 (Step a ~ d):
  1. Client 端向 Server 端發送一個資料需求封包;

  2. Server 端接收之後,先比對這個封包的『來源』與預計要前往的『目標』網站是否為可接受? 如果來源與目標都是合法的,或者說,來源與目標網站我們的 Proxy 都能幫忙取得資料時,那麼 Server 端會開始替 Client 取得資料。這個步驟中比較重要的就是『比對政策』啦,有點像是認證的感覺啦;

  3. Server 首先會檢查自己快取 (新的資料可能在記憶體中,較舊的資料則放置在硬碟上) 資料, 如果有 Client 所需的資料,那就將資料準備取出,而不經過向 Internet 要求資料的程序;

  4. 最後當然就是將資料回傳給 Client 端囉!

    當 Proxy 的快取沒有用戶所想要的資料時 (Step 1 ~ 5):
  1. Client 端向 Server 端發送一個資料需求封包;
  2. Server 端接收之後,開始進行政策比對;
  3. Server 發現快取並沒有 Client 所需要的資料,準備前往網際網路抓取資料;
  4. Server 開始向 Internet 發送要求與取得相關資料;
  5. 最後當然就是將資料回傳給 Client 端囉!


上面的流程分析裡面,我們可以清楚的知道,當 Proxy 曾經幫某位用戶取得過 A 資料後,當後來的用戶想要重複取得 A 資料時,那麼 Proxy 就會從自己的快取裡面將 A 資料取出傳送給用戶,而不用跑到網際網路去取得同樣的這份資料喔。因為沒有去網際網路找資料,當步驟 4 的流程很花時間時,那麼透過 Proxy 忽略步驟 4 ,感覺上就好像網路速度變快了!但其實只是直接從 Proxy 的快取裡面抓而已 (所以才會有人說『假象網路加速』的功能)!這就是兩個流程最大的差異了。

在目前的網際網路社會裡,由於寬頻技術已經很成熟,所以在不亂用的情況下,網路頻寬理論上是足夠的 (除非要連到國外去)。 那麼用了 Proxy 之後效能會不會更提升呢?答案是,『應該不會』!啥?怎麼會這樣呢?從上面的流程分析中, 我們發現 Proxy 會常常去讀取硬碟內的資料,而硬碟內的快取資料又是透過某些特殊方式在管理, 因此要找到該份資料就要花一些時間,再加上如果硬體效能 (硬碟或主機板晶片組) 不佳時,那麼加了 Proxy 反而會讓你感覺網路傳輸怎麼『卡卡的』呦!這點得要特別注意才行!

Tips 鳥哥 Proxy 對於 cache 的速度是很要求的,而這個 cache 就是硬碟啦!當然,硬碟容量必需要足夠大,而且還要『足夠快』才行! 因為由上面的流程當中,我們不難發現,cache 是一直被重複存取的一個地方喔!所以硬碟的好壞就差別很大啦!可以說他是影響一個 Proxy 效能好壞的關鍵點呢!

17.1.3 上層代理伺服器

想一想,既然 Proxy 是幫忙用戶端進行網頁代理的工作,那麼我們的 Proxy 能不能也指定另外一台 Proxy 當成我的 Proxy 的 Proxy 呢?很繞口吧!其實流程像底下這樣啦:

上層代理伺服器示意圖
圖 17.1-3、上層代理伺服器示意圖

就是我們的 Local proxy 並不會主動的去捉資料,而是再透過『上層代理伺服器』向 Internet 要求資料!這樣有什麼好處呢?由於可做為我們的上層代理伺服器的主機通常是具有較高頻寬的, 因此我們透過它去要求資料當然『理論上』速度會更快喔!而上層代理伺服器最大的好處其實是在於『分流』喔! 例如下圖所示:

以多部上層代理伺服器達到分流的效果示意圖
圖 17.1-4、以多部上層代理伺服器達到分流的效果示意圖

我總共設定了三部上層代理伺服器,由於這三個代理伺服器對外的速度都不相同,所以,當我要去美國時,就以 Proxy1 來要求資料,要連歐洲就以 Proxy3 ,至於要連日本,就以 Proxy 2 來要求我所需要的資料,如此一來,呵呵!可以讓我的 Proxy 達到最佳的效能喔!很不錯吧!此外,為了節省上層 proxy 的負擔,如果是其他網路位置,我們則設定由自己的 local proxy 捉取~ 設定的彈性很高呢!

由於代理伺服器需要管控信任的來源端用戶端電腦,因此各 ISP 僅能針對自家的用戶來開放 Proxy 使用權而已。 台灣常見的幾家 ISP 提供的 Proxy 有:

由於當用戶透過 Proxy 連到網際網路時,網路看到的是 Proxy 在抓取資料而不是該用戶端,因此,我們不難發現 Proxy 有可能會被用戶端過度的濫用,同時也有可能會被拿來為非作歹啊!所以,目前絕大部分的 Proxy 已經『停止對外開放』了,僅針對自己的網域內的用戶提供本項服務而已~

因此,如果你要自行設定 Proxy 的時候,請記得去你當初申請網路的 ISP (如果是學術單位,請到貴單位的計中網頁瞧瞧即可) 搜尋一下,才能比較有效的設定好你的伺服器喔!因為設定錯誤的話,呵呵!上層 Proxy 根本不提供服務,或者是上層 Proxy 的效能並不好,那個時候你的 Proxy 也會連帶的受到很大的影響啊!慎選!慎選!

17.1.4 代理伺服器與 NAT 伺服器的差異

或許你已經發現了一件事,那就是:在內部區域網路使用私有 IP 的用戶端,不論透過 Proxy 或者 NAT 均可以直接取得 WWW 的服務,那麼 NAT 與 Proxy 有沒有什麼不同的地方啊?它們不都是可以讓內部的電腦連接出去嗎?其實這兩個玩意兒差異性是『相當大』的喔! 簡單說明如下:

  • NAT 伺服器的功能
    就如同第九章提到的資料,Linux 的 NAT 功能主要透過封包過濾的方式, 並使用 iptables 的 nat 表格進行 IP 偽裝 (SNAT) ,讓用戶端自行前往網際網路上的任何地方的一種方式。主要的運作行為是在 OSI 七層協定的二、三、四層。由於是透過封包過濾與偽裝,因此用戶端可以使用的埠口號碼 (第四層) 較彈性;

  • Proxy 伺服器的功能
    主要透過 Proxy 的服務程式 (daemon) 提供網路代理的任務,因此 Proxy 能不能進行某些工作,與該服務的程式功能有關。 舉例來說,如果你的 Proxy 並沒有提供郵件或 FTP 代理,那麼你的用戶端就是無法透過 Proxy 去取得這些網路資源。 主要運作的行為在 OSI 七層協定的應用層部分 (所謂的比較"高階"之意)。

這樣說有沒有比較有點概念了呢?NAT 伺服器是由較底層的網路去進行分析的工作,至於通過 NAT 的封包是幹嘛用的, NAT 不去管他!至於 proxy 則主要是由一個 daemon 的功能達成的,所以必需要符合該 daemon 的需求,才能達到某些功能!

17.1.5 架設代理伺服器的用途與優缺點

現在我們約略知道 Proxy 的功能了,那麼通常什麼情況下會架設 Proxy 呢?一般來說,代理伺服器的功能主要有:

  • 作為 WWW 的網頁資料取得代理人:這是最主要的功能嘛!

  • 作為內部區網的單點對外防火牆系統:如圖 17.1-1 所示一般,如果你的 Proxy 是放在內部區網的 Gateway 上頭,那麼這部代理伺服器就能夠作為內部電腦的防火牆了!而且還不需要設定那複雜的 NAT 功能呢!只是單純的 Proxy 伺服器通常僅提供 WWW 的代理,因此內部電腦想要取得 smtp, ftp...就比較麻煩~

由於 Proxy 的這種特性,讓他很常被使用於大型的企業內部,因為可以達到杜絕內部人員上班時使用非 WWW 以外的網路服務,而且還可以監測使用者的資料要求流向與流量呢!很不錯吧! ^_^!好了,接下來我們來談一談當你架設了 Proxy 後的優缺點吧。先來談談主要可能具有的優點有:

  • 節省單點對外的網路頻寬,降低網路負載:當你的 Proxy 用戶很多時,那麼 Proxy 內部的快取資料將會累積較多。因此用戶端想要取得網路上的資料時,很多將會從 Proxy 的快取中取得,而不用向網際網路要求資料。 所以可以節省頻寬啊!

  • 以較短的路徑取得網路資料,有網路加速的感覺:例如你可以指定你的 ISP 提供的代理伺服器連接到國外,由於 ISP 提供的 Proxy 通常具有較大的對外頻寬,因此在對國外網站的資料取得上, 通常會比你自己的主機連線到國外要快的多。此外,與上一點的快取資料也有關係啊!從內部硬碟取得的路徑總比對外的網際網路要短的多啊!

  • 透過上層代理伺服器的輔助,達到自動資料分流的效果:例如圖 17.1-4 所示,讓用戶端在不知不覺之間,就可以得到資料由不同 Proxy 取得的加速效果!

  • 提供防火牆內部的電腦連上 Internet:就是上面提到的單點對外防火牆功能!

由於代理伺服器的這些優點,因此這裡要強烈的建議,如果你需要連上國外的網頁, 請一定使用 ISP 提供給你的代理伺服器來幫忙,因為不但可以節省頻寬,並且速度上會快上很多很多 (例如美國環保署, EPA 網站)。 不過,有利就有弊,當然 Proxy 也不是萬能的天神~他有什麼可能潛藏的缺點呢?

  • 容易被內部區網的人員濫用:我們知道網際網路上看到取得資料的人是 Proxy 那部主機而不是用戶端電腦的 IP,因此可能會讓某些內部網路使用人員開始利用你的 proxy 幹壞事,此時你就會很麻煩~ 所以,為了杜絕這個狀況,強烈的建議多加登錄檔案分析的軟體,在管理上面會輕鬆很多喔!

  • 需要較高超的設定技巧與除錯程序:在鳥哥設定過的伺服器當中, Proxy 算是比較不容易設定好『效能』的一個伺服器了!由於 Proxy 的 Cache 與他的『上層代理伺服器』的關係是很緊密的, 萬一設定錯誤的話,很有可能反而讓你的 Proxy 拖垮用戶端 WWW 的瀏覽速度!最嚴重的是造成無法連線!

  • 可能會取得舊的錯誤資料:這個最容易發生了!由於曾經瀏覽過的網頁會被放置到快取, 並提供後續用戶的直接取得。萬一網際網路上面的那個網頁資料更新過呢?那時你會發現,怎麼用戶端無法看到更新後的資料? 就是因為快取的問題啊!取得舊資料的頻率可能會很高啊!

總之, Proxy 的優點是很多的,但是缺點卻需要網管人員的操心啊!既然如此,那麼我們到底有沒有需要架設代理伺服器呢? 簡單的說,我們可以這樣分析!

  • 我的 Client 端用戶不少,而且大部分僅需要 WWW 這個網路服務而已;
  • 我的 Proxy 還兼做防火牆的任務;
  • 我的 Client 端常常需要連線到傳輸速度很慢的網站,例如國外的網站;
  • 我的 Client 端常常瀏覽的網站是『靜態』網站,而不是動態網站 (例如討論區的 PHP)。

如果你有上述的環境狀況,那麼是可以考慮架設 Proxy 的,但是,相反的來說,要是 (1)我的 Client 端很少,所以每次連上 WWW 都是求取新的資料 (並沒有用到快取),有沒有 Proxy 反而看不出效益~此外,(2)Proxy 由於屬於應用層了,對於 Internet 的規劃上彈性較不足!不像 NAT 伺服器可以進行很多的功能!(3)我常常上的網站是類似討論區那種一日多變的網站, 在這樣的情況下,實在是沒有必要架設 Proxy 的!

但是,如果對於學校單位那原本頻寬就不足的環境中,架設 Proxy 來讓校內的網路速度提昇,呵呵!就是有那個必要性的啦!所以要不要架設 Proxy 呢?請好好的依據你的環境來考量喔!但無論如何,我們還是要教大家怎麼架設它就是了 ^_^

17.2 Proxy 伺服器的基礎設定

雖然在我們小型的網路環境中,架設 Proxy 真的沒有什麼用,不過,考慮到大家未來可能會高昇嘛!所以企業常用的 Proxy 也需要瞭解一下比較好。 在這個小節中,我們主要介紹一個比較簡單的 Proxy 環境,就是單純可以跑而已的代理伺服器。比較高階的設定請參考後續小節的介紹囉。

17.2.1 Proxy 所需的 squid 軟體及其軟體結構

達成代理伺服器功能的軟體很多,例如效能不是很好的 Apache 以及我們這個章節要介紹的八爪章魚 squid 這一套。 目前代理伺服器在 Unix Like 的環境下,大多就是使用 squid ,因此我們這裡以 squid 為準來介紹啦。同樣的, 請使用 rpm 來檢查,如果尚未安裝,請用『 yum install squid 』來安裝吧!安裝好 squid 之後,它主要的提供的設定檔有:

  • /etc/squid/squid.conf
    這個是主要的設定檔,所有 squid 所需要的設定都是放置在這個檔案當中的! 鳥哥底下提到的種種設定方法幾乎都是這個檔案裡面的說明喔!

  • /etc/squid/mime.conf
    這個檔案則是在設定 squid 所支援的 Internet 上面的檔案格式,就是所謂的 mime 格式囉! 一般來說,這個檔案的預設內容已經能夠符合我們的需求了,所以不需要更動他,除非你很清楚的知道你所需要額外支援的 mime 檔案格式。

其他重要的目錄與檔案有:

  • /usr/sbin/squid:提供 squid 的主程式啊!
  • /var/spool/squid:就是預設的 squid 快取放置的目錄。
  • /usr/lib64/squid/:提供 squid 額外的控制模組,尤其是影響認證密碼方面的程式,都是放在這個目錄下的;

17.2.2 CentOS 預設的 squid 設定

在預設的情況下,CentOS 的 squid 具有底下幾個特色:

  • 僅有本機 (localhost, 127.0.0.1) 來源可以使用這個 squid 功能
  • squid 所監聽的 Proxy 服務埠口在 port 3128
  • 快取目錄所在的位置在 /var/spool/squid/ ,且僅有 100MB 的磁碟快取量
  • 除了 squid 程式所需要的基本記憶體之外,尚提供 8MB 的記憶體來給熱門檔案快取在記憶體中 (因為記憶體速度比硬碟還快)
  • 預設啟動 squid 程序的使用者為 squid 這個帳號 (與磁碟快取目錄權限有關)

其實, CentOS 預設的 squid 設定,是僅針對本機 (localhost) 開放的情況,而一大堆設定的預設值, 都是僅針對小型網路環境所指定的數值,同時,很多比較特殊的參數都沒有啟動。所以,我們就得要來瞭解一下各設定值的意義, 這樣才能夠進行修改嘛!這些參數都是在 squid.conf 裡頭指定的,所以,就讓我們來看看這個檔案的內容與較重要的參數吧:

Tips 鳥哥 CentOS 6.x 已經將 squid.conf 裡面不相干的設定值通通拿掉了,所以這個檔案就變的非常的精簡!這樣其實有好有壞啦! 好處是,你不用去看一些你用不到的參數值,壞處是,如果你想要其他的設定,就得額外參考外部文件了!傷腦筋~
[root@www ~]# vim /etc/squid/squid.conf
# 1. 信任用戶與目標控制,透過 acl 定義出 localhost 等相關用戶
acl manager proto cache_object              <==定義 manager 為管理功能
acl localhost src 127.0.0.1/32              <==定義 localhost 為本機來源
acl localhost src ::1/128
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 <==定義 to_localhost 可連線到本機
acl to_localhost dst ::1/128

# 2. 信任用戶與目標控制,定義可能使用這部 proxy 的外部用戶(內網)
acl localnet src 10.0.0.0/8      <==可發現底下都是 private IP 的設定
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
acl localnet src fc00::/7
acl localnet src fe80::/10
# 上述資料設定兩個用戶 (localhost, localnet) 與一個可取得目標 (to_localhost)

# 3. 定義可取得的資料埠口所在!
acl SSL_ports port 443                  <==連線加密的埠口設定
acl Safe_ports port 80          # http  <==公認標準的協定使用埠口
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
# 定義出 SSL_ports 及標準的常用埠口 Safe_ports 兩個名稱
acl CONNECT method CONNECT

# 4. 定義這些名稱是否可放行的標準依據(有順序喔!)
http_access allow manager localhost  <==放行管理本機的功能
http_access deny manager             <==其他管理來源都予以拒絕
http_access deny !Safe_ports         <==拒絕非正規的埠口連線要求
http_access deny CONNECT !SSL_ports  <==拒絕非正規的加密埠口連線要求
<==這個位置為你可以寫入自己的規則的位置喔!不要寫錯了!有順序之分的!
http_access allow localnet           <==放行內部網路的用戶來源
http_access allow localhost          <==放行本機的使用
http_access deny all                 <==全部都予以拒絕啦!

# 5. 網路相關參數,最重要的是那個定義 Proxy 協定埠口的 http_port
http_port 3128     <==Proxy 預設的監聽用戶端要求的埠口,是可以改的
# 其實,如果想讓 proxy server/client 之間的連線加密,可以改用 https_port (923)

# 6. 快取與記憶體相關參數的設定值,尤其注意記憶體的計算方式
hierarchy_stoplist cgi-bin ? <==hierarchy_stoplist 後面的關鍵字 (此例為 cgi-bin)
# 若發現在用戶端所需要的網址列,則不快取 (避免經常變動的資料庫或程式訊息)
cache_mem 8 MB     <==給proxy額外的記憶體,用來處理最熱門的快取資料(需自己加)

# 7. 磁碟快取,亦即放置快取資料的目錄所在與相關設定
cache_dir ufs /var/spool/squid 100 16 256 <==預設使用 100MB 的容量放置快取
coredump_dir /var/spool/squid
# 底下的四個參數得要自己加上來喔!舊版才有這樣的預設值!
minimum_object_size 0 KB    <==小於多少 KB 的資料不要放快取,0 為不限制
maximum_object_size 4096 KB <==與上頭相反,大於 4 MB 的資料就不快取到磁碟
cache_swap_low 90   <==與下一行有關,減低到剩下 90% 的磁碟快取為止
cache_swap_high 95  <==當磁碟使用量超過 95% 就開始刪除磁碟中的舊快取

# 8. 其他可能會用到的預設值!參考參考即可,並不會出現在設定檔中。
access_log /var/log/squid/access.log squid <==曾經使用過 squid 的用戶記錄
ftp_user Squid@  <==當以 Proxy 進行 FTP 代理匿名登入時,使用的帳號名稱
ftp_passive on   <==若有代理 FTP 服務,使用被動式連線
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320
# 上面這四行與快取的存在時間有關,底下內文會予以說明
cache_mgr root               <==預設的 proxy 管理員的 email
cache_effective_user squid   <==啟動 squid PID 的擁有者
cache_effective_group squid  <==啟動 squid PID 的群組
# visible_hostname <==有時由於 DNS 的問題,找不到主機名會出錯,就得加上此設定
ipcache_size 1024  <==以下三個為指定 IP 進行快取的設定值
ipcache_low 90
ipcache_high 95

光是瞭解上述的一些基礎設定值,可能就要頭昏昏了,更別說 squid.conf 裡面的其他設定值,看到頭好昏... 無論如何,上述這些設定已經是很基礎的設定了,你最好瞭解一下!除了 cache_dir 那一行取消註解,其他的保持不動! 讓我們以預設值來直接啟動 squid 看看有什麼特別的地方再說。

    使用預設值來啟動 squid 並觀察相關資訊

要啟動 squid 真是簡單,讓我們來啟動 squid 並且觀察有沒有相關的埠口吧!

[root@www ~]# /etc/init.d/squid start
init_cache_dir /var/spool/squid... 正在啟動 squid: .       [  確定  ]
# 第一次啟動會初始化快取目錄,因此會出現上述左邊的資料,未來這個訊息不會再出現
[root@www ~]# netstat -tulnp | grep squid
Proto Recv-Q Send-Q Local Address   Foreign Address   State    PID/Program name
tcp        0      0 :::3128         :::*              LISTEN   2370/(squid)
udp        0      0 :::45470        :::*                       2370/(squid)
[root@www ~]# chkconfig squid on

如果你有設定 icp_port 時,squid 預設會啟動 3128 及 3130 兩個埠口,其中要注意的是, 實際幫用戶進行監聽與傳送資料的是 port 3128 (TCP),3130 (UDP) 僅是負責與鄰近 Proxy 互相溝通彼此的快取資料庫的功能,與實際的用戶要求無關。因此,如果你的 proxy 是單純的單一主機,或者是單純的作為防火牆功能,那麼這個 port 3130 是可以關閉的。就因如此,所以 CentOS 6.x 預設將這個設定值註解不使用囉!

例題:
由於我的 Proxy 僅是部簡單的單一代理伺服器,並沒有架設成為公開的鄰近代理伺服器 (peer proxy 或 neighbor proxy), 因此想要關閉 port 3130 ,該如何處理?
答:
舊版的 CentOS 5.x 以前的版本才需要進行,很簡單,直接修改 icp_port 即可!方法為:
[root@www ~]# vim /etc/squid/squid.conf
#Default: VBird 2011/04/06 modified,將下列資料從 3130 改為 0 即可
icp_port 0

[root@www ~]# /etc/init.d/squid restart

事實上,如果你的用戶端與 proxy 之間的溝通想要使用加密機制的 SSL 功能,以保障用戶端的資訊避免被竊取時, 那麼還有個 https_port 可以取代 http_port !不過,充其量我們的 proxy 並非公開也僅是架設在內部區網, 因此還不需要使用到這個 https_port 啦!

    觀察與修改快取目錄 (cache_dir):權限與 SELinux

從前面的說明我們知道磁碟快取是影響 proxy 效能的一個相當重要的參數,那麼 squid 是如何將快取存進磁碟的呢? squid 是將資料分成一小塊一小塊,然後分別放置到個別的目錄中。由於較多的目錄可以節省在同一個目錄內找好多檔案的時間 (想一想,分門別類的放置書籍在不同的書櫃內,總比將所有書籍雜亂無章的放置到一個大書櫃要好的多吧!), 因此,在預設的 /var/spool/squid/ 目錄下, squid 又會將它分成兩層子目錄來存放相關的快取資料,所以觀察該目錄就會是:

[root@www ~]# ls /var/spool/squid
00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F  swap.state
# 算一下,你會發現共有 16 個子目錄!那麼我們來看看第一個子目錄的內容:

[root@www ~]# ls /var/spool/squid/00
00  08  10  18  20  28 ... 98  A0  A8  B0  B8  C0  C8  D0  D8  E0  E8  F0  F8
01  09  11  19  21  29 ... 99  A1  A9  B1  B9  C1  C9  D1  D9  E1  E9  F1  F9
....(中間省略)....
06  0E  16  1E  26  2E ... 9E  A6  AE  B6  BE  C6  CE  D6  DE  E6  EE  F6  FE
07  0F  17  1F  27  2F ... 9F  A7  AF  B7  BF  C7  CF  D7  DF  E7  EF  F7  FF
# 看見了嗎?總共有 256 個子目錄出現囉!

現在我們知道了較多的目錄是為了將資料分門別類放置,但是第一層 16 個與第二層 256 個是怎麼來的? 讓我們來瞧一瞧 cache_dir 這個重要參數的設定是怎樣:

  • cache_dir ufs /var/spool/squid 100 16 256

在 /var/spool/squid/ 後面的參數意義是:

  • 第一個 100 代表的是磁碟使用量僅用掉該檔案系統的 100MB
  • 第二個 16 代表第一層次目錄共有 16 個
  • 第三個 256 代表每層次目錄內部再分為 256 個次目錄

根據 squid 的說法與其他文獻的說明,這兩層快取目錄較佳的配置就是 16 256 以及 64 64 這兩種配置, 所以我們也不需要修改相關的資料啦!重點時還得要注意這個目錄的檔案擁有者與 SELinux 類型才成呦!

例題:
看起來預設的 proxy 的磁碟快取應該是不夠用,而之前的磁碟規劃又沒有做好,因此 /var/ 最多還有 500MB 可以讓我們做為磁碟快取。 那麼如果想要將預設的磁碟快取改為 500MB 而且再加上 /srv/squid/ 目錄給予 2GB 的容量做為磁碟快取,該如何進行設定?
答:
這裡都與 cache_dir 有關!這個設定值可以重複出現多次!因此,我們可以這樣進行的,特別注意底下的目錄權限與 SELinux 類型呦!
[root@www ~]# vim /etc/squid/squid.conf
#Default: VBird 2011/04/06 modified,底下的設定除了拿掉 # 之外還得修改!
cache_dir ufs /var/spool/squid 500 16 256
cache_dir ufs /srv/squid 2000 16 256

[root@www ~]# mkdir /srv/squid
[root@www ~]# chmod 750 /srv/squid
[root@www ~]# chown squid:squid /srv/squid
[root@www ~]# chcon --reference /var/spool/squid /srv/squid
[root@www ~]# ll -Zd /srv/squid
drwxr-x---. squid squid system_u:object_r:squid_cache_t:s0 /srv/squid/

[root@www ~]# /etc/init.d/squid restart
之所以要改成 squid 擁有,是因為上頭的 squid.conf 中,預設的啟動 PID 的帳號就是 squid 這個人物嘛!所以當然要變更!至於 SELinux 的類型方面,參考預設的 /var/spool/squid 就能夠知道了。不過要注意,某些特定的目錄 (例如 /home) 是不允許建立快取目錄的, 因此我們使用服務資料可以放置的 /srv 作為測試範例囉!

想一想,既然快取是放在磁碟上面的,那麼快取的資料會不會塞滿整個快取磁碟呢?當然會啊!而且當塞滿磁碟之後, 你的 proxy 恐怕就無法繼續運作了!所以,我們當然得要好好的注意磁碟使用量是否已經飽和了。在上述的例題中, 若 /var/spool/squid 塞滿 500MB 而 /srv/squid 塞滿 2GB 那麼你的 proxy 就掛了。為了避免這個問題,因此 squid 有底下兩個重要設定:

  • cache_swap_low 90
  • cache_swap_high 95

代表當磁碟使用量達 95% 時,比較舊的快取資料將會被刪除,當刪除到剩下磁碟使用量達 90% 時,就停止持續刪除的動作。 以本案例中,總共 2.5GB 的容量,當用到 2.5*0.95=2.375G 時,舊的資料會開始被刪除,刪到剩下 2.5*0.9=2.25GB 時,就停止刪除的意思。所以會被刪除掉 125MB 的舊資料就是了。通常這個設定值已經足夠了,不需要變動他, 除了你的快取太大或太小時,才會調整這個設定值。

    squid 使用的記憶體計算方式

事實上,除了磁碟容量之外,記憶體可能是另一個相當重要的影響 proxy 效能的因子!怎麼說呢?因為 proxy 會將資料存一份在磁碟快取中,但是同時也會將資料暫存在記憶體當中啊,以加快未來使用者存取同一份資料的速度! 但是這個記憶體快取是需要花費額外的伺服器實體記憶體的量,所以就得要以額外的設定值來指定囉。那就是 cache_mem 這個設定值的功能了。

很多人 (包括鳥哥) 都會誤會 cache_mem 的用途!其實 cache_mem 是額外的指定一些記憶體來進行比較『熱門』的資料存取! cache_mem 並不是指我要使用多少記憶體給 squid 使用,而是指 "我還要額外提供多少記憶體給 squid 使用" 的意思』!由於預設 1GB 的磁碟快取會佔用約 10M 的記憶體,而 squid 本身也會佔用約 15MB 的記憶體, 因此,上個例題中 squid 使用掉的記憶體就有:

  • 2.5 * 10 + 15 + "cache_mem 設定值 (8)"

squid 官方網站建議你的實體記憶體最好是上面數值的兩倍,也就是說,上述的記憶體使用量已經是 48MB, 則我的實體記憶體最好至少要有 100 MB 以上,才會有比較好的效能!當然,這個單指 Proxy 部分而已,如果你的該部主機還有負責其他的工作,呵呵!那麼記憶體就得在累加上去啦!一般來說,如果你的 Proxy 很多人使用時,這個值越大越好,但是最好也要符合上面的需求喔!

例題:
由於我的記憶體夠大,而 proxy 確實是我重要的服務,因此想要增加額外的 32MB 作為熱門資料快取,該如何修改?
答:
直接做了啦!就是修改 cache_mem 而已!
[root@www ~]# vim /etc/squid/squid.conf
#Default: VBird 2011/04/06 modified,將原本的 8 改為 32 囉!
cache_mem 32 MB

[root@www ~]# /etc/init.d/squid restart

17.2.3 管控信任來源 (如區網) 與目標 (如惡意網站): acl 與 http_access 的使用

在上面的基礎設定中,其實僅有 proxy 伺服器本身可以向自己的 proxy 要求網頁代理~那有個屁用啊? 我們的重點是想要開放給區網來使用這個 proxy 的嘛!所以當然得要修改信任用戶的管控參數囉。 此時,那個重要到不行的 acl 就得要來瞧一瞧啦!這個 acl 的基本語法為:

acl <自訂的 acl 名稱> <要控制的 acl 類型> <設定的內容>

由於 squid 並不會直接使用 IP 或網域來管控信任目標,而是透過 acl 名稱來管理,這個 <acl 名稱> 就必須要設定管理的是來源還是目標 (acl 類型) ,以及實際的 IP 或網域 (設定的內容) 啦!這個 acl 名稱可以想成是一個暱稱就是了。那麼有哪些重要的 acl 類型呢?基本上有這些:

    管理是否能使用 proxy 的信任用戶端方式:

由於網際網路主要有使用 IP 或主機名稱來作為連線方式的,因此信任用戶的來源至少就有底下幾種:

  • src ip-address/netmask
    主要控制『來源的 IP 位址』。舉例來說,鳥哥的內網有兩個,分別是 192.168.1.0/24 以及 192.168.100.0/24 , 那麼假設我想要制訂一個 vbirdlan 的 acl 名稱,那就可以在設定檔內寫成:
    acl vbirdlan src 192.168.1.0/24 192.168.100.0/24

  • src addr1-addr2/netmask
    主要控制『一段範圍來源的 IP 位址』。假設我只想要讓 192.168.1.100-192.168.1.200 使用這部 proxy ,那麼就用:
    acl vbirdlan2 src 192.168.1.100-192.168.1.200/24

  • srcdomain .domain.name
    如果來源用戶的 IP 一直變,所以使用的是 DDNS 的方式來更新主機名稱與 IP 的對應,此時我們可以使用主機名稱來開放! 例如來源是 .ksu.edu.tw 的來源用戶就開放使用權,那就是:
    acl vbirdksu srcdomain .ksu.edu.tw

    管理是否讓 proxy 幫忙代理到該目標去獲取資料:

除了管理來源用戶之外,我們還能夠管理是否讓 proxy 伺服器到某些目標去獲取資料喔!在預設的設定中, 我們的 proxy 僅管理可以向外取得 port 21, 80, 440... 等埠口的目標網站,不是這些埠口就無法幫忙代理取得。 至於 IP 或網域則沒有管理。基本的管理有這些方式:

  • dst ip-addr/netmask
    控制不能去的目標網站的 IP ,舉例來說,我們不許 proxy 去捉取 120.114.150.21 這部主機的 IP 時,可以寫成是:
    acl dropip dst 120.114.150.21/32

  • dstdomain .domain.name
    控制不能去的目標網站的主機名稱。舉例來說,如果你在上課時不允許學生跑去種田還是小小戰爭,那就得要把 .facebook.com 給關閉!那就需要寫成:
    acl dropfb dstdomain .facebook.com

  • url_regex [-i] ^http://url
    使用正規表示法來處理網址列的一種方式!這種方式的網址列必須要完整的輸入正規表示法的開始到結尾才行。 舉例來說,崑山科大的中文網頁寫法為 (並非部分比對,所以最結尾的 .* 記得要加上去!):
    acl ksuurl url_regex ^http://www.ksu.edu.tw/cht/.*

  • urlpath_regex [-i] \.gif$
    與上一個 acl 非常類似,只是上一個需要填寫完整的網址資料,這裡則是根據網址列的部分比對來處置。以上述的預設案例來說, 只要網址列結尾是 gif (圖片檔) 就符合這個項目了。萬一我要找出有問題的色情網站,有出現 /sexy 名稱並以 jpg 結尾的, 就予以抵擋,那就是使用:
    acl sexurl urlpath_regex /sexy.*\.jpg$

除了上述的功能之外,我們還能夠使用外部的檔案來提供相對應的 acl 內容設定值喔! 舉例來說,假設我們想要抵擋的外部主機名稱常常會變動,那麼我們可以使用 /etc/squid/dropdomain.txt 來設定主機名稱, 然後透過底下的方式來處理

acl dropdomain dstdomain "/etc/squid/dropdomain.txt"

然後在 dropdomain.txt 當中,一行一個待管理的主機名稱,這樣也能夠減少持續修改 squid.conf 的困擾! 好了!瞭解了 acl 之後,接下來得要談談 http_access 這個實際放行或拒絕的參數了!

    以 http_access 調整管理信任來源與管控目標的『順序』:

設定好 acl 之後,接下來就是要看看到底要不要放行喔~放行與否跟 http_access 這個項目有關。基本上, http_access 就是拒絕 (deny) 與允許 (allow) 兩個控制項目,然後再加上 acl 名稱就能夠達到這樣的功能了! 只是你得要特別注意的是:http_access 後面接的資料,是有順序的!這個觀念很重要喔! 我們用底下的案例來說明好了:

假設我要放行內部網路 192.168.1.0/24, 192.168.100.0/24 這兩段網域,然後拒絕對外的色情相關圖片, 以及 facebook.com 網站,那麼就應該要這樣做:

[root@www ~]# vim /etc/squid/squid.conf
# http_access 是有順序的,因此建議你找到底下這個關鍵字行後,將你的資料加在後面
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
acl vbirdlan src 192.168.1.0/24 192.168.100.0/24
acl dropdomain dstdomain .facebook.com
acl dropsex urlpath_regex /sexy.*jpg$
http_access deny dropdomain  <==這三行的『順序』很重要!
http_access deny dropsex
http_access allow vbirdlan

[root@www ~]# /etc/init.d/squid restart

你得要注意,如果先放行了 vbirdlan 才抵擋 dropdomain 時,你的設定可能會失敗!因為內網已經先放行, 因此後面的規則不會比對,那麼 facebook.com 就無法被抵擋了!這點得要很注意才行! 通常的作法是,先將要拒絕的寫上去,然後才寫要放行的資料就好了

17.2.4 其他額外的功能項目

    不要進行某些網頁的快取動作

從前面的說明我們知道 Proxy 的快取通常在記錄比較少變動的資料,如果是討論區或者是程式控制類的資料庫型態網頁, 那麼恐怕就沒有快取的需要,因為資料一直變動嘛!你總不希望你發了一帖留言,結果等一下再去瀏覽時,看到的還是舊留言吧! 所以囉,在預設的情況下,squid 已經拒絕某些資料的快取了,那就是底下的幾個設定值:

acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY  <==重點就是這一行!可以拒絕,不要讓後面的 URL 被快取!

我們知道通常 .php 結尾的網頁大部分就是討論區之類的變動性資料,那麼能不能出現 .php 結尾的網頁就不要快取呢? 當然可以啊!那該如何進行?我們以上面的資料來照樣造句一下吧!

例題:
只要網址列出現 .php 結尾的,就不予以快取!
答:
透過 acl 配合 cache 這兩個參數來處理即可!
[root@www ~]# vim /etc/squid/squid.conf
acl denyphp urlpath_regex \.php$
cache deny denyphp
# 在此檔案的最後新增這兩行即可!

[root@www ~]# /etc/init.d/squid restart

    磁碟中快取的存在時間

還記得底下的設定值嗎?這個設定值的參數是這樣設定的:

# refresh_pattern <regex>   <最小時間> <百分比> <最大時間>
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320
  • regex:使用的是正規表示法來分析網址列的資料,如上面第一行設定為網址列開頭是 ftp 的意思。

  • 最小時間:單位是分鐘,當取得這個資料的時間超過這個設定值,則該資料會被判定為舊資料。如上面第一行, 表示當取得的資料超過 1440 分鐘時,該資料會被判定為舊資料,若有人嘗試讀取同樣的網址列,那麼 squid 會重新抓取該資料,不會使用快取內的舊資料。至於第三行,則表示除了上述的兩個開頭資料外,其他的資料都是被定義為新的, 因此 squid 只會從快取內抓資料給用戶端。

  • 百分比:這個項目與『最大時間』有關,當該資料被抓取到快取後,經過最大時間的多少百分比時,該資料就會被重抓。

  • 最大時間:與上一個設定有關,就是這個資料存在快取內的最長時間。如上面第一行,最大時間為 10080 分鐘,但是當超過此時間的 20% (2016分鐘) 時,這個資料也會被判定為舊資料。
例題:
在網址列出現 .vbird. 字樣時,該資料為暫時使用的,因此 2 小時後就算舊資料。而最長保留在快取給她一天的時間, 且經過 50% 的時間後,就被判定為舊資料吧!
答:
[root@www ~]# vim /etc/squid/squid.conf
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern \.vbird\.       120     50%     1440
refresh_pattern .               0       20%     4320

[root@www ~]# /etc/init.d/squid restart

    主機名稱與管理員的 email 指定

如果你的伺服器主機名稱尚未決定,因此使用的主機名稱在網際網路上面是找不到對應的 IP 的 (因為 DNS 未設定), 那麼在預設的 squid 設定中,恐怕會無法順利的啟動。此時你可以手動的加入一個主機名稱,就是透過 visible_hostname 來指定。 同時,如果用戶端使用 squid 出現任何錯誤時,螢幕上都會出現管理員的 email 讓用戶可以回報。現在假設主機名稱為 www.centos.vbird 且管理員的 email 為 dmtsai@www.centos.vbird ,此時我們可以這樣修改:

[root@www ~]# vim /etc/squid/squid.conf
cache_mgr dmtsai@www.centos.vbird  <==管理員的 email 呦!
visible_hostname www.centos.vbird  <==直接設定主機名稱喔!

[root@www ~]# /etc/init.d/squid restart

17.2.5 安全性設定:防火牆, SELinux 與黑名單檔案

    防火牆得要放行 tcp 的 port 3128

現在我們已經設定了讓 192.168.100.0/24 及 192.168.1.0/24 這兩段來源使用我們的 proxy server , 那麼想當然爾,防火牆的設定就得要開放這兩段使用 port 3128 才行啊!不過你得要特別注意,並不是開放防火牆就能使用 proxy server 的資源,還得要使用 acl 配合 http_access 才行呦!注意注意!假設你已經使用了 iptables.rule , 那麼修改的方法就是這樣:

[root@www ~]# vim /usr/local/virus/iptables/iptables.allow
iptables -A INPUT -i $EXTIF -p tcp -s 192.168.1.0/24 --dport 3128 -j ACCEPT
# 因為內網 192.168.100.0/24 本來就是全部都接受放行的!

[root@www ~]# /usr/local/virus/iptables/iptables.rule
    SELinux 的注意事項

針對 proxy 來說,CentOS 6.x 倒是沒有給予太多的規則限制,因此似乎不太需要修訂規則。不過,SELinux 的安全本文在類型部分得注意。這包括設定檔 (/etc/squid/ 內的資料) 類型是 squid_conf_t 的樣式, 而快取目錄的類型則是 squid_cache_t 的類型,且上層類型 (/var/spool/) 應該是要成為 var_t 之類的才行。 修改的方法就是透過 chcon 來處理即可。

    建立黑名單設定檔

我們在 17.2.3 小節裡面談到,可以透過『 dstdomain .domain.name 』來抵擋不想連線的網站。 不過每次都得使用 root 身份來設定 squid.conf 才行。那有沒有辦法額外處理出一個檔案,讓想要拒絕連線的資料寫入, 這樣比較容易管理,不需要一直去修改 squid.conf 嘛!有沒有辦法可以達成呢?有的,就透過特定檔案來處置即可。 看看底下這個例題來修訂一下吧:

例題:
建立一個名為 /etc/squid/dropdomain.txt 的檔案,內容為拒絕連線的目標網站。
答:
我們之前設定過相關的網站,處理的方法是直接將主機名稱寫入 squid.conf 中,現在我們可以這樣修訂:
[root@www ~]# vim /etc/squid/squid.conf
# 找到底下的資料,就是 dropdomain 那行,約在 629 行左右,並且修改一下
acl dropdomain dstdomain "/etc/squid/dropdomain.txt"
# 注意一下,如果是檔名,請寫絕對路徑,且使用雙引號或單引號圈起來!

[root@www ~]# vim /etc/squid/dropdomain.txt
.facebook.com
.yahoo.com
# 一行一個 domain 名稱即可

[root@www ~]# /etc/init.d/squid reload

這個方法的好處是,你可以使用額外的控制方式去修改 /etc/squid/dropdomain.txt 這個檔案的內容, 並且修改完畢後再使用 reload 去載入設定檔,不必要重新啟動 (restart),因為 reload 的速度比較快速。 舉例來說,鳥哥的專題生就用 PHP 寫了一支控制該檔案的網頁介面,可以讓老師在上課時直接透過網頁輸入要被控制的目標網站, 這樣學生就無法在上課時連線到外面的某些網站去玩遊戲囉~

17.3 用戶端的使用與測試

既然 proxy 是給瀏覽器用的,那麼自然在瀏覽器上面就需要設定一些參數囉!那麼如何設定呢?由於不同的瀏覽器在設定 Proxy 的地方也都不同,所以底下我們介紹目前比較常見的兩款瀏覽器,分別是 firefox 以及 IE 的設定,至於其他的瀏覽器,請參考各瀏覽器的相關說明啊!

17.3.1 瀏覽器的設定: firefox & IE

    firefox 5.x 的設定示意

要在 firefox 5.X 上面設定好 proxy 基本步驟是這樣的:首先打開 firefox 軟體,出現如下的圖示後,點選:『工具』內的『選項』, 示意畫面如下所示:

在 firefox 上頭設定 proxy 的流程
圖 17.3-1、在 firefox 上頭設定 proxy 的流程

然後在出現的如下畫面中,先選擇右上方的『進階』項目,然後點選『網路』頁面,最後再點選連線的『設定』按鈕, 如下圖所示,依序來動作:

在 firefox 上頭設定 proxy 的流程
圖 17.3-2、在 firefox 上頭設定 proxy 的流程

此時就會出現如下圖所示的要你輸入代理伺服器的相關資料。請先點選『手動設定』之後才能夠填寫底下的方格。 填上我們伺服器的 IP (鳥哥的案例中,使用的是 192.168.1.100 這一部) 以及埠口,然後鳥哥建議你也可以勾選『所有通訊協定都用此 proxy 』的項目,都設定妥當後,才按下確定。如下圖所示的流程:

在 firefox 上頭設定 proxy 的流程
圖 17.3-3、在 firefox 上頭設定 proxy 的流程

這樣就設定好 firefox 的 proxy 相關資料了,有夠簡單吧!

    IE 的設定示意

那麼 IE 要怎麼設定呢?也是很簡單啦!首先,打開 IE 軟體,你會看到如下的示意圖,點選『工具』內的『網際網路選項』, 流程如下所示:

在 IE 上頭設定 proxy 的流程
圖 17.3-4、在 IE 上頭設定 proxy 的流程

在接下來的視窗中,點選『連線』的頁面,然後按下『區域網路設定』的按鈕。流程如下所示:

在 IE 上頭設定 proxy 的流程
圖 17.3-5、在 IE 上頭設定 proxy 的流程

最後就是要輸入正確的 proxy server 的 IP 與 port 的相關資料啊!如下圖所示,先點選箭頭 1 所指定的項目,然後才能夠開始填寫正確資料。 一般來說,近端網址 (例如區網的伺服器) 可以不透過 proxy 去捉取資料,因此這裡可以勾選箭頭三所示意的方框喔! 這樣就設定完畢。

在 IE 上頭設定 proxy 的流程
圖 17.3-6、在 IE 上頭設定 proxy 的流程

接下來讓鳥哥用 firefox 來測試一下,如果你要連的網站是被拒絕的會如何?

17.3.2 測試 proxy 失敗的畫面

開始利用你的瀏覽器來瀏覽各個網站,基本上你都會發現正確的網站內容。但如果你要連的網站是剛剛被拒絕的呢? 舉例來說,剛剛我們有設定拒絕連向 .yahoo.com 的喔!那麼如果你真的輸入網址是 tw.yahoo.com,那螢幕上應該是會這樣輸出的!

連線被 proxy 拒絕時的反應情況
圖 17.3-7、連線被 proxy 拒絕時的反應情況

從上圖我們可以發現,目標網站是 tw.yahoo.com,然後產生問題的地方在於『 存取被拒絕 (Access Denied) 』,表示問題的發生在於 proxy 的設定,然後系統還很好心的告訴你管理員 (cache administrator) 的 email ,讓你有問題可以回報給他。 最後,這個資訊是否為新的?底下還會告訴你這個錯誤發生的時間點呢!這樣有沒有很清楚啊? ^_^! proxy 的錯誤不只是這些,因此,當你還有發現無法連線的網站時,請務必要看看螢幕的輸出資訊才好呦!

17.4 伺服器的其他應用設定

除了基本的 proxy 設定之外,如果你還有其他可供利用的上層代理伺服器,說不定我們就能夠設計一下如何進行分流的動作了! 此外,如果針對信任用戶來說,難道得要一直使用 acl 直接指定用戶來源然後再用 http_access 放行?有沒有認證功能啊? 這樣就不用一直修改設定啊!這些其它的應用設定在這個小節來談談吧!

17.4.1 上層 Proxy 與獲取資料分流的設定

能夠找到的上層 proxy 伺服器我們在 17.1.3 裡面談過了,你可以重新回去瞧瞧。 不過,假設你所在的環境並沒有上層代理伺服器,但是你有兩部 Linux 主機放置在不同的 ISP 環境下, 這兩個 ISP 對某些國外的頻寬流量不同,所以你想要根據這樣的情況來設計一下獲取 WWW 網頁的分流時,可以怎麼做? 我們舉個例子來說好了:

  • hinet.centos.vbird:這部主機位於 hinet 這個 ISP 底下,對大陸 (.cn) 的流量比較高,作為上層代理伺服器之用;
  • www.centos.vbird:這部主機位於學術網路 (崑山科大),因為對大陸頻寬被限制,因此瀏覽速度相對較慢。

現在我們規劃 hinet.centos.vbird 是上層代理伺服器,因此這部主機得要開放 www.centos.vbird 這部機器的使用權, 這動作包括: (1)利用 acl srcdomian 等方式放行 www.centos.vbird 的使用權; (2)開放 www.centos.vbird 的 port 3128 的防火牆過濾功能。如此一來,我們這部 www.centos.vbird 才能夠使用上層代理伺服器喔!也就是說,這兩部主機都要是你能夠掌握的才行 (至少也要上層 ISP 能夠替你開放使用權啦)。

那麼 www.centos.vbird 要如何設定呢?基本上,設定上層代理伺服器與分流的參數主要有: cache_peer, cache_peer_domain, cache_peer_access 等,分別說明語法如下:

    cache_peer 的相關語法
cache_peer [上層proxy主機名] [proxy角色] [proxy port] [icp port] [額外參數]

這個設定值就是在規範上層代理伺服器在哪裡,以及我們想要對這部代理伺服器如何查詢的相關設定值。

  • 上層 proxy 主機名:例如本案例中就是 hinet.centos.vbird 這一部囉;
  • proxy 角色:這部 proxy 是我們的上層 (parent) ?還是作為我們鄰近 (sibling) 的協力運作的 proxy ? 因為我們要利用上層去捉取資料,因此經常使用的是 parent 這個角色值;
  • proxy port:通常就是 3128 嘛!
  • icp port:通常就是 3130 嘛!
  • 額外參數:針對這部上層 proxy 我們想要對它進行的查詢資料的行為設定。主要有:
    • proxy-only:向上層 proxy 要到的資料不會快取到本地的 proxy 伺服器內,降低本地 proxy 負擔;
    • wieght=n:權重的意思,因為我們可以指定多部上層 Proxy 主機,哪一部最重要?就可以利用這個 weight 來設定,n 越大表示這部 Proxy 越重要
    • no-query:如果向上層 Proxy 要求資料時,可以不需要發送 icp 封包,以降低主機的負擔
    • no-digest:表示不向附近主機要求建立 digest 紀錄表格
    • no-netdb-exchange:表示不向附近的 Proxy 主機送出 imcp 的封包要求
    cache_peer_domain 的相關語法
cache_peer_domain [上層proxy主機名] [要求的領域名]

這個設定值的意思是說,你想要使用這部上層代理伺服器向哪個領域名稱要求資料。

    cache_peer_access 的相關語法
cache_peer_access [上層proxy主機名] [allow|deny] [acl名稱]

與 cache_peer_domain 相當類似,只是 cache_peer_domain 直接規範了主機名稱 (domain name), 而如果你想要設計的並非領域名稱,而是某些特定的 IP 網段時,就得要先用 acl 設計一個名稱後, 再以這個 cache_peer_access 去放行 (allow) 或拒絕 (deny) 讀取了。

根據上述的語法說明,那麼我們想要達到 .cn 使用 hinet.centos.vbird 這部伺服器的代理功能時, 應該要這樣設計的:

[root@www ~]# vim /etc/squid/squid.conf
cache_peer hinet.centos.vbird parent 3128 3130 proxy-only no-query no-digest
cache_peer_domain hinet.centos.vbird .cn

[root@www ~]# /etc/init.d/squid reload

如果你還有其它的需求再利用 acl 規範了目標位置後,再以 cache_peer_access 去放行吧! 如此一來,你的 proxy server 就是一部會主動的依據不同的要求向不同的上層伺服器求取資料的聰明 proxy 囉!

17.4.2 Proxy 服務放在 NAT 伺服器上:通透式代理 (Transparent Proxy)

從上面的說法來看,我們可以發現 proxy 可以做到類似防火牆的功能 (acl dst, acl dstdomain 再配合 http_access 處理), 但是,我們也知道瀏覽器得要設定好 proxy 之後,才會真的使用 proxy 嘛!那就不就是在耍寶用的防火牆嗎? 只要你的用戶知道不要設定 proxy 就可以躲過你的管控,那這部 proxy 防火牆有啥屁用啊?您說是吧?

那該如何強制使用者一定要使用你的 proxy 呢?很簡單!那就是: (1)在對外的防火牆伺服器 (NAT) 上面安裝 proxy; (2)在 proxy 上頭啟動 transparent 功能; (3) NAT 伺服器加上一條 port 80 轉 port 3128 的規則,如此一來,所有往 port 80 的封包就會被你的 NAT 轉向 port 3128 , 而你的 port 3128 就是 proxy ,那大家就得要用你的 proxy ,而且重點是,瀏覽器不需要進行任何設定!

呵呵!也就是說,當使用者是經過 NAT 伺服器連線出去時,只要讓 NAT 伺服器發現『咦!你是要去捉 WWW 的資料對吧!好!那麼這個動作由 Proxy 服務幫你搞定!』如此一來,使用者根本就不需要在瀏覽器上面設定 Proxy 的相關資料,因為這個動作是『由 NAT 伺服器自己決定的』,所以只要在 NAT 伺服器上面設定妥當即可,使用者不必設定任何資料呢!呵呵!真是不錯!而且進行的動作非常簡單!

# 1. 設定 proxy 成為通透式代理伺服器的功能!
[root@www ~]# vim /etc/squid/squid.conf
http_port 3128  transparent
# 找到 3128 這行後,在最後面加上 transparent 即可

[root@www ~]# /etc/init.d/squid reload

接下來,將來自 192.168.100.0/24 這個內網的來源,只要是要求 port 80 的,就將它重新導向 port 3128 的方式為:

[root@www ~]# vim /usr/local/virus/iptables/iptables.rule
iptables -t nat -A PREROUTING -i $INIF -s 192.168.100.0/24 -p tcp \
         --dport 80 -j REDIRECT --to-ports 3128
# 將上述這一行加在最底下 /etc/init.d/iptables save 的上面一行即可!

[root@www ~]# /usr/local/virus/iptables/iptables.rule

這樣就結束啦!很簡單吧!通常這樣的環境相當適合學校內的教室或者是計中的環境, 因為這樣學校內部根本不需要請學生設定瀏覽器的 proxy 功能,立刻就能夠達到我們所需要的管控能力!很棒吧! 不過,雖然這樣的功能已經很棒了,但是鳥哥實際用在學校教室環境中卻發現了一些問題, 那就是很多同學同時上傳同一個檔案到外部伺服器去,因為 proxy 快取的功能,結果讓學生一直取得舊的檔案, 對於教網頁製作的老師來說,很困擾~因為教學過程中常常需要上傳最新的網頁嘛!但是 proxy 快取住, 所以卻得到錯誤的資料了~那怎辦?

    僅具有 proxy 無快取功能的代理

既然我們這個 transparent proxy 的目的僅是在進行控管,並不要去處理快取的任務 (因為頻寬假設是夠的), 那麼乾脆就不要快取啦!這樣不就 OK 啦?好吧!那我們就來搭配 transparent 進行這個設定看看。 假設 transparent proxy 已經設定妥當,那麼接下來就是讓你的快取目錄空空如也,且再也不寫入任何資料。 此外,也不要有多餘的記憶體來記錄熱門檔案啦!

# 先關閉 squid ,然後刪除快取目錄,之後再重建快取目錄,此時快取目錄就空了
[root@www ~]# /etc/init.d/squid stop
[root@www ~]# rm -rf /var/spool/squid/*
[root@www ~]# vim /etc/squid/squid.conf
cache_dir ufs /var/spool/squid 100 16 256 read-only
#cache_dir ufs /srv/squid 2000 16 256
# 額外的那個 /srv/squid 註解掉,然後第一行多個 read-only 字樣!
cache_mem 0 MB
# 本來規範有 32MB ,現在不要了!

[root@www ~]# /etc/init.d/squid start

如此一來,這部 proxy 就再也沒有快取了,全部資料都得要自己向外頭捉取!就不會有舊資料重複出現的問題~

17.4.3 Proxy 的認證設定

既然 proxy 有許多功用,包括分流的功能,很不賴啊!但是,由於網路閒人越來越多,因此 proxy 不可以設計為 open proxy !亦即是不能夠開放所有的人使用你的 proxy 啦!所以,一般來說, proxy 只會開放內部網域的人們來使用而已。 問題是,如果我在 Internet 也想要使用這部自己架設的 proxy 時,該如何是好?還得要再次的修改 squid.conf 嗎? 有沒有這麼麻煩?

沒關係啦!為了這個問題, squid 官方軟體已經給予了認證的設定功能!意即我們可以透過認證來簡單的輸入帳號密碼, 若通過驗證,就可以立刻使用我們的 proxy 了!這樣就好多啦!那如何達成呢?其實 squid 提供很多認證功能, 我們需要的是最簡單的功能即可。使用的是 squid 主動提供的 ncsa_auth 認證模組,這個模組會利用 apache (WWW 伺服器) 提供的帳密建立指令 (htpasswd) 所製作的密碼檔作為驗證依據。所以,我們至少需要檢查有沒有這兩樣東西:

[root@www ~]# rpm -ql squid | grep ncsa
/usr/lib64/squid/ncsa_auth    <==有的!就是這個驗證模組檔案!注意完整路徑
/usr/share/man/man8/ncsa_auth.8.gz

[root@www ~]# yum install httpd   <==apache 軟體安裝
[root@www ~]# rpm -ql httpd | grep htpasswd
/usr/bin/htpasswd           <==就是需要這個帳密建立指令!
/usr/share/man/man1/htpasswd.1.gz

這樣的事前準備就差不多了。讓我們來考慮一個案例好了:

  • 內部網域 192.168.100.0/24 要使用 proxy 的,還是不需要透過驗證;
  • 外部主機想要使用 proxy (例如 192.168.1.0/24 這段) 才需要驗證;
  • 使用 NCSA 的基本驗證方式,且密碼檔建立在 /etc/squid/squid_user.txt
  • 上述檔案僅有一個用戶 vbird ,他的密碼為 1234

那該如何處理呢?開始來一步一步進行吧:

# 1. 先修改 squid.conf 檔案內容
[root@www ~]# vim /etc/squid/squid.conf
# 1.1 先設定驗證相關的參數
auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/squid_user.txt
auth_param basic children 5
auth_param basic realm Welcome to VBird's proxy-only web server
# 非特殊字體為關鍵字不可更動,第一行為透過 ncsa_auth 讀取 squid_user.txt 密碼
# 第二行為啟動 5 個程序 (squid 的子程序) 來管理驗證的需求;
# 第三行為驗證時,顯示給使用者看的歡迎訊息,這三行可寫在最上面!

# 1.2 然後是針對驗證功能放行與否的 acl 與 http_access 設定
acl vbirdlan src 192.168.100.0/24  <==修改一下,取消 192.168.1.0/24
acl dropdomain dstdomain "/etc/squid/dropdomain.txt"
acl dropsex urlpath_regex /sexy.*jpg$
acl squid_user proxy_auth REQUIRED <==建立一個需驗證的 acl 名稱
http_access deny dropdomain
http_access deny dropsex
http_access allow vbirdlan
http_access allow squid_user       <==請注意這樣的規則順序喔!驗證在最後

# 2. 建立密碼資料
[root@www ~]# htpasswd -c /etc/squid/squid_user.txt vbird
New password:
Re-type new password:
Adding password for user vbird
# 第一次建立才需要加上 -c 的參數,否則不需要加上 -c 喔!

[root@www ~]# cat /etc/squid/squid_user.txt
vbird:vRC9ie/4E21c.  <==這就是使用者與密碼囉!

[root@www ~]# /etc/init.d/squid restart

比較需要注意『acl squid_user proxy_auth REQUIRED』這一串設定,proxy_auth 是關鍵字,而 REQUIRED 則是指定任何在密碼檔內的使用者都能夠使用驗證的意思。如果一切順利的話,那麼你的內網依舊可以使用 transparent proxy , 而外網則需要輸入帳密才能夠使用 proxy server 提供的代理能力。至於驗證的過程有點像這樣:

使用 proxy 需驗證的示意圖
圖 17.4-1、使用 proxy 需驗證的示意圖

上圖中箭頭 1 為剛剛你設定的 real 內容,而帳密則是你用 htpasswd 所建立的資料啦!另外,既然已經加上了驗證功能, 那麼你可能得要將防火牆開放 port 3128 對全世界監聽的過濾才行呦!防火牆還是不要忘記了! ^_^

17.4.4 末端登錄檔分析: sarg

事實上, squid 已經收集了眾多的登錄檔分析軟體了,而且大多是免費的 (http://www.squid-cache.org/Scripts/) ,你可以依照自己的喜好來加以安裝與分析你的 squid 登錄檔喔!鳥哥這裡僅介紹一套相當強的分析軟體, 那就是 sarg。

Squid Analysis Report Generator (Squid 分析報告製作者),他的官方網站在: http://sarg.sourceforge.net/sarg.php,他的原理相當的簡單,就是將 logfile 拿出來,然後進行一下解析,依據不同的時間、網站、與熱門網站等等來進行資料的輸出, 由於輸出的結果實在是太詳細了!所以...呵呵!如果你是老闆的話,用這個軟體會讓你『愛不釋手』啊! 因為每個人的每個小動作都會被記錄下來,我的天吶!當我第一次看到這個分析的畫面時,真的給他嚇了老大一跳得說~因為連每個 IP 在『每個小時所連上的每個網站資料』都有紀錄~~害怕了吧~

不過,有優點就有缺點啦!怎麼說呢?因為 SARG 功能太強大了,所以記錄的『資料量』就實在是多了點,如果你的 Proxy 網站屬於那種很大流量的網站時,那麼就不要使用『日報表』,也就是每天產生一份報表的那種方式! 那麼由於資料一天可能會有幾 MB 的資料,一兩個月還沒有關係,如果記錄了幾年,那麼光是這些記錄就會花掉好幾 GB 的硬碟空間了~此外,也可以使用『覆蓋舊有資料』的方式不要留存舊資料,這樣也可以節省硬碟的空間啦!

在 SARG 的官網上面已經有朋友替大家將 RPM 的檔案製作出來了,你可以參考:http://packages.sw.be/sarg/ 網站內的檔案。由於鳥哥用的是 CentOS 6.x 64 位元版本,但截至本日為止 (2011/08) 這個網站尚未釋出穩定的 CentOS 6 版本,因此鳥哥下載的是 sarg-2.2.3.1-1.el5.rf.x86_64.rpm 這個版本。你可以使用 wget 下載到 /root 底下,再用 rpm -ivh 去安裝起來即可。 這個軟體預設會將 /var/www/sarg 作為輸出報表的目標,而且你必須要安裝與啟動 WWW 伺服器, 至於網址列則是: http://your.hostname/sarg 去查閱。底下讓我們來處理 sarg 的設定檔吧!

[root@www ~]# yum install gd
[root@www ~]# rpm -ivh sarg-2.2.3.1-1.el5.rf.x86_64.rpm
[root@www ~]# vim /etc/sarg/sarg.conf
title "Squid 使用者存取報告"           <==第 49 行左右
font_size 12px                         <==第 69 行左右
charset UTF-8                          <==第 353 行左右

# 1. 一口氣製作所有登錄檔內的資料報表
[root@www ~]# sarg
SARG: Records in file: 2285, reading: 100.00%  <==列出分析資訊

# 2. 製作 8 月 2 日的報表
[root@www ~]# sarg -d 02/08/2011
# 這兩個範例,都會將資料丟到 /var/www/sarg/ONE-SHOT/ 底下去;

# 3. 製作昨天的報表
[root@www ~]# sh /etc/cron.daily/sarg
# 這個範例則是將每天的資料放置於 /var/www/sarg/daily/ 底下去!

如果製作好相關資料,由於 sarg 這個 RPM 檔案已經幫我們設定好了每日、每週、每月進行一次執行, 所以你可以不用管怎麼執行啦!非常的方便!如果想要查閱資料,只要在 proxy server 端輸入 http://your.hostname/sarg 會看到如下畫面:

sarg 報表觀察示意圖
圖 17.4-2、sarg 報表觀察示意圖

如上所示,在網址列輸入伺服器本機的咚咚,然後會看到幾個連結。與我們有關的是 ONE-SHOT 以及 daily 兩個, 我們來瞧瞧 ONE-SHOT (箭頭 2 所指) 裡面有啥咚咚?按下去會看到下圖:

sarg 報表觀察示意圖
圖 17.4-3、sarg 報表觀察示意圖

如上圖所示,因為我們剛剛測試執行過兩次 sarg 的指令,所以這裡會有兩個時間的連結。我們先看看總和資料, 亦即圖中箭頭所指的地方,會出現下圖的說明:

sarg 報表觀察示意圖
圖 17.4-4、sarg 報表觀察示意圖

在該段時間內,共有三個用戶在存取,我們來瞧瞧 client.centos.vbird 到底幹了啥事吧!

sarg 報表觀察示意圖
圖 17.4-5、sarg 報表觀察示意圖

看到沒有,這個用戶在這段時間進行過的連線通通在裡面!有沒有很清晰呢?

17.5 重點回顧

  • 代理伺服器的功能是在代理使用者向網際網路要求 Web page 的資料,同時達成 Web pages 的快取記錄,以達到頻寬節省的目的; 此外,還可以額外的達成防火牆的功能;
  • 我們可以透過具有較大頻寬的上層代理伺服器來進行捉取資料的分流;
  • 設定 Proxy 時,如果能以頻寬更大的上層 Proxy 來幫助,將有助於 Client 端瀏覽速度的提昇;
  • 以防火牆的功能來說, Proxy 使用應用層的方式來達成防火牆功能,至於 iptables 則是更為底層的 TCP/IP 分析的方式;
  • 目前 Unix Like 的機器中,做為 proxy 功能的伺服器軟體幾乎都是使用 squid ,而 squid 僅需要設定 squid.conf 這個設定檔即可使用;
  • squid 主要透過 acl 配合 http_access 來進行信任用戶與目標 WWW 伺服器的控管;
  • 用 http_access 這個參數來設定控管行為時,『順序』是有影響的
  • transparent proxy 的功能就是可以讓 client 端不需要設定瀏覽器的 proxy 功能,即可進行 proxy 的工作;

17.6 本章習題

  • 請說明為何 Proxy 可以提升網路的 WWW 瀏覽速度?
  • 萬一 squid 發生了問題,請問我該如何找出問題點?
  • 請說明 Proxy 伺服器的功能為何?
  • 試說明為何 Proxy 伺服器可以提昇網域之內的網路安全性?

17.7 參考資料與延伸閱讀

修改歷史:
  • 2001/??/??:第一次完成日期,其實已經忘記了~
  • 2001/11/09:加入增加 Proxy 效能的方法,就是使用多顆硬碟做成的資料儲存方式!
  • 2003/04/04:完成大幅度的改寫動作!加入了完整的 Proxy 說明,與 pwebstats 的架設!
  • 2003/04/11:完成了另一個末端分析的強大軟體 SARG 分析套件
  • 2003/09/16:微幅調校一下版面!
  • 2004/11/12:修訂 transparent proxy 的設定問題, httpd_accel_with_proxy on
  • 2011/03/31:將舊的基於好老的 Red Hat 9 的文章移動到 此處
  • 2011/04/08:累死了~這篇修改的幅度太大了!好疲倦~
  • 2011/08/02:將基於 CentOS 5.x 的版本移動到此處
2002/01/01以來統計人數
計數器
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計