使用 Squid 代理服務器 Squid 是一種代理服務器,它實現了對 HTTP、FTP 和 Gopher 協議的緩存。Squid 能夠使用訪問控制列表(Access Control List,ACL)來允許或拒絕訪問。Squid 具備強大的可配置能力以及魯棒性,而且用戶會發現,該軟件非常容易學習。更好的是,可將 Squid 配置為透明代理,即好像用戶根本不知道有 Squid 一樣。 1 獲取並安裝 Squid 用戶可從 FTP 站點:ftp://squid.nlanr.net/pub 上獲得最新的版本。目前最新的版本是2.3。現在,我們假定你的代理服務有兩個網絡接口,一個連接到外部世界,而另一個連接到內部網絡,並且你已經關閉了 IP 轉發功能。 圖標 注意 您也可以在僅有一個網絡接口的服務器上建立 Squid,但我們並不建議這樣做。這種配置會加倍本地網絡的交通,並可能導致擁塞。目前,網卡和集線器(Hub)的價格已經非常低廉,即使對較小的網絡而言,這種投資也是值得的。 如果用戶計劃使用 Squid 維護緩存,則需要考慮硬盤驅動器和內存限制。Web 緩存的本質是,有上千個小文件要同時而有效地遞交給客戶。Squid 的作者建議至少需要有 300MHz Pentium II CPU、512MB RAM 和五個超寬 SCSI 硬盤,每個有 9GB 的容量。筆者曾聽說,某個 Internet 供應商只使用幾個 486/66 處理器以及 IDE 驅動器。我認為大部分人處於這兩種極限之間比較合適。筆者建議使用至少 100MHz Pentium CPU、64MB RAM 和 6GB SCSI 硬盤。實際上,略微低一些的配置也沒有多大關系。 在獲得 tar.gz 文件之後,使用下面的命令將它解開: tar zxvf squid-2.3.STABLE4-src.tar.gz 到Squid所在目錄中運行 ./configure 檢查系統設置並建立配置文件之後,可輸入 make 編譯 Squid。如果沒有出現任何錯誤,輸入 make install,默認將會將其安裝到/usr/local下。 2 使用 Squid 為建立交換目錄,輸入如下命令: /usr/local/squid/bin/squid –z 但在第一次運行該命令之前,需要修改 /usr/local/squid/squid.conf 配置文件。Squid 的訪問控制列表默認是拒絕所有的請求。編輯 /usr/local/squid/squid.conf 文件並添加如下行: acl local_net src 192.168.1.1/255.255.255.0 這裡,192.168.1.1 是本地網絡中的一個 IP 地址,而 255.255.255.0 是內部網絡的網絡掩碼。同時還需要添加: http_access allow local_net 將這一行放在 http_access deny all 的前面。這定義了允許使用緩存的 IP 地址組。 輸入 squid & 啟動 Squid。用戶可通過幾種方法驗證 Squid 的運行: l 在 ps -x 的輸出清單中應該出現 Squid。 l 運行 client www.yahoo.com 應該在終端上打印 Web 頁文本。 l 目錄 /var/log/squid 中的 cache.log 和 store.log 能夠表明 Squid 正在工作。 l 運行 squid -k check && echo "squid is running" 將告訴用戶 Squid 是否正在運行。 現在進行真正的測試:在 Netscap Navigator 中,可選擇 Edit->Preference,然後從 Advanced 類中選擇 Proxies 而進行代理設置。選擇 Manual Proxy Configuration 然後單擊 View,可指定 Squid 服務器的 IP 地址作為 HTTP、FTP 和 Gopher 代理服務器。默認的代理端口是 3128,除非在 squid.conf 文件中修改了默認的代理端口,否則應該在 port 框中輸入 3128。 現在應該能夠浏覽任何 Web 站點了。檢查代理服務器上的日志文件 /var/log/squid/access.log,並確認浏覽過的 Web 站點保存在日志文件中,從而可再次證實 Squid 正在工作。 3 配置 Squid 滿足自己的需求 現在 Squid 已經能夠運行,用戶可以定制它以滿足自己的需求。到此為止,Squid 並不限制用戶訪問任何站點。你可以在 squid.conf 文件中定義規則,設置訪問控制列表 (ACL),然後根據這些列表允許或拒絕訪問者。 添加下面的配置行,該行定義了一個 ACL 規則,稱為 BadWords,它匹配任何包含 foo 或 bar 的 URL: acl BadWords url_regex foo bar 這條規則作用於 http://foo.deepwell.com/pictures 和 http://www.thekennedycompound.com/ourbar.jpg,因為這兩個 URL 包含了BadWords 所定義的兩個單詞。 在 squid.conf 文件中添加下面的行,它可以防止用戶訪問任何匹配上述規則的 URL: http_access deny BadWords 圖標 注意 幾乎每個管理員在使用單詞式 ACL 時,都會遇到一些情況,這些情況下不能簡單地使用單詞。比如,如果你要禁止用戶訪問包含有“sex”的站點,則同樣也會禁止他們訪問 www.buildersexchange.com 這樣的站點。因為 “buildersexchange” 剛好屬於這個由“sex”定義的范疇。 因為 Squid 功能的所有方面均受到 squid.conf 文件的控制,因此用戶可通過編輯該文件而調整 Squid 以滿足自己的需求。 比如,添加如下配置行: cach_mem 16 MB 將允許 Squid 使用 16MB 的內存來保存 Web 頁。經過不斷嘗試,就可以找出適合自己的不同數量。 圖標 注意 cache_mem 並不是 Squid 所消耗的內存總量,它只是 Squid 用來保存 Web 頁圖像等的內存最大值。Squid 的文檔中說,Squid 可能會消耗這一數量的三倍多的內存。 使用如下配置行: emulate_httpd_log on 能夠讓 /var/log/squid 中日志文件的格式類似 Web 服務器的日志文件格式。這樣,用戶可以使用 Web 統計程序,例如 Analog 或 WeBTrends 來分析日志,從而了解用戶的使用情況。 某些 FTP 服務器在以匿名方式登錄時需要輸入 e-mail 地址作為口令。通過將 ftp_user 設置為有效的 e-mail 地址,可以讓 FTP 會話另一端的服務器接收到期望的數據,例如: ftp_user [email protected] 你可能想使用代理防火牆管理員的地址,但這可能會導致外部 FTP 管理員與你聯系時出現問題。 如果URL頁沒有被找到,則可以推斷該頁不會在近期出現。通過將 negative_ttl 設置為期望的分鐘數,可以控制 Squid 記住某頁沒有找到的時間,例如: negative_ttl 2 minutes 默認值為 5 分鐘,但如果不想禁止的話,筆者建議減小到兩分鐘或一分鐘,因為用戶希望代理能夠盡量透明。如果用戶正在查找一個已知存在的頁,則代理不應該在該頁能夠實際得到的情況下報告找不到。 cache_mgr [email protected] 將 cache_mgr 設置為自己的 e-mail 地址,可讓 Squid 在檢測到緩存問題時向你發送 e-mail。 cache_effective_user nobody cache_effective_group nobody 這兩行非常重要,如果以 root 身份啟動 Squid,這兩行將把 Squid 的 UID 改變為“nobody”。這將避免程序中的 bug 修改或刪除不應該修改或刪除的東西。 最後,類似 Squid 這樣的工具對用戶來講應該是完全透明的。這樣,用戶不必關系復雜的管理文件,並能夠讓他們浏覽 Web,就像沒有 Web 代理服務器一樣。如何達到這一目的的方法不在本書中討論,用戶可參閱 http://squid.nlanr.net/Squid/FAQ/FAQ.Html 上的 Squid 問答,第 17 小節詳細描述了如何設置 Squid 作為透明代理。 同時,如果你需要在 squid.conf 文件中管理一個大的“黑名單”站點,則可以考慮使用一個重定向程序。大的 ACL 規則列表可能會降低負荷很重的 Squid 代理服務器的速度。而使用重定向程序,則可以提供根據過濾規則允許或禁止訪問 URL 的效率。用戶可在 Squirm 上(http://www.senet.com.au/squirm)獲得詳細信息,它是一個功能完整的 Squid 重定向器。 Squid 發行中帶有一個 cachemrg.cgi 文件。該文件是 CGI 程序,能夠用來查看代理的統計信息,也可以用來關閉或重新啟動 Squid。該程序能夠以清楚的細節來描述代理的執行情況。還能夠幫助你調整 Web 緩存。