搭建Linux安全的Squid代理服务器
本文介紹Linux下非常著名、常用的Squid代理服務(wù)器的使用,并著重講述如何使用其提供的訪問控制策略,來保證代理服務(wù)器的合法使用。?
代理服務(wù)器的功能是代理網(wǎng)絡(luò)用戶取得網(wǎng)絡(luò)信息,它???
?
Squid是Linux下一個(gè)緩存Internet數(shù)據(jù)的代理服務(wù)器軟件,其接收用戶的下載申請,并自動(dòng)處理所下載的數(shù)據(jù)。也就是說,當(dāng)一個(gè)用戶想要下載一個(gè)主頁時(shí),可以向Squid發(fā)出一個(gè)申請,要Squid代替其進(jìn)行下載,然后Squid連接所申請網(wǎng)站并請求該主頁,接著把該主頁傳給用戶同時(shí)保留一個(gè)備份。當(dāng)別的用戶申請同樣的頁面時(shí),Squid把保存的備份立即傳給用戶,使用戶覺得速度相當(dāng)快。目前,Squid可以代理HTTP、FTP、GOPHER、SSL和WAIS協(xié)議,暫不能代理POP3、NNTP等協(xié)議。Squid可以工作在很多中,如AIX、Digital、Unix、FreeBSD、HP-UX、Irix、Linux、NetBSD、Nextstep、SCO、Solaris、OS/2等。?操作系統(tǒng)
安裝和配置Squid?Server?
通常說來,安裝Squid有兩種方法:一是從Red?Hat?Linux?9中獲取該軟件的RPM包進(jìn)行;二是安裝從Squid的官方站點(diǎn)http://www.squid-cache.org/?下載該軟件的源碼進(jìn)行編譯后安裝。目前網(wǎng)上最新的穩(wěn)定版本為squid-2.5.STABLE10,下面以此版本為例對兩種安裝方法進(jìn)行介紹。?
Squid服務(wù)器工作原理示意圖
1.?RPM包的安裝?
首先,查看是否已經(jīng)安裝了squid:?
#rpm?-qa?|?grep?squid?
Red?Hat?Linux9自帶了Squid安裝軟件包,將第一張安裝光盤放入光驅(qū)后掛裝光盤分區(qū):?
#mount?/mnt/cdrom?
然后,進(jìn)入/mnt/cdrom/Red?Hat/RPMS目錄:?
#cd?/mnt/cdrom/Red?Hat/RPMS?
最后,執(zhí)行安裝:?
#rpm?-ivh?squid-2.5.STABLE1-2.i386.rpm?
當(dāng)然,我們也可以在開始安裝系統(tǒng)的過程中安裝該軟件。?
2.?源代碼包的安裝?
從http://www.squid-cache.org/下載squid軟件的最新源代碼包squid-2.5.STABLE10.tar.gz,然后,按照如下步驟進(jìn)行安裝。?
首先,將該文件拷貝到/tmp目錄:?
#cp?squid-2.5.STABLE10.tar.gz?/tmp?
然后,解開該文件:?
#tar?xzvf?squid-2.5.STABLE10.tar.gz?
解開后,在/tmp生成一個(gè)新的目錄squid-2.5.STABLE10,為了方便使用mv命令,將該目錄重命名為squid:?
#mv?squid-2.5.STABLE10?squid?
切換進(jìn)入squid目錄:?
#cd?squid?
接著,執(zhí)行/configure,可以用./configure?--prefix=/directory/you/want指定安裝目錄,系統(tǒng)默認(rèn)安裝目錄為/tmp/squid:?
#./configure?
最后,分別執(zhí)行make?all、make?install:?
#make?all?
#make?install?
安裝結(jié)束后,Squid的可執(zhí)行文件在安裝目錄的bin子目錄下,配置文件在etc子目錄下。?
Squid軟件向用戶提供了許多與配置、應(yīng)用程序和庫、日志等相關(guān)的文檔進(jìn)行配置和管理,Squid有一個(gè)主要的配置文件squid.conf。同時(shí),在Red?Hat環(huán)境下所有Squid的配置文件都位于/etc/squid子目錄下。在該目錄當(dāng)中,系統(tǒng)同時(shí)提供了一個(gè)默認(rèn)的配置文件,其名稱為squid.conf.default,然而,在實(shí)際的應(yīng)用當(dāng)中,該默認(rèn)的配置文件存在某些問題,所以在使用Squid之前,必須首先對該配置文件的有關(guān)內(nèi)容進(jìn)行修改。?
下面介紹squid.conf文件的結(jié)構(gòu)以及一些常用的選項(xiàng)。squid.conf配置文件可以分為13個(gè)部分。雖然Squid的配置文件很龐大,該配置文件的規(guī)模達(dá)到了3000多行。然而,如果只是為一個(gè)中小型網(wǎng)絡(luò)提供代理服務(wù),并且只準(zhǔn)備使用一臺服務(wù)器,那么,配置問題將會(huì)變得相對簡單,只需要修改配置文件中的幾個(gè)選項(xiàng)即可滿足應(yīng)用需求。這些幾個(gè)常用選項(xiàng)分別是:?
1.?http_port?
該選項(xiàng)定義Squid監(jiān)聽HTTPD客戶連接請求的端口。默認(rèn)是3128,如果使用HTTPD加速模式,則為80。可以指定多個(gè)端口,但是所有指定的端口都必須在一條命令行上出現(xiàn),程序才能正確地識別。?
2.?cache_mem(bytes)?
該選項(xiàng)用于指定Squid可以使用的內(nèi)存的理想值。這部分內(nèi)存被用來存儲(chǔ)以下對象:In-Transit?objects(傳入的對象)、Hot?Objects(熱對象,即用戶常訪問的對象)、Negative-Cached?objects(消極存儲(chǔ)的對象)。?
3.?cache_dir?Directory-Name?Mbytes?Level1?Level2?
該選項(xiàng)指定Squid用來存儲(chǔ)對象的交換空間的大小及其目錄結(jié)構(gòu)。可以用多個(gè)cache_dir命令來定義多個(gè)交換空間,并且這些交換空間可以分布在不同的磁盤分區(qū)。“directory”指明了該交換空間的頂級目錄。如果想用整個(gè)磁盤作為交換空間,那么可以將該目錄作為裝載點(diǎn)將整個(gè)磁盤掛裝上去。默認(rèn)值為/var/spool/squid。Mbytes定義了可用的空間總量。?
配置訪問控制?
使用訪問控制特性,可以控制在訪問時(shí)根據(jù)特定的時(shí)間間隔進(jìn)行緩存、訪問特定站點(diǎn)或一組站點(diǎn)等。Squid訪問控制有兩個(gè)要素:ACL元素和訪問列表。通過使用這些方法,系統(tǒng)管理員可以嚴(yán)格、清晰地定義代理服務(wù)器的訪問控制策略。?
1.?ACL元素?
該元素定義的語法如下:?
acl?aclname?acltype?string1…?
acl?aclname?acltype?“file”…?
當(dāng)使用文件時(shí),該文件的格式為每行包含一個(gè)條目。其中,acltype可以是任一個(gè)在ACL中定義的名稱;任何兩個(gè)ACL元素不能用相同的名字;每個(gè)ACL由列表值組成,當(dāng)進(jìn)行匹配檢測的時(shí)候,多個(gè)值由邏輯或運(yùn)算連接,換句話說,任一ACL元素的值被匹配,則這個(gè)ACL元素即被匹配;?并不是所有的ACL元素都能使用訪問列表中的全部類型;不同的ACL元素寫在不同行中,Squid將這些元素組合在一個(gè)列表中。?
2.?http_access訪問控制列表?
根據(jù)訪問控制列表允許或禁止某一類用戶訪問。如果某個(gè)訪問沒有相符合的項(xiàng)目,則默認(rèn)為應(yīng)用最后一條項(xiàng)目的“非”。比如最后一條為允許,則默認(rèn)就是禁止。通常應(yīng)該把最后的條目設(shè)為“deny?all”或“allow?all”來避免安全性隱患。使用該訪問控制列表需要注意如下問題:?
●?這些規(guī)則按照它們的排列順序進(jìn)行匹配檢測,一旦檢測到匹配的規(guī)則,匹配檢測就立即結(jié)束;?
●?訪問列表可以由多條規(guī)則組成;?
●?如果沒有任何規(guī)則與訪問請求匹配,默認(rèn)動(dòng)作將與列表中最后一條規(guī)則對應(yīng);?
●?一個(gè)訪問條目中的所有元素將用邏輯與運(yùn)算連接,如下所示:?
http_access?Action?聲明1?AND?聲明2?AND?聲明?OR?
http_access?Action?聲明3?
●?多個(gè)http_access聲明間用或運(yùn)算連接,但每個(gè)訪問條目的元素間用與運(yùn)算連接;?
●?列表中的規(guī)則總是遵循由上而下的順序。?
3.?使用訪問控制?
上面詳細(xì)講述了ACL元素以及http_access訪問控制列表的語法以及使用過程中需要注意的問題,下面給出使用這些訪問控制方法的實(shí)例。?
如果,允許網(wǎng)段10.0.0.124/24以及192.168.10.15/24內(nèi)的所有客戶機(jī)訪問代理服務(wù)器,并且允許在文件/etc/squid/guest列出的客戶機(jī)訪問代理服務(wù)器,除此之外的客戶機(jī)將拒絕訪問本地代理服務(wù)器。那么具體操作如下:?
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”中的內(nèi)容為:?
172.168.10.3/24?
210.113.24.8/16?
10.0.1.24/25?
……?
如果,允許域名為job.net、gdfq.edu.cn的兩個(gè)域訪問本地代理服務(wù)器,其他的域都將拒絕訪問本地代理服務(wù)器。那么具體操作如下:?
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?
如果,使用正則表達(dá)式,拒絕客戶機(jī)通過代理服務(wù)器訪問包含有諸如“sexy”等關(guān)鍵字的網(wǎng)站。那么具體操作如下:?
acl?deny_url?url_regex?-?sexy?
http_access?deny?deny_url?
如果,拒絕客戶機(jī)通過代理服務(wù)器訪問文件中指定IP或者域名的網(wǎng)站,其中文件/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?
如果,允許和拒絕指定的用戶訪問指定的網(wǎng)站,其中,允許客戶1訪問網(wǎng)站http://www.sina.com.cn,而拒絕客戶2訪問網(wǎng)站http://www.163.com。那么具體操作如下:?
acl?client1?src?192.168.0.118?
acl?client1_url?url_regex?^http://www.sina.com.cn?
acl?client2?src?192.168.0.119?
acl?client2_url?url_regex?^http://www.163.com?
http_access?allow?client1?client1_url?
http_access?deny?client2?client2_url?
如果,允許所有的用戶在規(guī)定的時(shí)間內(nèi)(周一至周四的8:30到20:30)訪問代理服務(wù)器,只允許特定的用戶(系統(tǒng)管理員,其網(wǎng)段為:192.168.10.0/24)在周五下午訪問代理服務(wù)器,其他的在周五下午一律拒絕訪問代理服務(wù)器。那么具體操作如下:?
acl?allclient?src?0.0.0.0/0.0.0.0?
acl?administrator?192.168.10.0/24?
acl?common_time?time?MTWH?8:30-20:30?
acl?manage_time?time?F?13:00-18:00?
http_access?allow?allclient?common_time?
http_access?allow?administrator?manage_time?
http_access?deny?manage_time?
?
配置2.............
基本squid安裝配置?
squid?配置詳解+認(rèn)證?
http://www.chinaunix.net?作者:startdd?發(fā)表于:2003-07-15?20:38:52?
在此,我們要配置一個(gè)只對內(nèi)部網(wǎng)絡(luò)提供代理服務(wù)的Proxy?Server。它將用戶分為高級用戶和普通用戶兩種,對高級用戶采用網(wǎng)卡物理地址識別的方法,普通用戶則需要輸入用戶名和口令才能正常使用。高級用戶沒有訪問時(shí)間和文件類型的限制,而普通用戶只在上班時(shí)可以訪問以及一些其它的限制。?
安裝?
可以從Squid站點(diǎn)www.squid-cache.org獲取該軟件的源代...的發(fā)行版,如Red?Hat提供的RPM包。?
RPM方式安裝很簡單,命令如下:?
$?rpm?-ivh?Squid-2.x.STALBx.i386.rpm?
不過筆者認(rèn)為,即便是系統(tǒng)中已經(jīng)默認(rèn)安裝了Squid,也應(yīng)當(dāng)先刪掉然后安裝最新的源代碼包。因?yàn)殚_源軟件會(huì)不斷修正問題、提供更新的功能,使用最新版本可以保證最高的性能及安全,而且源代碼方式可以完全定制系統(tǒng)。不過STABLE穩(wěn)定版、DEVEL版通常是提供給開發(fā)人員測試程序的,假定下載了最新的穩(wěn)定版squid-2.5.STABLE2.tar.gz,用以下命令解開壓縮包:?
$?tar?xvfz?squid-2.5.STABLE.tar.gz?
用bz2方式壓縮的包可能體積更小,相應(yīng)的命令是:?
$?tar?xvfj?squid-2.5.STABLE.tar.bz2?
然后,進(jìn)入相應(yīng)目錄對源代碼進(jìn)行配置和編譯,命令如下:?
$?cd?squid-2.5.STABLE2?
配置命令configure有很多選項(xiàng),如果不清楚可先用“-help”查看。通常情況下,用到的選項(xiàng)有以下幾個(gè):?
--prefix=/web/squid?
#指定Squid的安裝位置,如果只指定這一選項(xiàng),那么該目錄下會(huì)有bin、sbin、man、conf等目錄,而主要的配置文件此時(shí)在conf子目錄中。為便于管理,最好用參數(shù)--sysconfdir=/etc把這個(gè)文件位置配置為/etc。?
--enable-storeio=ufs,null?
#使用的文件系統(tǒng)通常是默認(rèn)的ufs,不過如果想要做一個(gè)不緩存任何文件的代理服?
務(wù)器,就需要加上null文件系統(tǒng)。?
--enable-arp-acl?
#這樣可以在規(guī)則設(shè)置中直接通過客戶端的MAC地址進(jìn)行管理,防止客戶使用IP欺騙。?
--enable-err-languages="Simplify_Chinese"?
--enable-default-err-languages="Simplify_Chinese"?
#上面兩個(gè)選項(xiàng)告訴Squid編入并使用簡體中文錯(cuò)誤信息。?
--enable-linux-netfilter?
#允許使用Linux的透明代理功能。?
--enable-underscore?
#允許解析的URL中出現(xiàn)下劃線,因?yàn)槟J(rèn)情況下Squid會(huì)認(rèn)為帶下劃線的URL是?
非法的,并拒絕訪問該地址。?
整個(gè)配置編譯過程如下:?
./configure?--prefix=/var/squid?
--sysconfdir=/etc?
--enable-arp-acl?
--enable-linux-netfilter?
--enable-pthreads?
--enable-err-language="Simplify_Chinese"?
--enable-storeio=ufs,null?
--enable-default-err-language="Simplify_Chinese"?
--enable-auth="basic"?
--enable-baisc-auth-helpers="NCSA"?
--enable-underscore?
其中一些選項(xiàng)有特殊作用,將在下面介紹它們。?
最后執(zhí)行make和make?install兩條命令,將源代碼編譯為可執(zhí)行文件,并拷貝到指定位置。?
基本配置?
安裝完成后,接下來要對Squid的運(yùn)行進(jìn)行配置(不是前面安裝時(shí)的配置)。所有項(xiàng)目都在squid.conf中完成。Squid自帶的squid.conf包括非常詳盡的說明,相當(dāng)于一篇用戶手冊,對配置有任何疑問都可以參照解決。?
在這個(gè)例子中,代理服務(wù)器同時(shí)也是網(wǎng)關(guān),內(nèi)部網(wǎng)絡(luò)接口eth0的IP地址為192.168.0.1,外部網(wǎng)絡(luò)接口eth1的IP地址為202.103.x.x。下面是一個(gè)基本的代理所需要配置選項(xiàng):?
http_port?192.168.0.1:3128?
默認(rèn)端口是3128,當(dāng)然也可以是任何其它端口,只要不與其它服務(wù)發(fā)生沖突即可。為了安全起見,在前面加上IP地址,Squid就不會(huì)監(jiān)聽外部的網(wǎng)絡(luò)接口。?
下面的配置選項(xiàng)是服務(wù)器管理者的電子郵件,當(dāng)錯(cuò)誤發(fā)生時(shí),該地址會(huì)顯示在錯(cuò)誤頁面上,便于用戶聯(lián)系:?
cache_mgr?start@soocol.com?
以下這些參數(shù)告訴Squid緩存的文件系統(tǒng)、位置和緩存策略:?
cache_dir?ufs?/var/squid?
cache_mem?32MB?
cache_swap_low?90?
cache_swap_high?95?
在這里,Squid會(huì)將/var/squid目錄作為保存緩存數(shù)據(jù)的目錄,每次處理的緩存大小是32兆字節(jié),當(dāng)緩存空間使用達(dá)到95%時(shí),新的內(nèi)容將取代舊的而不直接添加到目錄中,直到空間又下降到90%才停止這一活動(dòng)。如果不想Squid緩存任何文件,如某些存儲(chǔ)空間有限的專有系統(tǒng),可以使用null文件系統(tǒng)(這樣不需要那些緩存策略):?
cache_dir?null?/tmp?
下面的幾個(gè)關(guān)于緩存的策略配置中,較主要的是第一行,即用戶的訪問記錄,可以通過分析它來了解所有用戶訪問的詳盡地址:?
cache_access_log?/var/squid/access.log?
cache_log?/var/squid/cache.log?
cache_store_log?/var/squid/store.log?
下面這行配置是在較新版本中出現(xiàn)的參數(shù),告訴Squid在錯(cuò)誤頁面中顯示的服務(wù)器名稱:?
visible_hostname?No1.proxy?
以下配置告訴Squid如何處理用戶,對每個(gè)請求的IP地址作為單獨(dú)地址處理:?
client_mask?255.255.255.255?
如果是普通代理服務(wù)器,以上的配置已經(jīng)足夠。但是很多Squid都被用來做透明代理。所謂透明代理,就是客戶端不知道有代理服務(wù)器的存在,當(dāng)然也不需要進(jìn)行任何與代理有關(guān)的設(shè)置,從而大大方便了系統(tǒng)管理員。相關(guān)的選項(xiàng)有以下幾個(gè):?
httpd_accel_host?virtual?
httpd_accel_port?80?
httpd_accel_with_proxy?on?
httpd_accel_user_host_header?on?
在Linux上,可以用iptables/ipchains直接將對Web端口80的請求直接轉(zhuǎn)發(fā)到Squid端口3128,由Squid接手,而用戶瀏覽器仍然認(rèn)為它訪問的是對方的80端口。例如以下這條命令:?
iptables?-t?nat?-A?PREROUTING?-s?192.168.0.200/32?-p?tcp?--dport?80?-j?REDIRECT?3128?
就是將192.168.0.200的所有針對80端口的訪問重定向到3128端口。?
所有設(shè)置完成后,關(guān)鍵且重要的任務(wù)是訪問控制。Squid支持的管理方式很多,使用起來也非常簡單(這也是有人寧愿使用不做任何緩存的Squid,也不愿意單獨(dú)使用iptables的原因)。Squid可以通過IP地址、主機(jī)名、MAC地址、用戶/密碼認(rèn)證等識別用戶,也可以通過域名、域后綴、文件類型、IP地址、端口、URL匹配等控制用戶的訪問,還可以使用時(shí)間區(qū)間對用戶進(jìn)行管理,所以訪問控制是Squid配置中的重點(diǎn)。Squid用ACL(Access?Control?List,訪問控制列表)對訪問類型進(jìn)行劃分,用http_access?deny?或allow進(jìn)行控制。根據(jù)需求首先定義兩組用戶advance和normal,還有代表所有未指明的用戶組all及不允許上網(wǎng)的baduser,配置代碼如下:?
acl?advance?192.168.0.2-192.168.0.10/32?
acl?normal?src?192.168.0.11-192.168.0.200/32?
acl?baduser?src?192.168.0.100/32?
acl?baddst?dst?www.soocol.com?
acl?all?src?0.0.0.0/0?
http_access?deny?baduser?
http_access?allow?advance?
http_access?allow?normal?
可以看出,ACL的基本格式如下:?
acl?列表名稱?控制方式?控制目標(biāo)?
比如acl?all?src?0.0.0.0/0,其名稱是all,控制方式是src源IP地址,控制目標(biāo)是0.0.0.0/0的IP地址,即所有未定義的用戶。出于安全考慮,總是在最后禁止這個(gè)列表。?
下面這個(gè)列表代表高級用戶,包括IP地址從192.168.0.2到192.168.0.10的所有計(jì)算機(jī):?
acl?advance?192.168.0.2-192.168.0.20/32?
下面這個(gè)baduser列表只包含一臺計(jì)算機(jī),其IP地址是192.168.0.100:?
acl?baduser?192.168.0.100/32?
ACL寫完后,接下來要對它們分別進(jìn)行管理,代碼如下:?
http_access?deny?baduser?
http_access?allow?advance?
http_access?allow?normal?
上面幾行代碼告訴Squid不允許baduser組訪問Internet,但advance、normal組允許(此時(shí)還沒有指定詳細(xì)的權(quán)限)。由于Squid是按照順序讀取規(guī)則,會(huì)首先禁止baduser,然后允許normal。如果將兩條規(guī)則順序顛倒,由于baduser在normal范圍中,Squid先允許了所有的normal,那么再禁止baduser就不會(huì)起作用。?
特別要注意的是,Squid將使用allow-deny-allow-deny……這樣的順序套用規(guī)則。例如,當(dāng)一個(gè)用戶訪問代理服務(wù)器時(shí),Squid會(huì)順序測試Squid中定義的所有規(guī)則列表,當(dāng)所有規(guī)則都不匹配時(shí),Squid會(huì)使用與最后一條相反的規(guī)則。就像上面這個(gè)例子,假設(shè)有一個(gè)用戶的IP地址是192.168.0.201,他試圖通過這臺代理服務(wù)器訪問Internet,會(huì)發(fā)生什么情況呢?我們會(huì)發(fā)現(xiàn),他能夠正常訪問,因?yàn)镾quid找遍所有訪問列表也沒有和192.168.0.201有關(guān)的定義,便開始應(yīng)用規(guī)則,而最后一條是deny,那么Squid默認(rèn)的下一條處理規(guī)則是allow,所以192.168.0.201反而能夠訪問Internet了,這顯然不是我們希望的。所以在所有squid.conf中,最后一條規(guī)則永遠(yuǎn)是http_access?deny?all,而all就是前面定義的“src?0.0.0.0”。?
高級控制?
前面說過,Squid的控制功能非常強(qiáng)大,只要理解Squid的行為方式,基本上就能夠滿足所有的控制要求。下面就一步一步來了解Squid是如何進(jìn)行控制管理的。?
通過IP地址來識別用戶很不可靠,比IP地址更好的是網(wǎng)卡的MAC物理地址。要在Squid中使用MAC地址識別,必須在編譯時(shí)加上“--enable-arp-acl”選項(xiàng),然后可以通過以下的語句來識別用戶:?
acl?advance?arp?00:01:02:1f:2c:3e?00:01:02:3c:1a:8b?...?
它直接使用用戶的MAC地址,而MAC地址一般是不易修改的,即使有普通用戶將自己的IP地址改為高級用戶也無法通過,所以這種方式比IP地址可靠得多。?
假如不想讓用戶訪問某個(gè)網(wǎng)站應(yīng)該怎么做呢?可以分為兩種情況:一種是不允許訪問某個(gè)站點(diǎn)的某個(gè)主機(jī),比如ok的主機(jī)是ok.sina.com.cn,而其它的新浪資源卻是允許訪問的,那么ACL可以這樣寫:?
acl?sinapage?dstdomain?ok.sina.com.cn?
...?...?
http_access?deny?ok?
...?...?
由此可以看到,除了ok,其它如www.sina.com.cn、news.sina.com.cn都可以正常訪問。?
另一種情況是整個(gè)網(wǎng)站都不許訪問,那么只需要寫出這個(gè)網(wǎng)站共有的域名即可,配置如下:?
acl?qq?dstdomain?.tcccent.com.cn?
注意tcccent前面的“.”,正是它指出以此域名結(jié)尾的所有主機(jī)都不可訪問,否則就只有tcccent.com.cn這一臺主機(jī)不能訪問。?
如果想禁止對某個(gè)IP地址的訪問,如202.118.2.182,可以用dst來控制,代碼如下:?
acl?badaddr?dst?202.118.2.182?
當(dāng)然,這個(gè)dst也可以是域名,由Squid查詢DNS服務(wù)器將其轉(zhuǎn)換為IP。?
還有一種比較廣泛的控制是文件類型。如果不希望普通用戶通過代理服務(wù)器下載MP3、AVI等文件,完全可以對他們進(jìn)行限制,代碼如下:?
acl?mmxfile?urlpath_regex?/.mp3$?/.avi$?/.exe$?
http_access?deny?mmxfile?
看到regex,很多讀者應(yīng)該心領(lǐng)神會(huì),因?yàn)檫@條語句使用了標(biāo)準(zhǔn)的規(guī)則表達(dá)式(又叫正則表達(dá)式)。它將匹配所有以.mp3、.avi等結(jié)尾的URL請求,還可以用-i參數(shù)忽略大小寫,例如以下代碼:?
acl?mmxfile?urlpath_regex?-i?/.mp3$?
這樣,無論是.mp3還是.MP3都會(huì)被拒絕。當(dāng)然,-i參數(shù)適用于任何可能需要區(qū)分大小寫的地方,如前面的域名控制。?
如果想讓普通用戶只在上班時(shí)間可以上網(wǎng),而且是每周的工作日,用Squid應(yīng)當(dāng)如何處理呢?看看下面的ACL定義:?
acl?worktime?time?MTWHF?8:30-12:00?14:00-18:00?
http_access?deny?!worktime?
首先定義允許上網(wǎng)的時(shí)間是每周工作日(星期一至星期五)的上午和下午的固定時(shí)段,然后用http_access?定義所有不在這個(gè)時(shí)間段內(nèi)的請求都是不允許的。?
或者為了保證高級用戶的帶寬,希望每個(gè)用戶的并發(fā)連接不能太多,以免影響他人,也可以通過Squid控制,代碼如下:?
acl?conncount?maxconn?3?
http_access?deny?conncount?normal?
http_access?allow?normal?
這樣,普通用戶在某個(gè)固定時(shí)刻只能同時(shí)發(fā)起三個(gè)連接,從第四個(gè)開始,連接將被拒絕。?
總之,Squid的ACL配置非常靈活、強(qiáng)大,更多的控制方式可以參考squid.conf.default。?
認(rèn)證?
用戶/密碼認(rèn)證為Squid管理提供了更多便利,最常用的認(rèn)證方式是NCSA。從Squid?2.5版本開始,NCSA認(rèn)證包含在了basic中,而非以前單獨(dú)的認(rèn)證模塊。下面來看看實(shí)現(xiàn)認(rèn)證的具體操作。?
首先在編譯時(shí)配置選項(xiàng)應(yīng)包括以下配置:?
--enable-auth="basic"?--enable-basic-auth-helpers="NCSA"?
“make?install”以后,需要將“helpers/basic_auth/NCSA/ncsa_auth”拷貝到用戶可執(zhí)行目錄中,如/usr/bin(如果在該目錄中找不到這個(gè)執(zhí)行文件,在編譯時(shí)請使用make?all而不是make,或者直接在該目錄中執(zhí)行make),然后需要借助Apache的密碼管理程序htpasswd來生成用戶名/密碼對應(yīng)的文件,就像下面這行代碼:?
htpasswd?-c?/var/squid/etc/password?guest?
在輸入兩遍guest用戶的密碼后,一個(gè)guest用戶就生成了。如果以后需要添加用戶,把上面的命令去掉-c參數(shù)再運(yùn)行即可。?
Squid?2.5在認(rèn)證處理上有了較大的改變,這里就只討論2.5版本的處理方法,2.4及以下版本請參考squid.conf.default。在2.5版的squid.conf中,包括以下幾個(gè)相關(guān)選項(xiàng):?
#該選項(xiàng)指出了認(rèn)證方式(basic)、需要的程序(ncsa_auth)和?
對應(yīng)的密碼文件(password)?
auth_param?basic?program?/usr/bin/ncsa_auth?/var/squid/etc/password?
#?指定認(rèn)證程序的進(jìn)程數(shù)?
auth_param?basic?children?5?
#?瀏覽器顯示輸入用戶/密碼對話框時(shí)的領(lǐng)域內(nèi)容?
auth_param?basic?realm?My?Proxy?Caching?Domain?
#?基本的認(rèn)證有效時(shí)間?
auth_param?basic?credentialsttl?2?hours?
#?普通用戶需要通過認(rèn)證才能訪問Internet?
acl?normal?proxy_auth?REQUIRED?
http_access?allow?normal?
通過以上的配置即可完成認(rèn)證工作。有的讀者可能要問:認(rèn)證只針對普通用戶,而高級用戶是直接上網(wǎng)的,該怎么處理呢?其實(shí),這兩種用戶是可以共存的。如前所述,Squid是順序處理http_access的,所以在http_access處理過程中,如果先處理normal用戶,那么當(dāng)前用戶無論是否屬于高級用戶,都會(huì)被要求進(jìn)行認(rèn)證;相反如果先處理高級用戶,剩下的就只有需要認(rèn)證的普通用戶了。例如以下配置代碼:?
...?
http_access?allow?normal?(需要認(rèn)證)?
http_access?allow?advance?(不需要認(rèn)證)?
...?
不管是否為noauth用戶,都要求進(jìn)行用戶名/密碼驗(yàn)證。正確的方法是將二者位置交換,代碼如下:?
...?
http_access?allow?advance?
http_access?allow?normal?
...?
這時(shí),高級用戶不會(huì)受到任何影響。?
總結(jié)?
下面把整個(gè)squid.conf總結(jié)一下:?
#?服務(wù)器配置?
http_port?192.168.0.1:3128?
cache_mgr?start@soocol.com?
cache_dir?null?/tmp?
cache_access_log?/var/squid/access.log?
cache_log?/var/squid/cache.log?
cache_store_log?/var/squid/store.log?
visible_hostname?No1.proxy?
client_mask?255.255.255.255?
httpd_accel_host?virtual?
httpd_accel_port?80?
httpd_accel_with_proxy?on?
httpd_accel_user_host_header?on?
#?用戶分類?
acl?advance?arp?00:01:02:1f:2c:3e?00:01:02:3c:1a:8b?...?
acl?normal?proxy_auth?REQUIED?
acl?all?src?0.0.0.0?
#?行為分類?
acl?mmxfile?urlpath_regex?/.mp3$?/.avi$?/.exe$?
acl?conncount?maxconn?3?
acl?worktime?time?MTWHF?8:30-12:00?14:00-18:00?
acl?sinapage?dstdomain?ok.sina.com.cn?
acl?qq?dstdomain?.tcccent.com.cn?
#?處理?
http_access?allow?advance?
http_access?deny?conncount?normal?
http_access?deny?!worktime?
http_access?deny?mmxfile?
http_access?deny?sinapage?
http_access?deny?qq?
http_access?allow?normal?
配置后的狀況是,advance組可以不受任何限制地訪問Internet,而normal組則只能在工作時(shí)間上網(wǎng),而且不能下載多媒體文件,不能訪問某些特定的站點(diǎn),而且發(fā)送請求不能超過3個(gè)。?
通過本文的介紹,它可以了解Squid的基本能力。當(dāng)然,它的能力遠(yuǎn)不止此,可以建立強(qiáng)大的代理服務(wù)器陣列,可以幫助本地的Web服務(wù)器提高性能,可以提高本地網(wǎng)絡(luò)的安全性等。要想發(fā)揮它的功效,還需要進(jìn)一步控制。
轉(zhuǎn)載于:https://blog.51cto.com/fantefei/909084
總結(jié)
以上是生活随笔為你收集整理的搭建Linux安全的Squid代理服务器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微博营销资料合集
- 下一篇: linux下挂载ntfs(windows