本文介紹Linux下非常著名、常用的Squid代理服務器的使用,並著重講述如何使用其提供的訪問控制策略,來保證代理服務器的合法使用。 代理服務器的功能是代理網絡用戶取得網絡信息,它是網絡信息的中轉站。隨著代理服務器的廣泛使用,隨之而來的是一系列的安全問題。由於沒有對代理服務器的訪問控制策略作全面細致的配置,導致用戶可以隨意地通過代理服務器訪問許多色情、反動的非法站點,而這些行為往往又很難追蹤,給管理工作帶來極大的不便。 Squid是Linux下一個緩存Internet數據的代理服務器軟件,其接收用戶的下載申請,並自動處理所下載的數據。也就是說,當一個用戶想要下載一個主頁時,可以向Squid發出一個申請,要Squid代替其進行下載,然後Squid連接所申請網站並請求該主頁,接著把該主頁傳給用戶同時保留一個備份。當別的用戶申請同樣的頁面時,Squid把保存的備份立即傳給用戶,使用戶覺得速度相當快。目前,Squid可以代理HTTP、FTP、GOPHER、SSL和WAIS協議,暫不能代理POP3、NNTP等協議。Squid可以工作在很多操作系統中,如AIX、Digital、Unix、FreeBSD、HP-UX、Irix、Linux、NetBSD、Nextstep、SCO、Solaris、OS/2等。
安裝和配置Squid Server 通常說來,安裝Squid有兩種方法:一是從Red Hat Linux 9中獲取該軟件的RPM包進行;二是安裝從Squid的官方站點http://www.squid-cache.org/ 下載該軟件的源碼進行編譯後安裝。目前網上最新的穩定版本為squid-2.5.STABLE10,下面以此版本為例對兩種安裝方法進行介紹。 Squid服務器工作原理示意圖
1. RPM包的安裝 首先,查看是否已經安裝了squid: #rpm -qa grep squid Red Hat Linux9自帶了Squid安裝軟件包,將第一張安裝光盤放入光驅後掛裝光盤分區: #mount /mnt/cdrom 然後,進入/mnt/cdrom/Red Hat/RPMS目錄: #cd /mnt/cdrom/Red Hat/RPMS 最後,執行安裝: #rpm -ivh squid-2.5.STABLE1-2.i386.rpm 當然,我們也可以在開始安裝系統的過程中安裝該軟件。
2. 源代碼包的安裝 從http://www.squid-cache.org/下載squid軟件的最新源代碼包squid-2.5.STABLE10.tar.gz,然後,按照如下步驟進行安裝。 首先,將該文件拷貝到/tmp目錄: #cp squid-2.5.STABLE10.tar.gz /tmp 然後,解開該文件: #tar xzvf squid-2.5.STABLE10.tar.gz 解開後,在/tmp生成一個新的目錄squid-2.5.STABLE10,為了方便使用mv命令,將該目錄重命名為squid: #mv squid-2.5.STABLE10 squid 切換進入squid目錄: #cd squid 接著,執行/configure,可以用./configure --prefix=/Directory/you/want指定安裝目錄,系統默認安裝目錄為/tmp/squid: #./configure 最後,分別執行make all、make install: #make all #make install 安裝結束後,Squid的可執行文件在安裝目錄的bin子目錄下,配置文件在etc子目錄下。 Squid軟件向用戶提供了許多與配置、應用程序和庫、日志等相關的文檔進行配置和管理,Squid有一個主要的配置文件squid.conf。同時,在Red Hat環境下所有Squid的配置文件都位於/etc/squid子目錄下。在該目錄當中,系統同時提供了一個默認的配置文件,其名稱為squid.conf.default,然而,在實際的應用當中,該默認的配置文件存在某些問題,所以在使用Squid之前,必須首先對該配置文件的有關內容進行修改。 下面介紹squid.conf文件的結構以及一些常用的選項。squid.conf配置文件可以分為13個部分。雖然Squid的配置文件很龐大,該配置文件的規模達到了3000多行。然而,如果只是為一個中小型網絡提供代理服務,並且只准備使用一台服務器,那麼,配置問題將會變得相對簡單,只需要修改配置文件中的幾個選項即可滿足應用需求。這些幾個常用選項分別是:
1. http_port 該選項定義Squid監聽HTTPD客戶連接請求的端口。默認是3128,如果使用HTTPD加速模式,則為80。可以指定多個端口,但是所有指定的端口都必須在一條命令行上出現,程序才能正確地識別。
2. cache_mem(bytes) 該選項用於指定Squid可以使用的內存的理想值。這部分內存被用來存儲以下對象:In-Transit objects(傳入的對象)、Hot Objects(熱對象,即用戶常訪問的對象)、Negative-Cached objects(消極存儲的對象)。
3. cache_dir Directory-Name Mbytes Level1 Level2 該選項指定Squid用來存儲對象的交換空間的大小及其目錄結構。可以用多個cache_dir命令來定義多個交換空間,並且這些交換空間可以分布在不同的磁盤分區。“directory”指明了該交換空間的頂級目錄。如果想用整個磁盤作為交換空間,那麼可以將該目錄作為裝載點將整個磁盤掛裝上去。默認值為/var/spool/squid。Mbytes定義了可用的空間總量。
配置訪問控制 使用訪問控制特性,可以控制在訪問時根據特定的時間間隔進行緩存、訪問特定站點或一組站點等。Squid訪問控制有兩個要素:ACL元素和訪問列表。通過使用這些方法,系統管理員可以嚴格、清晰地定義代理服務器的訪問控制策略。
1. ACL元素 該元素定義的語法如下: acl aclname acltype string1… acl aclname acltype “file”… 當使用文件時,該文件的格式為每行包含一個條目。其中,acltype可以是任一個在ACL中定義的名稱;任何兩個ACL元素不能用相同的名字;每個ACL由列表值組成,當進行匹配檢測的時候,多個值由邏輯或運算連接,換句話說,任一ACL元素的值被匹配,則這個ACL元素即被匹配; 並不是所有的ACL元素都能使用訪問列表中的全部類型;不同的ACL元素寫在不同行中,Squid將這些元素組合在一個列表中。
2. http_Access訪問控制列表 根據訪問控制列表允許或禁止某一類用戶訪問。如果某個訪問沒有相符合的項目,則默認為應用最後一條項目的“非”。比如最後一條為允許,則默認就是禁止。通常應該把最後的條目設為“deny all”或“allow all”來避免安全性隱患。使用該訪問控制列表需要注意如下問題: ● 這些規則按照它們的排列順序進行匹配檢測,一旦檢測到匹配的規則,匹配檢測就立即結束; ● 訪問列表可以由多條規則組成; ● 如果沒有任何規則與訪問請求匹配,默認動作將與列表中最後一條規則對應; ● 一個訪問條目中的所有元素將用邏輯與運算連接,如下所示: http_access Action 聲明1 AND 聲明2 AND 聲明 OR http_access Action 聲明3 ● 多個http_access聲明間用或運算連接,但每個訪問條目的元素間用與運算連接; ● 列表中的規則總是遵循由上而下的順序。
3. 使用訪問控制 上面詳細講述了ACL元素以及http_access訪問控制列表的語法以及使用過程中需要注意的問題,下面給出使用這些訪問控制方法的實例。 如果,允許網段10.0.0.124/24以及192.168.10.15/24內的所有客戶機訪問代理服務器,並且允許在文件/etc/squid/guest列出的客戶機訪問代理服務器,除此之外的客戶機將拒絕訪問本地代理服務器。那麼具體操作如下: acl clients src 10.0.0.124/24 192.168.10.15/24 acl guests src “/etc/squid/guest” acl all src 0.0.0.0/0.0.0.0 http_access allow clients http_access allow guests http_access deny all 其中,文件“/etc/squid/guest”中的內容為: 172.168.10.3/24 210.113.24.8/16 10.0.1.24/25 …… 如果,允許域名為job.net、gdfq.edu.cn的兩個域訪問本地代理服務器,其他的域都將拒絕訪問本地代理服務器。那麼具體操作如下: acl permitted_domain src job.net gdfq.edu.cn acl all src 0.0.0.0/0.0.0.0 http_access allow permitted_domain http_access deny all 如果,使用正則表達式,拒絕客戶機通過代理服務器訪問包含有諸如“sexy”等關鍵字的網站。那麼具體操作如下: acl deny_url url_regex - sexy http_access deny deny_url 如果,拒絕客戶機通過代理服務器訪問文件中指定IP或者域名的網站,其中文件/etc/squid/deny_ip中存放有拒絕訪問的IP地址,文件/etc/squid/deny_dns中存放有拒絕訪問的域名。那麼具體操作如下: acl deny_ip dst “etc/squid/deny_ip” acl deny_dns dst “etc/squid/deny_dns” http_access deny deny_ip http_access deny deny_dns 如果,允許和拒絕指定的用戶訪問指定的網站,其中,允許客戶1訪問網站http://www.sina.com.cn,而拒絕客戶2訪問網站http://www.163.com。那麼具體操作如下: acl client1 src