一、代理服務(wù)器概述
1.1什么是代理服務(wù)器
在TCP/IP網(wǎng)絡(luò)中,傳統(tǒng)的通信過(guò)程是這樣的:客戶端向服務(wù)器請(qǐng)求數(shù)據(jù),服務(wù)器響應(yīng)該請(qǐng)求,將數(shù)據(jù)傳送給客戶端。在引入了代理服務(wù)器以后,這一過(guò)程變成了這樣:客戶端向服務(wù)器發(fā)起請(qǐng)求,該請(qǐng)求被送到代理服務(wù)器;代理服務(wù)器分析該請(qǐng)求,先查看自己緩存中是否有請(qǐng)求數(shù)據(jù),如果有就直接傳送給客戶端,如果沒(méi)有就代替客戶端向該服務(wù)器發(fā)出請(qǐng)求。服務(wù)器響應(yīng)以后,代理服務(wù)器將響應(yīng)的數(shù)據(jù)傳送給客戶端,同時(shí)在自己的緩存中保留一份該數(shù)據(jù)的拷貝。這樣,再有客戶端請(qǐng)求相同的數(shù)據(jù)時(shí),代理服務(wù)器就可以直接將數(shù)據(jù)傳送給客戶端,而不需要再向該服務(wù)器發(fā)起請(qǐng)求。
1.2 代理服務(wù)器的功能
一般說(shuō)來(lái),代理服務(wù)器具有以下的功能:
1.通過(guò)緩存增加訪問(wèn)速度
隨著Internet的迅猛發(fā)展,網(wǎng)絡(luò)帶寬變得越來(lái)越珍貴。所以為了提高訪問(wèn)速度,好多ISP都提供代理服務(wù)器,通過(guò)代理服務(wù)器的緩存功能來(lái)加快網(wǎng)絡(luò)的訪問(wèn)速度。一般說(shuō)來(lái),大多數(shù)的代理服務(wù)器都支持HTTP緩存,但是,有的代理服務(wù)器也支持FTP緩存。在選擇代理服務(wù)器時(shí),對(duì)于大多數(shù)的組織,只需要HTTP緩存功能就足夠了。
通常,緩存有主動(dòng)緩存被動(dòng)緩存之分。所謂被動(dòng)緩存,指的是代理服務(wù)器只在客戶端請(qǐng)求數(shù)據(jù)時(shí)才將服務(wù)器返回的數(shù)據(jù)進(jìn)行緩存,如果數(shù)據(jù)過(guò)期了,又有客戶端請(qǐng)求相同數(shù)據(jù)時(shí),代理服務(wù)器又必須重新發(fā)起新的數(shù)據(jù)請(qǐng)求,在將響應(yīng)數(shù)據(jù)傳送給客戶端時(shí)又進(jìn)行新的緩存。所謂主動(dòng)緩存,就是代理服務(wù)器不斷地檢查緩存中的數(shù)據(jù),一旦有數(shù)據(jù)過(guò)期,則代理服務(wù)器主動(dòng)發(fā)起新的數(shù)據(jù)請(qǐng)求來(lái)更新數(shù)據(jù)。這樣,當(dāng)有客戶端請(qǐng)求該數(shù)據(jù)時(shí)就會(huì)大大縮短響應(yīng)時(shí)間。還需要說(shuō)明的是,對(duì)于數(shù)據(jù)中的認(rèn)證信息,大多數(shù)的代理服務(wù)器都不會(huì)進(jìn)行緩存的。
2.提供用私有IP訪問(wèn)Internet的方法
IP地址是不可再生的寶貴資源,假如你只有有限的IP地址,但是需要提供整個(gè)組織的Internet訪問(wèn)能力,那么,你可以通過(guò)使用代理服務(wù)器來(lái)實(shí)現(xiàn)這一點(diǎn)。
3.提高網(wǎng)絡(luò)的安全性
這一點(diǎn)是很明顯的,如果內(nèi)部用戶訪問(wèn)Internet都是通過(guò)代理服務(wù)器,那么,代理服務(wù)器就成為進(jìn)入Internet的唯一通道;反過(guò)來(lái)說(shuō),代理服務(wù)器也是Internet訪問(wèn)內(nèi)部網(wǎng)的唯一通道,如果你沒(méi)有做反向代理,則對(duì)于Internet上的主機(jī)來(lái)說(shuō),你的整個(gè)內(nèi)部網(wǎng)只有代理服務(wù)器是可見(jiàn)的,從而大大增強(qiáng)了網(wǎng)絡(luò)的安全性。
1.3 代理服務(wù)器的分類(lèi)及特點(diǎn)
通常的代理服務(wù)器分類(lèi)方法,是從實(shí)現(xiàn)的機(jī)理分為線路層代理、應(yīng)用層代理、智能線路層代理等等。在這里,我想從另外一個(gè)角度出發(fā),把代理服務(wù)器分為傳統(tǒng)代理服務(wù)器和透明代理服務(wù)器。
我認(rèn)為有必要好好搞清楚兩者的區(qū)別,只有真正明白了內(nèi)在地機(jī)理,才能在遇到問(wèn)題時(shí),有章可循,才不會(huì)一頭霧水,不知從何解決問(wèn)題。因此,下面我們就通過(guò)具體的實(shí)例來(lái)說(shuō)明。本章的寫(xiě)作思路來(lái)源于Paul Russell所寫(xiě)的IPCHAINS-HOWTO。下面所舉的例子也來(lái)源于該文章,我覺(jué)得我讀該文的最大收獲在于對(duì)內(nèi)部網(wǎng)訪問(wèn)外部網(wǎng)以及外部網(wǎng)訪問(wèn)內(nèi)部網(wǎng)的實(shí)現(xiàn)手段有了一個(gè)清晰的認(rèn)識(shí)。當(dāng)然,這里所謂的內(nèi)部網(wǎng)是指使用私有IP的內(nèi)部網(wǎng)絡(luò)。
我們的例子都基于以下假設(shè):
你的域名為sample.com,你的內(nèi)部網(wǎng)(192.168.1.*)用戶通過(guò)proxy.sample.com(外部接口 eth0:1.2.3.4;內(nèi)部接口 eth1:192.168.1.1)的代理服務(wù)器訪問(wèn)Internet,換句話說(shuō),該代理服務(wù)器是唯一一臺(tái)直接與Internet和內(nèi)部網(wǎng)相連的機(jī)器。并假該設(shè)代理服務(wù)器上運(yùn)行著某種代理服務(wù)器軟件(如squid)。假設(shè)內(nèi)部網(wǎng)中某一客戶機(jī)為client.sample.com(192.168.1.100)。
+-------------------+
|內(nèi)部網(wǎng)(192.168.1.*)| eth1+--------+eth0 DDN
| +------------| proxy |<===============>Internet
|client198.168.1.100| +--------+
+-------------------+
eth0: 1.2.3.4
eth1: 198.168.1.1
1.3.1傳統(tǒng)代理
在以上基礎(chǔ)上我們做以下工作:
1.代理服務(wù)軟件被綁定到代理服務(wù)器的8080端口。
2.客戶端瀏覽器被配置使用代理服務(wù)器的8080端口。
3.客戶端不需要配置DNS。
4.代理服務(wù)器上需要配置代理服務(wù)器。
5.客戶端不需要配置缺省路由。
當(dāng)我們?cè)诳蛻舳藶g覽器中打開(kāi)一個(gè)web請(qǐng)求,比如“http://www.linuxaid.com.cn”,這時(shí)將陸續(xù)發(fā)生以下事件:
1.客戶端使用某一端口(比如1025)連接代理服務(wù)器8080端口,請(qǐng)求web頁(yè)面“http://www.linuxaid.com.cn”
2.代理服務(wù)器向DNS請(qǐng)求“www.linuxaid.com.cn”,得到相應(yīng)的IP地址202.99.11.120。然后,代理服務(wù)器使用某一端口(比如1037)向該IP地址的80端口發(fā)起web連接請(qǐng)求,請(qǐng)求web頁(yè)面。
3.收到響應(yīng)的web頁(yè)面后,代理服務(wù)器把該數(shù)據(jù)傳送給客戶端。
4.客戶端瀏覽器顯示該頁(yè)面。
從www.linuxaid.com.cn的角度看來(lái),連接是在1.2.3.4地1037端口和202.99.11.120的80端口之間建立的。從client的角度看來(lái),連接是在192.168.1.100的1025端口和1.2.3.4的8080端口之間建立的。
1.3.2 透明代理
透明代理的意思是客戶端根本不需要知道有代理服務(wù)器的存在。
在以上基礎(chǔ)上我們做以下工作:
1.配置透明代理服務(wù)器軟件運(yùn)行在代理服務(wù)器的8080端口。
2.配置代理服務(wù)器將所有對(duì)80端口的連接重定向到8080端口。
3.配置客戶端瀏覽器直接連解到Internet。
4.在客戶端配置好DNS.
5.配置客戶端的缺省網(wǎng)關(guān)為192.168.1.1.
當(dāng)我們?cè)诳蛻舳藶g覽器中打開(kāi)一個(gè)web請(qǐng)求,比如“http://www.linuxaid.com.cn”,這時(shí)將陸續(xù)發(fā)生以下事件:
1.客戶端向DNS請(qǐng)求“www.linuxaid.com.cn”,得到相應(yīng)的IP地址202.99.11.120。然后,客戶端使用某一端口(比如1066)向該IP地址的80端口發(fā)起web連接請(qǐng)求,請(qǐng)求web頁(yè)面。
2.當(dāng)該請(qǐng)求包通過(guò)透明代理服務(wù)器時(shí),被重定向到代理服務(wù)器的綁定端口8080。于是,透明代理服務(wù)器用某一端口(比如1088)向202.99.11.120的80端口發(fā)起web連接請(qǐng)求,請(qǐng)求web頁(yè)面。
3.收到響應(yīng)的web頁(yè)面后,代理服務(wù)器把該數(shù)據(jù)傳送給客戶端。
4.客戶端瀏覽器顯示該頁(yè)面。
從www.linuxaid.com.cn的角度看來(lái),連接是在1.2.3.4地1088端口和202.99.11.120的80端口之間建立的。從client的角度看來(lái),連接是在192.168.1.100的1066端口和202.99.11.120的80端口之間建立的。
以上就是傳統(tǒng)代理服務(wù)器和透明代理服務(wù)器的區(qū)別所在。
二、各種代理服務(wù)器的比較
linux下的代理服務(wù)器軟件很多,我從www.freshmeat.com(一個(gè)著名的linux軟件站點(diǎn))查看了一下,足有六十多個(gè)。但是被廣泛應(yīng)用的只有Apache、socks、squid等幾個(gè)實(shí)踐證明是高性能的代理軟件。下面我們分別來(lái)比較一下這幾個(gè)軟件:
2.1 Apache
Apache是世界上用的最廣泛的HTTP服務(wù)器,之所以用的最廣泛,是因?yàn)樗鼜?qiáng)大的功能、高效率、安全性和速度。從1.1.x版本開(kāi)始,Apache開(kāi)始包含了一個(gè)代理模塊。用Apache作代理服務(wù)器的性能優(yōu)勢(shì)并不明顯,不建議使用。
2.2 Socks
Socks是一種網(wǎng)絡(luò)代理協(xié)議,該協(xié)議可以讓客戶機(jī)通過(guò)Socks服務(wù)器獲得對(duì)Internet的完全訪問(wèn)能力。Scoks在服務(wù)器和客戶端之間建立一個(gè)安全的代理數(shù)據(jù)通道,從客戶的角度看來(lái),Scoks是透明的;從服務(wù)器的角度看來(lái),Socks就是客戶端。客戶端不需要具有對(duì)Internet的直接訪問(wèn)能力(也就是說(shuō),可以使用私有IP地址),因?yàn)镾ocks服務(wù)器能夠把來(lái)自于客戶端的連接請(qǐng)求重定向到Internet。此外,Socks服務(wù)器可以對(duì)用戶連接請(qǐng)求進(jìn)行認(rèn)證,允許合法用戶建立代理連接。同理,Socks也能防止非授權(quán)的Internet用戶訪問(wèn)及的內(nèi)部網(wǎng)絡(luò)。所以常常把Socks當(dāng)作防火墻來(lái)使用。
常見(jiàn)的瀏覽器如netscape、IE等可以直接使用Socks, 并且我們也可以使用socsk5的所帶的client來(lái)使那些不直接支持socks的internet軟件使用Socks。
更多的資料可以參考Socks官方站點(diǎn)http://www.socks.nec.com。
2.3 Squid
對(duì)于web用戶來(lái)說(shuō),Squid是一個(gè)高性能的代理緩存服務(wù)器,Squid支持FTP、gopher和HTTP協(xié)議。和一般的代理緩存軟件不同,Squid用一個(gè)單獨(dú)的、非模塊化的、I/O驅(qū)動(dòng)的進(jìn)程來(lái)處理所有的客戶端請(qǐng)求。
Squid將數(shù)據(jù)元緩存在內(nèi)存中,同時(shí)也緩存DNS查詢的結(jié)果,除此之外,它還支持非模塊化的DNS查詢,對(duì)失敗的請(qǐng)求進(jìn)行消極緩存。Squid支持SSL,支持訪問(wèn)控制。由于使用了ICP(輕量Internet緩存協(xié)議),Squid能夠?qū)崿F(xiàn)層疊的代理陣列,從而最大限度地節(jié)約帶寬。
Squid由一個(gè)主要的服務(wù)程序squid,一個(gè)DNS查詢程序dnsserver,幾個(gè)重寫(xiě)請(qǐng)求和執(zhí)行認(rèn)證的程序,以及幾個(gè)管理工具組成。當(dāng)Squid啟動(dòng)以后,它可以派生出預(yù)先指定數(shù)目的dnsserver進(jìn)程,而每一個(gè)dnsserver進(jìn)程都可以執(zhí)行單獨(dú)的DNS查詢,這樣一來(lái)就大大減少了服務(wù)器等待DNS查詢的時(shí)間。
2.4 選擇
從上面的比較可以看出,Apache主要功能是web服務(wù)器,代理功能只不過(guò)是其一個(gè)模塊而已,Socks雖然強(qiáng)大,但有欠靈活,因此我們著重推薦你使用Squid。下面的章節(jié)我們就一起來(lái)學(xué)習(xí)Squid激動(dòng)人心的特性及相關(guān)的安裝與配置。
三、安裝Squid Proxy Server
3.1獲取軟件
你可以通過(guò)以下途徑獲取該軟件:
1.從Squid的官方站點(diǎn)http://www.squid-cache.org下載該軟件;
2.從你的linux發(fā)行版本中獲取該軟件;
通常,Squid軟件包有兩種:一種是源代碼,下載后需要自己重新編譯;可執(zhí)行文件,下載后只需解壓就可以使用;另一種是就是RedHat所使用的rpm包。下面我們分別講講這兩種軟件包的安裝方法。
3.2安裝軟件
我們以目前最新的穩(wěn)定版本squid-2.3.STABLEX為例。
3.2.1rpm包的安裝
1.進(jìn)入/mnt/cdrom/RedHat/RPMS
2.執(zhí)行rpm -ivh squid-2.2.STABLE4-8.i386.rpm。
當(dāng)然,我們也可以在開(kāi)始安裝系統(tǒng)的過(guò)程中安裝該軟件。
3.2.2 源代碼包的安裝
1.從http://www.squid-cache.org下載squid-2.3.STABLE2-src.tar.gz。
2.將該文件拷貝到/usr/local目錄。
3.解開(kāi)該文件 tar xvzf squid-2.3.STABLE2-src.tar.gz。
4.解開(kāi)后,在/usr/local生成一個(gè)新的目錄squid-2.3.STABLE2,為了方便用mv命令將 該目錄重命名為squid mv squid-2.3.STABLE2 squid;
5.進(jìn)入squid cd squid
6.執(zhí)行./configure 可以用./confgure --prefix=/directory/you/want指定安裝目錄
系統(tǒng)缺省安裝目錄為/usr/local/squid。
7.執(zhí)行 make all
8.執(zhí)行 make install
9.安裝結(jié)束后,squid的可執(zhí)行文件在安裝目錄的bin子目錄下,配置文件在etc子目錄下。
四、配置squid基礎(chǔ)篇——讓代理服務(wù)器跑起來(lái)
由于RedHat各方面的優(yōu)勢(shì)(包括易用性,穩(wěn)定性等等),全世界范圍內(nèi)使用該發(fā)行版的用戶比較多,所以,我們下面的說(shuō)明都是以RedHat6.1環(huán)境下squid-2.2.STABLE4-8版本為主。從我的使用經(jīng)驗(yàn)看來(lái),該版本的squid要比其他版本穩(wěn)定的多,以前的1.1.22版本也比較穩(wěn)定,但是在功能及靈活性方面有所欠缺。
squid有一個(gè)主要的配置文件squid.conf,在RedHat環(huán)境下所有squid的配置文件位于/etc/squid子目錄下。
4.1常用的配置選項(xiàng)
因?yàn)槿笔〉呐渲梦募袉?wèn)題,所以我們必須首先修改該配置文件的有關(guān)內(nèi)容,以便讓squid跑起來(lái)。
下面我們來(lái)看一看squid.conf文件的結(jié)構(gòu)以及一些常用的選項(xiàng):
squid.conf配置文件的可以分為十三個(gè)部分,這十三個(gè)部分分別是:
1.NETWORK OPTIONS (有關(guān)的網(wǎng)絡(luò)選項(xiàng))
2.OPTIONS WHICH AFFECT THE NEIGHBOR SELECTION ALGORITHM (作用于鄰居選擇算 法的有關(guān)選項(xiàng))
3.OPTIONS WHICH AFFECT THE CACHE SIZE (定義cache大小的有關(guān)選項(xiàng))
4.LOGFILE PATHNAMES AND CACHE DIRECTORIES (定義日志文件的路徑及cache的目錄)
5.OPTIONS FOR EXTERNAL SUPPORT PROGRAMS (外部支持程序選項(xiàng))
6.OPTIONS FOR TUNING THE CACHE (調(diào)整cache的選項(xiàng))
7.TIMEOUTS (超時(shí))
8.ACCESS CONTROLS (訪問(wèn)控制)
9.ADMINISTRATIVE PARAMETERS (管理參數(shù))
10.OPTIONS FOR THE CACHE REGISTRATION SERVICE (cache注冊(cè)服務(wù)選項(xiàng))
11.HTTPD-ACCELERATOR OPTIONS (HTTPD加速選項(xiàng))
12.MISCELLANEOUS (雜項(xiàng))
13.DELAY POOL PARAMETERS (延時(shí)池參數(shù))
雖然squid的配置文件很龐大,但是如果你只是為一個(gè)中小型網(wǎng)絡(luò)提供代理服務(wù),并且只準(zhǔn)備使用一臺(tái)服務(wù)器,那么,你只需要修改配置文件中的幾個(gè)選項(xiàng)。這些幾個(gè)常用選項(xiàng)分別是:
1.http_port
說(shuō)明:定義squid監(jiān)聽(tīng)HTTP客戶連接請(qǐng)求的端口。缺省是3128,如果使用HTTPD加速模式 則為80。你可以指定多個(gè)端口,但是所有指定的端口都必須在一條命令行上。
2.cache_mem (bytes)
說(shuō)明:該選項(xiàng)用于指定squid可以使用的內(nèi)存的理想值。這部分內(nèi)存被用來(lái)存儲(chǔ)以下對(duì)象 :
In-Transit objects (傳入的對(duì)象)
Hot Objects (熱對(duì)象,即用戶常訪問(wèn)的對(duì)象)
Negative-Cached objects (消極存儲(chǔ)的對(duì)象)
需要注意的是,這并沒(méi)有指明squid所使用的內(nèi)存一定不能超過(guò)該值,其實(shí),該選項(xiàng)只 定義了squid所使用的內(nèi)存的一個(gè)方面,squid還在其他方面使用內(nèi)存。所以squid實(shí)際 使用的內(nèi)存可能超過(guò)該值。缺省值為8MB。
3.cache_dir Directory-Name Mbytes Level-1 Level2
說(shuō)明:指定squid用來(lái)存儲(chǔ)對(duì)象的交換空間的大小及其目錄結(jié)構(gòu)。可以用多個(gè)cache_dir命令來(lái)定義多個(gè)這樣的交換空間,并且這些交換空間可以分布不同的磁盤(pán)分區(qū)。"directory "指明了該交換空間的頂級(jí)目錄。如果你想用整個(gè)磁盤(pán)來(lái)作為交換空間,那么你可以將該目錄作為裝載點(diǎn)將整個(gè)磁盤(pán)mount上去。缺省值為/var/spool/squid。“Mbytes”定義了可用的空間總量。需要注意的是,squid進(jìn)程必須擁有對(duì)該目錄的讀寫(xiě)權(quán)力。“Level-1”是可以在該頂級(jí)目錄下建立的第一級(jí)子目錄的數(shù)目,缺省值為16。同理,“Level-2”是可以建立的第二級(jí)子目錄的數(shù)目,缺省值為256。為什么要定義這么多子目錄呢?這是因?yàn)槿绻幽夸浱伲瑒t存儲(chǔ)在一個(gè)子目錄下的文件數(shù)目將大大增加,這也會(huì)導(dǎo)致系統(tǒng)尋找某一個(gè)文件的時(shí)間大大增加,從而使系統(tǒng)的整體性能急劇降低。所以,為了減少每個(gè)目錄下的文件數(shù)量,我們必須增加所使用的目錄的數(shù)量。如果僅僅使用一級(jí)子目錄則頂級(jí)目錄下的子目錄數(shù)目太大了,所以我們使用兩級(jí)子目錄結(jié)構(gòu)。
那么,怎么來(lái)確定你的系統(tǒng)所需要的子目錄數(shù)目呢?我們可以用下面的公式來(lái)估算。
已知量:
DS = 可用交換空間總量(單位KB)/ 交換空間數(shù)目
OS = 平均每個(gè)對(duì)象的大小= 20k
NO = 平均每個(gè)二級(jí)子目錄所存儲(chǔ)的對(duì)象數(shù)目 = 256
未知量:
L1 = 一級(jí)子目錄的數(shù)量
L2 = 二級(jí)子目錄的數(shù)量
計(jì)算公式:
L1 x L2 = DS / OS / NO
注意這是個(gè)不定方程,可以有多個(gè)解。
4.acl
說(shuō)明:定義訪問(wèn)控制列表。
定義語(yǔ)法為:
acl aclname acltype string1 ...
acl aclname acltype "file" ...
當(dāng)使用文件時(shí),該文件的格式為每行包含一個(gè)條目。
acltype 可以是 src dst srcdomain dstdomain url_pattern urlpath_pattern time port proto method browser user 中的一種。
分別說(shuō)明如下:
src 指明源地址。可以用以下的方法指定:
acl aclname src ip-address/netmask ... (客戶ip地址)
acl aclname src addr1-addr2/netmask ... (地址范圍)
dst 指明目標(biāo)地址。語(yǔ)法為:
acl aclname dst ip-address/netmask ... (即客戶請(qǐng)求的服務(wù)器的ip地址)
srcdomain 指明客戶所屬的域。語(yǔ)法為:
acl aclname srcdomain foo.com ... squid將根據(jù)客戶ip反向查詢DNS。
dstdomain 指明請(qǐng)求服務(wù)器所屬的域。語(yǔ)法為:
acl aclname dstdomain foo.com ... 由客戶請(qǐng)求的URL決定。
注意,如果用戶使用服務(wù)器ip而非完整的域名時(shí),squid將進(jìn)行反向的DNS解析來(lái)確 定其完整域名,如果失敗就記錄為“none”。
time 指明訪問(wèn)時(shí)間。語(yǔ)法如下:
acl aclname time [day-abbrevs] [h1:m1-h2:m2][hh:mm-hh:mm]
day-abbrevs:
S - Sunday
M - Monday
T - Tuesday
W - Wednesday
H - Thursday
F - Friday
A - Saturday
h1:m1 必須小于 h2:m2,表達(dá)示為[hh:mm-hh:mm]。
port 指定訪問(wèn)端口。可以指定多個(gè)端口,比如:
acl aclname port 80 70 21 ...
acl aclname port 0-1024 ... (指定一個(gè)端口范圍)
proto 指定使用協(xié)議。可以指定多個(gè)協(xié)議:
acl aclname proto HTTP FTP ...
method 指定請(qǐng)求方法。比如:
acl aclname method GET POST ...
5.http_access
說(shuō)明:根據(jù)訪問(wèn)控制列表允許或禁止某一類(lèi)用戶訪問(wèn)。
如果某個(gè)訪問(wèn)沒(méi)有相符合的項(xiàng)目,則缺省為應(yīng)用最后一條項(xiàng)目的“非”。比如最后一條為允許,則缺省就是禁止。所以,通常應(yīng)該把最后的條目設(shè)為"deny all" 或 "allow all" 來(lái)避免安全性隱患。
4.2 應(yīng)用實(shí)例
假想情景:某公司用squid作代理服務(wù)器,該代理服務(wù)器配置為PII450/256M/8.4G,公司所用ip段為1.2.3.0/24,并且想用8080作為代理端口。
則相應(yīng)的squid配置選項(xiàng)為:
1.http_port
http_port 8080
2.cache_mem
思路:由于該服務(wù)器只提供代理服務(wù),所以該值可以盡量設(shè)得大一些。
cache_mem 194M
3.cache_dir Directory-Name Mbytes Level-1 Level2
思路:硬盤(pán)為8.4G的,在安裝系統(tǒng)時(shí)應(yīng)該做好規(guī)劃,為不同的文件系統(tǒng)劃分可用空間。在本例中,我們可以這樣來(lái)劃分:
/cache1 3.5G
/cache2 3.5G
/var 400M
swap 127M
/ 剩余部分
并且,在安裝時(shí),我們盡量不安裝不必要的包。這樣在節(jié)約空間的同時(shí)可以提高系統(tǒng)的安全性和穩(wěn)定性。下面我們來(lái)計(jì)算所需的第一級(jí)和第二級(jí)子目錄數(shù)。
已知量:
DS = 可用交換空間總量(單位KB)/ 交換空間數(shù)目=7G/2=3500000KB
OS = 平均每個(gè)對(duì)象的大小= 20k
NO = 平均每個(gè)二級(jí)子目錄所存儲(chǔ)的對(duì)象數(shù)目 = 256
未知量:
L1 = 一級(jí)子目錄的數(shù)量
L2 = 二級(jí)子目錄的數(shù)量
計(jì)算公式:
L1 x L2 = DS / OS / NO=3500000/20/256=684
我們?nèi)?nbsp;
L1=16
L2=43
所以,我們的cache_dir語(yǔ)句為:
cache_dir /cache1 3500M 16 43
cache_dir /cache2 3500M 16 43
4.acl
思路:通過(guò)src來(lái)定義acl.
acl allow_ip src 1.2.3.4/255.255.255.0
5.http_access
http_access allow allow_ip
4.3啟動(dòng)、停止squid。
配置并保存好squid.conf后,可以用以下命令啟動(dòng)squid。
squid
或者,使用RedHat的啟動(dòng)腳本來(lái)啟動(dòng)squid.
/etc/rc.d/init.d/squid start
同樣地,你也可以用下列腳本停止運(yùn)行squid或重啟動(dòng)squid.
/etc/rc.d/init.d/squid stop
/etc/rc.d/init.d/squid restart
五、根據(jù)需求配置你的squid——進(jìn)階篇
5.1其它配置選項(xiàng)
在進(jìn)行squid的一些高級(jí)應(yīng)用之前,我們有必要對(duì)其他有用的配置選項(xiàng)作一個(gè)全面的了解。下面我們分類(lèi)來(lái)講一講這些選項(xiàng),用于某些特殊應(yīng)用的選項(xiàng)我們將放在講該種應(yīng)用時(shí)來(lái)講。
5.1.1網(wǎng)絡(luò)選項(xiàng)
1.tcp_incoming_address
tcp_outgoing_address
udp_incoming_address
udp_outgoing_address
說(shuō)明:
tcp_incoming_address指定監(jiān)聽(tīng)來(lái)自客戶或其他squid代理服務(wù)器的綁定ip地址;
tcp_outgoing_address指定向遠(yuǎn)程服務(wù)器或其他squid代理服務(wù)器發(fā)起連接的ip地址
udp_incoming_address為ICP套接字指定接收來(lái)自其他squid代理服務(wù)器的包的ip地址 udp_outgoing_address為ICP套接字指定向其他squid代理服務(wù)器發(fā)送包的ip地址;
缺省為沒(méi)有綁定任何ip地址。該綁定地址可以用ip指定,也可以用完整的域名指定。
5.1.2交換空間設(shè)定選項(xiàng)
1.cache_swap_low (percent, 0-100)
cache_swap_high (percent, 0-100)
說(shuō)明:squid使用大量的交換空間來(lái)存儲(chǔ)對(duì)象。那么,過(guò)了一定的時(shí)間以后,該交換空間就會(huì)用完,所以還必須定期的按照某種指標(biāo)來(lái)將低于某個(gè)水平線的對(duì)象清除。squid使用所謂的“最近最少使用算法”(LRU)來(lái)做這一工作。當(dāng)已使用的交換空間達(dá)到cache_swap_high時(shí),squid就根據(jù)LRU所計(jì)算的得到每個(gè)對(duì)象的值將低于某個(gè)水平線的對(duì)象清除。這種清除工作一直進(jìn)行直到已用空間達(dá)到cache_swap_low。這兩個(gè)值用百分比表示,如果你所使用的交換空間很大的話,建議你減少這兩個(gè)值得差距,因?yàn)檫@時(shí)一個(gè)百分點(diǎn)就可能是幾百兆空間,這勢(shì)必影響squid的性能。缺省為:
cache_swap_low 90
cache_swap_high 95
2.maximum_object_size
說(shuō)明:大于該值得對(duì)象將不被存儲(chǔ)。如果你想要提高訪問(wèn)速度,就請(qǐng)降低該值;如果你想最大限度地節(jié)約帶寬,降低成本,請(qǐng)?jiān)黾釉撝怠挝粸镵,缺省值為:
maximum_object_size 4096 KB
5.1.3有關(guān)日志的選項(xiàng)
1.cache_access_log
說(shuō)明:指定客戶請(qǐng)求記錄日志的完整路徑(包括文件的名稱(chēng)及所在的目錄),該請(qǐng)求可以是來(lái)自一般用戶的HTTP請(qǐng)求或來(lái)自鄰居的ICP請(qǐng)求。缺省值為:
cache_access_log /var/log/squid/access.log
如果你不需要該日志,可以用以下語(yǔ)句取消:cache_access_log none
2.cache_store_log
說(shuō)明:指定對(duì)象存儲(chǔ)記錄日志的完整路徑(包括文件的名稱(chēng)及所在的目錄)。該記錄表明哪些對(duì)象被寫(xiě)到交換空間,哪些對(duì)象被從交換空間清除。缺省路徑為:
cache_log /var/log/squid/cache.log
如果你不需要該日志,可以用以下語(yǔ)句取消:cache_store_log none
3.cache_log
說(shuō)明:指定squid一般信息日志的完整路徑(包括文件的名稱(chēng)及所在的目錄)。
缺省路徑為:cache_log /var/log/squid/cache.log
4.cache_swap_log
說(shuō)明:該選項(xiàng)指明每個(gè)交換空間的“swap.log”日志的完整路徑(包括文件的名稱(chēng)及所在的目錄)。該日志文件包含了存儲(chǔ)在交換空間里的對(duì)象的元數(shù)據(jù)(metadata)。通常,系統(tǒng)將該文件自動(dòng)保存在第一個(gè)“cache_dir”說(shuō)定義的頂級(jí)目錄里,但是你也可以指定其他的路徑。如果你定義了多個(gè)“cache_dir”,則相應(yīng)的日志文件可能是這樣的:
cache_swap_log.00
cache_swap_log.01
cache_swap_log.02
后面的數(shù)字?jǐn)U展名與指定的多個(gè)“cache_dir”一一對(duì)應(yīng)。
需要注意的是,最好不要?jiǎng)h除這類(lèi)日志文件,否則squid將不能正常工作。
5.pid_filename
說(shuō)明:指定記錄squid進(jìn)程號(hào)的日志的完整路徑(包括文件的名稱(chēng)及所在的目錄)。缺省路徑為
pid_filename /var/run/squid.pid
如果你不需要該文件,可以用以下語(yǔ)句取消:pid_filename none
6.debug_options
說(shuō)明:控制作日志時(shí)記錄信息的多寡。可以從兩個(gè)方面控制:section控制從幾個(gè)方面作記錄;level控制每個(gè)方面的記錄的詳細(xì)程度。推薦的方式(也是缺省方式)是:debug_options ALL,1
即,對(duì)每個(gè)方面都作記錄,但詳細(xì)程度為1(最低)。
7.log_fqdn on|off
說(shuō)明:控制在 access.log 中對(duì)用戶地址的記錄方式。打開(kāi)該選項(xiàng)時(shí),squid記錄客戶的完整域名,取消該選項(xiàng)時(shí),squid記錄客戶的ip地址。注意,如果打開(kāi)該選項(xiàng)會(huì)增加系統(tǒng)的負(fù)擔(dān),因?yàn)閟quid還得進(jìn)行客戶ip的DNS查詢。缺省值為:log_fqdn off
5.1.4有關(guān)外部支持程序的選項(xiàng)
1.ftp_user
說(shuō)明:設(shè)置登錄匿名ftp服務(wù)器時(shí)的提供的電子郵件地址,登錄匿名ftp服務(wù)器時(shí)要求用你的電子郵件地址作為登錄口令(更多的信息請(qǐng)參看本書(shū)的相關(guān)章節(jié))。需要注意的是,有的匿名ftp服務(wù)器對(duì)這一點(diǎn)要求很苛刻,有的甚至?xí)z查你的電子郵件的有效性。缺省值為:ftp_user Squid@
2.ftp_list_width
說(shuō)明:設(shè)置ftp列表的寬度,如果設(shè)得太小將不能的瀏覽到長(zhǎng)文件名。缺省值為: ftp_list_width 32
3.cache_dns_program
說(shuō)明:指定DNS查詢程序的完整路徑(包括文件的名稱(chēng)及所在的目錄)。缺省路徑為:
cache_dns_program /usr/lib/squid/dnsserver
4.dns_children
說(shuō)明:設(shè)置DNS查詢程序的進(jìn)程數(shù)。對(duì)于大型的登錄服務(wù)器系統(tǒng),建議該值至少為10。最大值可以是32,缺省設(shè)置為5個(gè)。注意,如果你任意的降低該值,可能會(huì)使系統(tǒng)性能急劇降低,因?yàn)閟quid主進(jìn)程要等待域名查詢的結(jié)果。沒(méi)有必要減少該值,因?yàn)镈NS查詢進(jìn)程并不會(huì)消耗太多的系統(tǒng)的資源。
5.dns_nameservers
說(shuō)明:指定一個(gè)DNS服務(wù)器列表,強(qiáng)制squid使用該列表中的DNS服務(wù)器而非使用/etc/resolv.conf文件中定義的DNS服務(wù)器。你可以這樣指定多個(gè)DNS服務(wù)器:dns_nameservers 10.0.0.1 192.172.0.4
缺省設(shè)置為:dns_nameservers none
6.unlinkd_program
說(shuō)明:指定文件刪除進(jìn)程的完整路徑。
缺省設(shè)置為:
unlinkd_program /usr/lib/squid/unlinkd
7.pinger_program
說(shuō)明:指定ping進(jìn)程的完整路徑。該進(jìn)程被squid利用來(lái)測(cè)量與其他鄰居的路由距離。該選項(xiàng)只在你啟用了該功能時(shí)有用。缺省為:
pinger_program /usr/lib/squid/pinger
8.authenticate_program
說(shuō)明:指定用來(lái)進(jìn)行用戶認(rèn)證的外部程序的完整路徑。squid的用戶認(rèn)證功能我們將在后面的章節(jié)講述。缺省設(shè)置為不認(rèn)證。
5.1.5用戶訪問(wèn)控制選項(xiàng)
1.request_size (KB)
說(shuō)明:設(shè)置用戶請(qǐng)求通訊量的最大允許值(單位為KB)。如果用戶用POST方法請(qǐng)求時(shí),應(yīng)該設(shè)一個(gè)較大的值。缺省設(shè)置為:
request_size 100 KB
2.reference_age
說(shuō)明:squid根據(jù)對(duì)象的LRU(最近最少使用算法)來(lái)清除對(duì)象,squid依據(jù)使用磁盤(pán)空間的總量動(dòng)態(tài)地計(jì)算對(duì)象的LRU年齡。我們用reference_age定義對(duì)象的最大LRU年齡。如果一個(gè)對(duì)象在指定的reference_age內(nèi)沒(méi)有被訪問(wèn),squid將刪除該對(duì)象。缺省值為一個(gè)月。你可以使用如下所示的時(shí)間表示方法。
1 week
3.5 days
4 months
2.2 hours
3.quick_abort_min (KB)
quick_abort_max (KB)
quick_abort_pct (percent)
說(shuō)明:控制squid是否繼續(xù)傳輸被用戶中斷的請(qǐng)求。當(dāng)用戶中斷請(qǐng)求時(shí),squid將檢測(cè)
quick_abort 的值。如果剩余部分小于“quick_abort_min”指定的值,squid 將繼續(xù)完成剩余部分的傳輸;如果剩余部分大于“quick_abort_max”指定的值,squid 將終止剩余部分的傳輸;如果已完成“quick_abort_pct”指定的百分比,squid將繼續(xù)完成剩余部分的傳輸。缺省的設(shè)置為:
quick_abort_min 16 KB
quick_abort_max 16 KB
quick_abort_pct 95
5.1.6各類(lèi)超時(shí)設(shè)置選項(xiàng)
1.negative_ttl time-units
說(shuō)明:設(shè)置消極存儲(chǔ)對(duì)象的生存時(shí)間。所謂的消極存儲(chǔ)對(duì)象,就是諸如“連接失敗”及"404 Not Found"等一類(lèi)錯(cuò)誤信息。缺省設(shè)置為:negative_ttl 5 minutes
2.positive_dns_ttl time-units
說(shuō)明:設(shè)置緩存成功的DNS查詢結(jié)果的生存時(shí)間。缺省為6小時(shí)。
positive_dns_ttl 6 hours
3.negative_dns_ttl time-units
說(shuō)明:設(shè)置緩存失敗的DNS查詢結(jié)果的生存時(shí)間。缺省為5分鐘。
negative_dns_ttl 5 minutes
4.connect_timeout time-units
說(shuō)明:設(shè)置squid等待連接完成的超時(shí)值。缺省值為2分鐘。
connect_timeout 120 seconds
5.read_timeout time-units
說(shuō)明:如果在指定的時(shí)間內(nèi)squid尚未從被請(qǐng)求的服務(wù)器讀入任何數(shù)據(jù),則squid將終止該客戶請(qǐng)求。缺省值為15分鐘。
read_timeout 15 minutes
6.request_timeout
說(shuō)明:設(shè)置在建立與客戶的連接后,squid將花多長(zhǎng)時(shí)間等待客戶發(fā)出HTTP請(qǐng)求。缺省值為30秒。
request_timeout 30 seconds
7.client_lifetime time-units
說(shuō)明:設(shè)置客戶在與squid建立連接后,可以將該連接保持多長(zhǎng)時(shí)間。
注意,因?yàn)榭蛻艚⒌拿總€(gè)連接都會(huì)消耗一定的系統(tǒng)資源,所以如果你是為一個(gè)大型網(wǎng)絡(luò)提供代理服務(wù)的話,一定要正確地修改該值。因?yàn)槿绻粫r(shí)間的連接數(shù)量太大的話,可能會(huì)消耗大量的系統(tǒng)資源,從而導(dǎo)致服務(wù)器宕機(jī)。缺省值為1天,該值太大了,建議根據(jù)你自己的情況適當(dāng)減小該值。
client_lifetime 1 day
8.half_closed_clients on/off
說(shuō)明:有時(shí)候由于用戶的不正常操作,可能會(huì)使與squid的TCP連接處于半關(guān)閉狀態(tài),
這時(shí)候,該TCP連接的發(fā)送端已經(jīng)關(guān)閉,而接收端正常工作。缺省地,squid將一直保持這種處于半關(guān)閉狀態(tài)的TCP連接,直到返回套接字的讀寫(xiě)錯(cuò)誤才將其關(guān)閉。如果將該值設(shè)為off,則一旦從客戶端返回“no more data to read”的信息,squid就立即關(guān)閉該連接。half_closed_clients on
9.pconn_timeout
說(shuō)明:設(shè)置squid在與其他服務(wù)器和代理建立連接后,該連接閑置多長(zhǎng)時(shí)間后被關(guān)閉。缺省值為120秒。
pconn_timeout 120 seconds
10.ident_timeout
說(shuō)明:設(shè)置squid等待用戶認(rèn)證請(qǐng)求的時(shí)間。缺省值為10秒。
ident_timeout 10 seconds
11.shutdown_lifetime time-units
說(shuō)明:當(dāng)收到SIGTERM 或者 SIGHUP 信號(hào)后, squid將進(jìn)入一種shutdown pending的模式,等待所有活動(dòng)的套接字關(guān)閉。在過(guò)了shutdown_lifetime所定義的時(shí)間后,所有活動(dòng)的用戶都將收到一個(gè)超時(shí)信息。缺省值為30秒。
shutdown_lifetime 30 seconds
5.1.7管理參數(shù)選項(xiàng)
1.cache_mgr
說(shuō)明:設(shè)置管理員郵件地址。缺省為:
cache_mgr root
2. cache_effective_user
cache_effective_group
說(shuō)明:如果用root啟動(dòng)squid,squid將變成這兩條語(yǔ)句指定的用戶和用戶組。缺省變?yōu)閟quid用戶和squid用戶組。注意這里指定的用戶和用戶組必須真是存在于/etc/passwd中。如果用非root帳號(hào)啟動(dòng)squid,則squid將保持改用戶及用戶組運(yùn)行,這時(shí)候,你不能指定小于1024地http_port。
cache_effective_user squid
cache_effective_group squid
3.visible_hostname
說(shuō)明:定義在返回給用戶的出錯(cuò)信息中的主機(jī)名。
如: visible_hostname www-cache.foo.org
4.unique_hostname
說(shuō)明:如果你有一個(gè)代理服務(wù)器陣列,并且你為每個(gè)代理服務(wù)器指定了同樣的“visible_hostname”,同時(shí)你必須為它們指定不同的“unique_hostname”來(lái)避免“forwarding loops ”(傳輸循環(huán))發(fā)生。
5.1.8其它雜項(xiàng)
1. dns_testnames
說(shuō)明:設(shè)置進(jìn)行DNS查詢測(cè)試,如果第一個(gè)站點(diǎn)解析成功則立即結(jié)束DNS查詢測(cè)試。如果你不愿意進(jìn)行DNS查詢測(cè)試,就不要去掉缺省的設(shè)置。
#dns_testnames netscape.com internic.net nlanr.net microsoft.com
2.logfile_rotate
說(shuō)明:通常,squid會(huì)定期的將日志文件更名并打包。比如正在使用的日志文件為access.log,squid會(huì)將其更名并打包為access.log.1.gz;過(guò)了一定時(shí)間后,squid又會(huì)將
access.log.1.gz更名為access.log.2.gz并將當(dāng)前的日志文件更名并打包為access.log.1.gz,以此循環(huán)。logfile_rotate所指定的數(shù)字即為打包并備份的文件的數(shù)量,當(dāng)達(dá)到這一數(shù)目時(shí),squid將刪除最老的備份文件。缺省值為10。如果你想手動(dòng)來(lái)進(jìn)行這些操作,你可以用logfile_rotate 0來(lái)取消自動(dòng)操作。
3.err_html_text
說(shuō)明:用該語(yǔ)句定義一個(gè)字符串變量,可以用%L在返回給用戶的錯(cuò)誤信息文件中引用。錯(cuò)誤信息文件通常在/etc/squid/errors目錄中,這是一些用HTML寫(xiě)成的腳本文件,你可以自己修改它。
4.deny_info
說(shuō)明:你可以定制自定義的拒絕訪問(wèn)信息文件,并且可以和不同的用戶列表相關(guān)聯(lián)。當(dāng)用戶被http_access相關(guān)規(guī)則拒絕時(shí),squid可以向用戶顯示你自定義的相應(yīng)的拒絕訪問(wèn)信息文件。語(yǔ)法為:
Usage: deny_info err_page_name acl
比如:
deny_info ERR_CUSTOM_ACCESS_DENIED bad_guys
5.memory_pools on|off
說(shuō)明:如果你將該項(xiàng)設(shè)為on,則squid將保留所有已經(jīng)分配(但是未使用)的內(nèi)存池以便在將來(lái)使用。缺省為on.
memory_pools on
6.log_icp_queries on|off
說(shuō)明:設(shè)置是否對(duì)ICP請(qǐng)求作日志。如果你的系統(tǒng)負(fù)載很大,你可以用off來(lái)取消該功能。缺省為:
log_icp_queries on
7.always_direct
說(shuō)明:該選項(xiàng)允許你指定某些用戶類(lèi),squid將這些用戶類(lèi)的請(qǐng)求直接轉(zhuǎn)發(fā)給被請(qǐng)求的服務(wù)器。語(yǔ)法為:
always_direct allow|deny [!]aclname ...
如:直接轉(zhuǎn)發(fā)FTP請(qǐng)求可以這樣設(shè)置:
acl FTP proto FTP
always_direct allow FTP
8.never_direct
說(shuō)明:與always_direct相反。語(yǔ)法為:
Usage: never_direct allow|deny [!]aclname ...
比如,為了強(qiáng)制除了本地域的其他用戶使用代理服務(wù)器,你可以這樣設(shè)置:
acl local-servers dstdomain foo.net
acl all src 0.0.0.0/0.0.0.0
never_direct deny local-servers
never_direct allow all
9.icon_directory
說(shuō)明:指明向用戶傳送錯(cuò)誤信息時(shí)所用到的圖標(biāo)文件的目錄。缺省路徑為: icon_directory /usr/lib/squid/icons
10.error_directory
說(shuō)明:指明向用戶傳送錯(cuò)誤信息所用到的錯(cuò)誤描述文件的目錄。缺省路徑為:
error_directory /etc/squid/errors
5.2 用戶認(rèn)證設(shè)置
缺省的,squid本身不帶任何認(rèn)證程序,但是我們可以通過(guò)外部認(rèn)證程序來(lái)實(shí)現(xiàn)用戶認(rèn)證。一般說(shuō)來(lái)有以下的認(rèn)證程序:
1.LDAP認(rèn)證:你可以訪問(wèn)以下資源來(lái)獲取更多的有用信息。
http://www.geocities.com/ResearchTriangle/Thinktank/5292/projects/ldap/
http://home.iae.nl/users/devet/squid/proxy_auth/contrib/ldap_auth.tar.gz
2.SMB認(rèn)證:可以實(shí)現(xiàn)基于NT和samba的用戶認(rèn)證。更多的信息請(qǐng)?jiān)L問(wèn)以下資源。
http://www.hacom.nl/~richard/software/smb_auth.html
3.基于mysql的用戶認(rèn)證。
http://home.iae.nl/users/devet/squid/proxy_auth/contrib/mysql_auth.c
4.基于sock5密碼用戶認(rèn)證。
http://nucleo.freeservers.com/
5.基于Radius 的用戶認(rèn)證。
http://home.iae.nl/users/devet/squid/proxy_auth/contrib/auth.pl
但是我們一般常用的是用ncsa實(shí)現(xiàn)的認(rèn)證和用smb_auth實(shí)現(xiàn)的基于NT和samba的用戶認(rèn)證。下面我們就來(lái)講這兩種認(rèn)證方法的具體實(shí)現(xiàn)。
5.2.1 ncsa用戶認(rèn)證的實(shí)現(xiàn)
ncsa是squid源代碼包自帶的認(rèn)證程序之一,下面我們以squid-2.3.STABLE2版本為例講述ncsa的安裝和配置。
1.從www.squid-cache.org下載squid源代碼包squid-2.3.STABLE2-src.tar.gz并放到/tmp目錄下。
2.用tar解開(kāi):
tar xvzf squid-2.3.STABLE2-src.tar.gz
%make
%make install
3.然后,進(jìn)入/tmp/squid-2.3.STABLE2/auth_modules/NCSA目錄。
% make
% make install
編譯成功后,會(huì)生成ncsa_auth的可執(zhí)行文件。
4.拷貝生成的執(zhí)行文件ncsa_auth到/usr/bin目錄
cp ncsa_auth /usr/bin/bin
5.修改squid.conf中的相關(guān)選項(xiàng)如下所示:
authenticate_program /usr/local/squid/bin/ncsa_auth /usr/bin/passwd
6.定義相關(guān)的用戶類(lèi)
acl auth_user proxy_auth REQUIRED
注意,REQUIRED關(guān)鍵字指明了接收所有合法用戶的訪問(wèn)。
7.設(shè)置http_access
http_access allow auth_user
注意,如果你在改行中指定了多個(gè)允許訪問(wèn)的用戶類(lèi)的話,應(yīng)該把要認(rèn)證的用戶類(lèi)放在第一個(gè)。如下所示:
錯(cuò)誤的配置:http_access allow auth_user all manager
正確的配置:http_access allow auth_user manager all
8.利用apache攜帶的工具軟件htpasswd在/usr/local/squid/etc下生成密碼文件并添加相應(yīng)的用戶信息。一般說(shuō)來(lái),該密碼文件每行包含一個(gè)用戶的用戶信息,即用戶名和密碼。
用htpasswd生成密碼文件passwd并添加用戶bye。
htpasswd -c /usr/local/squid/etc/passwd bye
然后重新啟動(dòng)squid,密碼認(rèn)證已經(jīng)生效。
5.2.2 smb用戶認(rèn)證的實(shí)現(xiàn)
國(guó)內(nèi)介紹并使用ncsa實(shí)現(xiàn)用戶認(rèn)證的文章不多,而使用smb_auth和samba實(shí)現(xiàn)基于NT的用戶認(rèn)證我還沒(méi)有看到過(guò),下面我們就來(lái)看一看在squid中實(shí)現(xiàn)基于NT的用戶認(rèn)證。
當(dāng)前smb_auth的最高版本是smb_auth-0.05,你可以在以下地址下載。當(dāng)然,squid的源代碼包中也包含smb_auth,但是是0.02版的。
http://www.hacom.nl/~richard/software/smb_auth-0.05.tar.gz
smb_auth的主頁(yè)地址是http://www.hacom.nl/~richard/software/smb_auth.html。
1.系統(tǒng)需求:
squid2.0以上版本。
安裝samba2.0.4以上版本。你并不需要運(yùn)行samba服務(wù),因?yàn)閟mb_auth只用到了 samba的客戶端軟件。
2.下載smb_auth-0.05.tar.gz并復(fù)制到/tmp.
3.tar xvzf smb_auth-0.05.tar.gz
4.根據(jù)你的要求修改Makefile中的SAMBAPREFIX和INSTALLBIN參數(shù)。SAMBAPREFIX指定了你的samba安裝路徑,INSTALLBIN指明了smb_auth的安裝路徑。我們指定:
SAMBAPREFIX=/usr,INSTALLBIN=/usr/bin.
5.make
6.make install,成功后會(huì)在INSTALLBIN指定路徑中生成可執(zhí)行文件smb_auth.
7.按下列步驟設(shè)置你要用于認(rèn)證的主域控制器:
首先在NETLOG共享目錄中建立一個(gè)“proxy”文件,該文件只包含一個(gè)“allow”的字符串,一般說(shuō)來(lái),該NETLOG目錄位于winntsystem32Replimportscripts目錄中;然后,設(shè)置所有你想讓其訪問(wèn)squid的用戶和用戶組擁有對(duì)該文件的讀的權(quán)力。
8.修改squid.conf中的相關(guān)選項(xiàng)如下所示:
authenticate_program /usr/local/squid/bin/smb_auth your_domain_name
9.定義相關(guān)的用戶類(lèi)
acl auth_user proxy_auth REQUIRED
注意,REQUIRED關(guān)鍵字指明了接收所有合法用戶的訪問(wèn)。
10.設(shè)置http_access
http_access allow auth_user
注意,如果你在改行中指定了多個(gè)允許訪問(wèn)的用戶類(lèi)的話,應(yīng)該把要認(rèn)證的用戶類(lèi)放在第一個(gè)。如下所示:
錯(cuò)誤的配置:http_access allow auth_user all manager
正確的配置:http_access allow auth_user manager all
如果一切正確的話,然后重新啟動(dòng)squid,密碼認(rèn)證已經(jīng)生效。
說(shuō)明:smb_auth的調(diào)用方法:
1.smb_auth -W your_domain_name
用your_domain_name指定你的域名。smb_auth將進(jìn)行廣播尋找該主域控制器。
2.smb_auth -W your_domain_name -B
如果你有多個(gè)網(wǎng)絡(luò)接口,可以用-B 指定用于廣播的網(wǎng)絡(luò)接口的ip地址。
3.smb_auth -W your_domain_name -U
也可以用-U直接指定該主域控制器的ip地址。
4.smb_auth -W your_domain_name -S share
可以用-S指定一個(gè)不同于NETLOG的共享目錄。
5.2.3 squid.conf中關(guān)于認(rèn)證的其他設(shè)置
1.authenticate_children
說(shuō)明:設(shè)置認(rèn)證子進(jìn)程的數(shù)目。缺省為5個(gè)。如果你處于一個(gè)繁忙的網(wǎng)絡(luò)環(huán)境中,你可以適當(dāng)增大該值。
2.authenticate_ttl
說(shuō)明:設(shè)置一次認(rèn)證的有效期,缺省是3600秒。
3.proxy_auth_realm
說(shuō)明:設(shè)置用戶登錄認(rèn)證時(shí)向用戶顯示的域名。
5.3透明代理的設(shè)置
關(guān)于透明代理的概念我們已經(jīng)在第一節(jié)將過(guò)了,下面我們看一下怎么樣在squid中實(shí)現(xiàn)透明代理。
透明代理的實(shí)現(xiàn)需要在Linux 2.0.29以上,但是Linux 2.0.30并不支持該功能,好在我們現(xiàn)在使用的通常是2.2.X以上的版本,所以不必?fù)?dān)心這個(gè)問(wèn)題。下面我們就用ipchains+squid來(lái)實(shí)現(xiàn)透明代理。在開(kāi)始之前需要說(shuō)明的是,目前我們只能實(shí)現(xiàn)支持HTTP的透明代理,但是也不必太擔(dān)心,因?yàn)槲覀冎允褂么恚康氖抢胹quid的緩存來(lái)提高Web的訪問(wèn)速度,至于提供內(nèi)部非法ip地址的訪問(wèn)及提高網(wǎng)絡(luò)安全性,我們可以用ipchains來(lái)解決。
實(shí)現(xiàn)環(huán)境:RedHat6.x+squid2.2.x+ipchains
5.3.1 linux的相關(guān)配置
確定你的內(nèi)核已經(jīng)配置了以下特性:
[*] Network firewalls
[ ] Socket Filtering
[*] Unix domain sockets
[*] TCP/IP networking
[ ] IP: multicasting
[ ] IP: advanced router
[ ] IP: kernel level autoconfiguration
[*] IP: firewalling
[ ] IP: firewall packet netlink device
[*] IP: always defragment (required for masquerading)
[*] IP: transparent proxy support
如果沒(méi)有,請(qǐng)你重新編譯內(nèi)核。一般在RedHat6.x以上,系統(tǒng)已經(jīng)缺省配置了這些特性。
5.3.2squid的相關(guān)配置選項(xiàng)
設(shè)置squid.conf中的相關(guān)選項(xiàng),如下所示:
http_port 3218
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
說(shuō)明:
1.http_port 3128
在本例中,我們假設(shè)squid的HTTP監(jiān)聽(tīng)端口為3128,即squid缺省設(shè)置值。然后,把所有來(lái)自于客戶端web請(qǐng)求的包(即目標(biāo)端口為80)重定向到3128端口。
2.httpd_accel_host virtual
httpd_accel_port 80
這兩個(gè)選項(xiàng)本來(lái)是用來(lái)定義squid加速模式的。在這里我們用virtual來(lái)指定為虛擬主機(jī)模式。80端口為要加速的請(qǐng)求端口。采用這種模式時(shí),squid就取消了緩存及ICP功能,假如你需要這些功能,這必須設(shè)置httpd_accel_with_proxy選項(xiàng)。
3.httpd_accel_with_proxy on
該選項(xiàng)在透明代理模式下是必須設(shè)置成on的。在該模式下,squid既是web請(qǐng)求的加速器,又是緩存代理服務(wù)器。
4.httpd_accel_uses_host_header on
在透明代理模式下,如果你想讓你代理服務(wù)器的緩存功能正確工作的話,你必須將該選項(xiàng)設(shè)為on。設(shè)為on時(shí),squid會(huì)把存儲(chǔ)的對(duì)象加上主機(jī)名而不是ip地址作為索引。這一點(diǎn)在你想建立代理服務(wù)器陣列時(shí)顯得尤為重要。
5.3.3 ipchains的相關(guān)配置
ipchains在這里所起的作用是端口重定向。我們可以使用下列語(yǔ)句實(shí)現(xiàn)將目標(biāo)端口為80端口的TCP包重定向到3128端口。
#接收所有的回送包
/sbin/ipchains -A input -j ACCEPT -i lo
#將目標(biāo)端口為80端口的TCP包重定向到3128端口
/sbin/ipchains -A input -p tcp -d 0.0.0.0/0 80 -j REDIRECT 80
當(dāng)然在這以前,我們必須用下面的語(yǔ)句打開(kāi)包轉(zhuǎn)發(fā)功能。
echo 1 > /proc/sys/net/ipv4/ip_forward
小節(jié)
開(kāi)始,我們討論了代理服務(wù)器的概念,代理服務(wù)器的分類(lèi);然后,我們把注意力集中在squid,講述了如何安裝和配置squid;最后我們講了一些squid配置中的高級(jí)話題,即實(shí)現(xiàn)用戶認(rèn)證的兩種方法,透明代理的實(shí)現(xiàn)等。當(dāng)然,還有一些高級(jí)話題本章沒(méi)有講到,如代理陣列的實(shí)現(xiàn),加速模式的運(yùn)用等等。但是,我們不可能把所有東西都講完講全,希望讀者能舉一反三,自己去摸索,去嘗試。
1.1什么是代理服務(wù)器
在TCP/IP網(wǎng)絡(luò)中,傳統(tǒng)的通信過(guò)程是這樣的:客戶端向服務(wù)器請(qǐng)求數(shù)據(jù),服務(wù)器響應(yīng)該請(qǐng)求,將數(shù)據(jù)傳送給客戶端。在引入了代理服務(wù)器以后,這一過(guò)程變成了這樣:客戶端向服務(wù)器發(fā)起請(qǐng)求,該請(qǐng)求被送到代理服務(wù)器;代理服務(wù)器分析該請(qǐng)求,先查看自己緩存中是否有請(qǐng)求數(shù)據(jù),如果有就直接傳送給客戶端,如果沒(méi)有就代替客戶端向該服務(wù)器發(fā)出請(qǐng)求。服務(wù)器響應(yīng)以后,代理服務(wù)器將響應(yīng)的數(shù)據(jù)傳送給客戶端,同時(shí)在自己的緩存中保留一份該數(shù)據(jù)的拷貝。這樣,再有客戶端請(qǐng)求相同的數(shù)據(jù)時(shí),代理服務(wù)器就可以直接將數(shù)據(jù)傳送給客戶端,而不需要再向該服務(wù)器發(fā)起請(qǐng)求。
1.2 代理服務(wù)器的功能
一般說(shuō)來(lái),代理服務(wù)器具有以下的功能:
1.通過(guò)緩存增加訪問(wèn)速度
隨著Internet的迅猛發(fā)展,網(wǎng)絡(luò)帶寬變得越來(lái)越珍貴。所以為了提高訪問(wèn)速度,好多ISP都提供代理服務(wù)器,通過(guò)代理服務(wù)器的緩存功能來(lái)加快網(wǎng)絡(luò)的訪問(wèn)速度。一般說(shuō)來(lái),大多數(shù)的代理服務(wù)器都支持HTTP緩存,但是,有的代理服務(wù)器也支持FTP緩存。在選擇代理服務(wù)器時(shí),對(duì)于大多數(shù)的組織,只需要HTTP緩存功能就足夠了。
通常,緩存有主動(dòng)緩存被動(dòng)緩存之分。所謂被動(dòng)緩存,指的是代理服務(wù)器只在客戶端請(qǐng)求數(shù)據(jù)時(shí)才將服務(wù)器返回的數(shù)據(jù)進(jìn)行緩存,如果數(shù)據(jù)過(guò)期了,又有客戶端請(qǐng)求相同數(shù)據(jù)時(shí),代理服務(wù)器又必須重新發(fā)起新的數(shù)據(jù)請(qǐng)求,在將響應(yīng)數(shù)據(jù)傳送給客戶端時(shí)又進(jìn)行新的緩存。所謂主動(dòng)緩存,就是代理服務(wù)器不斷地檢查緩存中的數(shù)據(jù),一旦有數(shù)據(jù)過(guò)期,則代理服務(wù)器主動(dòng)發(fā)起新的數(shù)據(jù)請(qǐng)求來(lái)更新數(shù)據(jù)。這樣,當(dāng)有客戶端請(qǐng)求該數(shù)據(jù)時(shí)就會(huì)大大縮短響應(yīng)時(shí)間。還需要說(shuō)明的是,對(duì)于數(shù)據(jù)中的認(rèn)證信息,大多數(shù)的代理服務(wù)器都不會(huì)進(jìn)行緩存的。
2.提供用私有IP訪問(wèn)Internet的方法
IP地址是不可再生的寶貴資源,假如你只有有限的IP地址,但是需要提供整個(gè)組織的Internet訪問(wèn)能力,那么,你可以通過(guò)使用代理服務(wù)器來(lái)實(shí)現(xiàn)這一點(diǎn)。
3.提高網(wǎng)絡(luò)的安全性
這一點(diǎn)是很明顯的,如果內(nèi)部用戶訪問(wèn)Internet都是通過(guò)代理服務(wù)器,那么,代理服務(wù)器就成為進(jìn)入Internet的唯一通道;反過(guò)來(lái)說(shuō),代理服務(wù)器也是Internet訪問(wèn)內(nèi)部網(wǎng)的唯一通道,如果你沒(méi)有做反向代理,則對(duì)于Internet上的主機(jī)來(lái)說(shuō),你的整個(gè)內(nèi)部網(wǎng)只有代理服務(wù)器是可見(jiàn)的,從而大大增強(qiáng)了網(wǎng)絡(luò)的安全性。
1.3 代理服務(wù)器的分類(lèi)及特點(diǎn)
通常的代理服務(wù)器分類(lèi)方法,是從實(shí)現(xiàn)的機(jī)理分為線路層代理、應(yīng)用層代理、智能線路層代理等等。在這里,我想從另外一個(gè)角度出發(fā),把代理服務(wù)器分為傳統(tǒng)代理服務(wù)器和透明代理服務(wù)器。
我認(rèn)為有必要好好搞清楚兩者的區(qū)別,只有真正明白了內(nèi)在地機(jī)理,才能在遇到問(wèn)題時(shí),有章可循,才不會(huì)一頭霧水,不知從何解決問(wèn)題。因此,下面我們就通過(guò)具體的實(shí)例來(lái)說(shuō)明。本章的寫(xiě)作思路來(lái)源于Paul Russell所寫(xiě)的IPCHAINS-HOWTO。下面所舉的例子也來(lái)源于該文章,我覺(jué)得我讀該文的最大收獲在于對(duì)內(nèi)部網(wǎng)訪問(wèn)外部網(wǎng)以及外部網(wǎng)訪問(wèn)內(nèi)部網(wǎng)的實(shí)現(xiàn)手段有了一個(gè)清晰的認(rèn)識(shí)。當(dāng)然,這里所謂的內(nèi)部網(wǎng)是指使用私有IP的內(nèi)部網(wǎng)絡(luò)。
我們的例子都基于以下假設(shè):
你的域名為sample.com,你的內(nèi)部網(wǎng)(192.168.1.*)用戶通過(guò)proxy.sample.com(外部接口 eth0:1.2.3.4;內(nèi)部接口 eth1:192.168.1.1)的代理服務(wù)器訪問(wèn)Internet,換句話說(shuō),該代理服務(wù)器是唯一一臺(tái)直接與Internet和內(nèi)部網(wǎng)相連的機(jī)器。并假該設(shè)代理服務(wù)器上運(yùn)行著某種代理服務(wù)器軟件(如squid)。假設(shè)內(nèi)部網(wǎng)中某一客戶機(jī)為client.sample.com(192.168.1.100)。
+-------------------+
|內(nèi)部網(wǎng)(192.168.1.*)| eth1+--------+eth0 DDN
| +------------| proxy |<===============>Internet
|client198.168.1.100| +--------+
+-------------------+
eth0: 1.2.3.4
eth1: 198.168.1.1
1.3.1傳統(tǒng)代理
在以上基礎(chǔ)上我們做以下工作:
1.代理服務(wù)軟件被綁定到代理服務(wù)器的8080端口。
2.客戶端瀏覽器被配置使用代理服務(wù)器的8080端口。
3.客戶端不需要配置DNS。
4.代理服務(wù)器上需要配置代理服務(wù)器。
5.客戶端不需要配置缺省路由。
當(dāng)我們?cè)诳蛻舳藶g覽器中打開(kāi)一個(gè)web請(qǐng)求,比如“http://www.linuxaid.com.cn”,這時(shí)將陸續(xù)發(fā)生以下事件:
1.客戶端使用某一端口(比如1025)連接代理服務(wù)器8080端口,請(qǐng)求web頁(yè)面“http://www.linuxaid.com.cn”
2.代理服務(wù)器向DNS請(qǐng)求“www.linuxaid.com.cn”,得到相應(yīng)的IP地址202.99.11.120。然后,代理服務(wù)器使用某一端口(比如1037)向該IP地址的80端口發(fā)起web連接請(qǐng)求,請(qǐng)求web頁(yè)面。
3.收到響應(yīng)的web頁(yè)面后,代理服務(wù)器把該數(shù)據(jù)傳送給客戶端。
4.客戶端瀏覽器顯示該頁(yè)面。
從www.linuxaid.com.cn的角度看來(lái),連接是在1.2.3.4地1037端口和202.99.11.120的80端口之間建立的。從client的角度看來(lái),連接是在192.168.1.100的1025端口和1.2.3.4的8080端口之間建立的。
1.3.2 透明代理
透明代理的意思是客戶端根本不需要知道有代理服務(wù)器的存在。
在以上基礎(chǔ)上我們做以下工作:
1.配置透明代理服務(wù)器軟件運(yùn)行在代理服務(wù)器的8080端口。
2.配置代理服務(wù)器將所有對(duì)80端口的連接重定向到8080端口。
3.配置客戶端瀏覽器直接連解到Internet。
4.在客戶端配置好DNS.
5.配置客戶端的缺省網(wǎng)關(guān)為192.168.1.1.
當(dāng)我們?cè)诳蛻舳藶g覽器中打開(kāi)一個(gè)web請(qǐng)求,比如“http://www.linuxaid.com.cn”,這時(shí)將陸續(xù)發(fā)生以下事件:
1.客戶端向DNS請(qǐng)求“www.linuxaid.com.cn”,得到相應(yīng)的IP地址202.99.11.120。然后,客戶端使用某一端口(比如1066)向該IP地址的80端口發(fā)起web連接請(qǐng)求,請(qǐng)求web頁(yè)面。
2.當(dāng)該請(qǐng)求包通過(guò)透明代理服務(wù)器時(shí),被重定向到代理服務(wù)器的綁定端口8080。于是,透明代理服務(wù)器用某一端口(比如1088)向202.99.11.120的80端口發(fā)起web連接請(qǐng)求,請(qǐng)求web頁(yè)面。
3.收到響應(yīng)的web頁(yè)面后,代理服務(wù)器把該數(shù)據(jù)傳送給客戶端。
4.客戶端瀏覽器顯示該頁(yè)面。
從www.linuxaid.com.cn的角度看來(lái),連接是在1.2.3.4地1088端口和202.99.11.120的80端口之間建立的。從client的角度看來(lái),連接是在192.168.1.100的1066端口和202.99.11.120的80端口之間建立的。
以上就是傳統(tǒng)代理服務(wù)器和透明代理服務(wù)器的區(qū)別所在。
二、各種代理服務(wù)器的比較
linux下的代理服務(wù)器軟件很多,我從www.freshmeat.com(一個(gè)著名的linux軟件站點(diǎn))查看了一下,足有六十多個(gè)。但是被廣泛應(yīng)用的只有Apache、socks、squid等幾個(gè)實(shí)踐證明是高性能的代理軟件。下面我們分別來(lái)比較一下這幾個(gè)軟件:
2.1 Apache
Apache是世界上用的最廣泛的HTTP服務(wù)器,之所以用的最廣泛,是因?yàn)樗鼜?qiáng)大的功能、高效率、安全性和速度。從1.1.x版本開(kāi)始,Apache開(kāi)始包含了一個(gè)代理模塊。用Apache作代理服務(wù)器的性能優(yōu)勢(shì)并不明顯,不建議使用。
2.2 Socks
Socks是一種網(wǎng)絡(luò)代理協(xié)議,該協(xié)議可以讓客戶機(jī)通過(guò)Socks服務(wù)器獲得對(duì)Internet的完全訪問(wèn)能力。Scoks在服務(wù)器和客戶端之間建立一個(gè)安全的代理數(shù)據(jù)通道,從客戶的角度看來(lái),Scoks是透明的;從服務(wù)器的角度看來(lái),Socks就是客戶端。客戶端不需要具有對(duì)Internet的直接訪問(wèn)能力(也就是說(shuō),可以使用私有IP地址),因?yàn)镾ocks服務(wù)器能夠把來(lái)自于客戶端的連接請(qǐng)求重定向到Internet。此外,Socks服務(wù)器可以對(duì)用戶連接請(qǐng)求進(jìn)行認(rèn)證,允許合法用戶建立代理連接。同理,Socks也能防止非授權(quán)的Internet用戶訪問(wèn)及的內(nèi)部網(wǎng)絡(luò)。所以常常把Socks當(dāng)作防火墻來(lái)使用。
常見(jiàn)的瀏覽器如netscape、IE等可以直接使用Socks, 并且我們也可以使用socsk5的所帶的client來(lái)使那些不直接支持socks的internet軟件使用Socks。
更多的資料可以參考Socks官方站點(diǎn)http://www.socks.nec.com。
2.3 Squid
對(duì)于web用戶來(lái)說(shuō),Squid是一個(gè)高性能的代理緩存服務(wù)器,Squid支持FTP、gopher和HTTP協(xié)議。和一般的代理緩存軟件不同,Squid用一個(gè)單獨(dú)的、非模塊化的、I/O驅(qū)動(dòng)的進(jìn)程來(lái)處理所有的客戶端請(qǐng)求。
Squid將數(shù)據(jù)元緩存在內(nèi)存中,同時(shí)也緩存DNS查詢的結(jié)果,除此之外,它還支持非模塊化的DNS查詢,對(duì)失敗的請(qǐng)求進(jìn)行消極緩存。Squid支持SSL,支持訪問(wèn)控制。由于使用了ICP(輕量Internet緩存協(xié)議),Squid能夠?qū)崿F(xiàn)層疊的代理陣列,從而最大限度地節(jié)約帶寬。
Squid由一個(gè)主要的服務(wù)程序squid,一個(gè)DNS查詢程序dnsserver,幾個(gè)重寫(xiě)請(qǐng)求和執(zhí)行認(rèn)證的程序,以及幾個(gè)管理工具組成。當(dāng)Squid啟動(dòng)以后,它可以派生出預(yù)先指定數(shù)目的dnsserver進(jìn)程,而每一個(gè)dnsserver進(jìn)程都可以執(zhí)行單獨(dú)的DNS查詢,這樣一來(lái)就大大減少了服務(wù)器等待DNS查詢的時(shí)間。
2.4 選擇
從上面的比較可以看出,Apache主要功能是web服務(wù)器,代理功能只不過(guò)是其一個(gè)模塊而已,Socks雖然強(qiáng)大,但有欠靈活,因此我們著重推薦你使用Squid。下面的章節(jié)我們就一起來(lái)學(xué)習(xí)Squid激動(dòng)人心的特性及相關(guān)的安裝與配置。
三、安裝Squid Proxy Server
3.1獲取軟件
你可以通過(guò)以下途徑獲取該軟件:
1.從Squid的官方站點(diǎn)http://www.squid-cache.org下載該軟件;
2.從你的linux發(fā)行版本中獲取該軟件;
通常,Squid軟件包有兩種:一種是源代碼,下載后需要自己重新編譯;可執(zhí)行文件,下載后只需解壓就可以使用;另一種是就是RedHat所使用的rpm包。下面我們分別講講這兩種軟件包的安裝方法。
3.2安裝軟件
我們以目前最新的穩(wěn)定版本squid-2.3.STABLEX為例。
3.2.1rpm包的安裝
1.進(jìn)入/mnt/cdrom/RedHat/RPMS
2.執(zhí)行rpm -ivh squid-2.2.STABLE4-8.i386.rpm。
當(dāng)然,我們也可以在開(kāi)始安裝系統(tǒng)的過(guò)程中安裝該軟件。
3.2.2 源代碼包的安裝
1.從http://www.squid-cache.org下載squid-2.3.STABLE2-src.tar.gz。
2.將該文件拷貝到/usr/local目錄。
3.解開(kāi)該文件 tar xvzf squid-2.3.STABLE2-src.tar.gz。
4.解開(kāi)后,在/usr/local生成一個(gè)新的目錄squid-2.3.STABLE2,為了方便用mv命令將 該目錄重命名為squid mv squid-2.3.STABLE2 squid;
5.進(jìn)入squid cd squid
6.執(zhí)行./configure 可以用./confgure --prefix=/directory/you/want指定安裝目錄
系統(tǒng)缺省安裝目錄為/usr/local/squid。
7.執(zhí)行 make all
8.執(zhí)行 make install
9.安裝結(jié)束后,squid的可執(zhí)行文件在安裝目錄的bin子目錄下,配置文件在etc子目錄下。
四、配置squid基礎(chǔ)篇——讓代理服務(wù)器跑起來(lái)
由于RedHat各方面的優(yōu)勢(shì)(包括易用性,穩(wěn)定性等等),全世界范圍內(nèi)使用該發(fā)行版的用戶比較多,所以,我們下面的說(shuō)明都是以RedHat6.1環(huán)境下squid-2.2.STABLE4-8版本為主。從我的使用經(jīng)驗(yàn)看來(lái),該版本的squid要比其他版本穩(wěn)定的多,以前的1.1.22版本也比較穩(wěn)定,但是在功能及靈活性方面有所欠缺。
squid有一個(gè)主要的配置文件squid.conf,在RedHat環(huán)境下所有squid的配置文件位于/etc/squid子目錄下。
4.1常用的配置選項(xiàng)
因?yàn)槿笔〉呐渲梦募袉?wèn)題,所以我們必須首先修改該配置文件的有關(guān)內(nèi)容,以便讓squid跑起來(lái)。
下面我們來(lái)看一看squid.conf文件的結(jié)構(gòu)以及一些常用的選項(xiàng):
squid.conf配置文件的可以分為十三個(gè)部分,這十三個(gè)部分分別是:
1.NETWORK OPTIONS (有關(guān)的網(wǎng)絡(luò)選項(xiàng))
2.OPTIONS WHICH AFFECT THE NEIGHBOR SELECTION ALGORITHM (作用于鄰居選擇算 法的有關(guān)選項(xiàng))
3.OPTIONS WHICH AFFECT THE CACHE SIZE (定義cache大小的有關(guān)選項(xiàng))
4.LOGFILE PATHNAMES AND CACHE DIRECTORIES (定義日志文件的路徑及cache的目錄)
5.OPTIONS FOR EXTERNAL SUPPORT PROGRAMS (外部支持程序選項(xiàng))
6.OPTIONS FOR TUNING THE CACHE (調(diào)整cache的選項(xiàng))
7.TIMEOUTS (超時(shí))
8.ACCESS CONTROLS (訪問(wèn)控制)
9.ADMINISTRATIVE PARAMETERS (管理參數(shù))
10.OPTIONS FOR THE CACHE REGISTRATION SERVICE (cache注冊(cè)服務(wù)選項(xiàng))
11.HTTPD-ACCELERATOR OPTIONS (HTTPD加速選項(xiàng))
12.MISCELLANEOUS (雜項(xiàng))
13.DELAY POOL PARAMETERS (延時(shí)池參數(shù))
雖然squid的配置文件很龐大,但是如果你只是為一個(gè)中小型網(wǎng)絡(luò)提供代理服務(wù),并且只準(zhǔn)備使用一臺(tái)服務(wù)器,那么,你只需要修改配置文件中的幾個(gè)選項(xiàng)。這些幾個(gè)常用選項(xiàng)分別是:
1.http_port
說(shuō)明:定義squid監(jiān)聽(tīng)HTTP客戶連接請(qǐng)求的端口。缺省是3128,如果使用HTTPD加速模式 則為80。你可以指定多個(gè)端口,但是所有指定的端口都必須在一條命令行上。
2.cache_mem (bytes)
說(shuō)明:該選項(xiàng)用于指定squid可以使用的內(nèi)存的理想值。這部分內(nèi)存被用來(lái)存儲(chǔ)以下對(duì)象 :
In-Transit objects (傳入的對(duì)象)
Hot Objects (熱對(duì)象,即用戶常訪問(wèn)的對(duì)象)
Negative-Cached objects (消極存儲(chǔ)的對(duì)象)
需要注意的是,這并沒(méi)有指明squid所使用的內(nèi)存一定不能超過(guò)該值,其實(shí),該選項(xiàng)只 定義了squid所使用的內(nèi)存的一個(gè)方面,squid還在其他方面使用內(nèi)存。所以squid實(shí)際 使用的內(nèi)存可能超過(guò)該值。缺省值為8MB。
3.cache_dir Directory-Name Mbytes Level-1 Level2
說(shuō)明:指定squid用來(lái)存儲(chǔ)對(duì)象的交換空間的大小及其目錄結(jié)構(gòu)。可以用多個(gè)cache_dir命令來(lái)定義多個(gè)這樣的交換空間,并且這些交換空間可以分布不同的磁盤(pán)分區(qū)。"directory "指明了該交換空間的頂級(jí)目錄。如果你想用整個(gè)磁盤(pán)來(lái)作為交換空間,那么你可以將該目錄作為裝載點(diǎn)將整個(gè)磁盤(pán)mount上去。缺省值為/var/spool/squid。“Mbytes”定義了可用的空間總量。需要注意的是,squid進(jìn)程必須擁有對(duì)該目錄的讀寫(xiě)權(quán)力。“Level-1”是可以在該頂級(jí)目錄下建立的第一級(jí)子目錄的數(shù)目,缺省值為16。同理,“Level-2”是可以建立的第二級(jí)子目錄的數(shù)目,缺省值為256。為什么要定義這么多子目錄呢?這是因?yàn)槿绻幽夸浱伲瑒t存儲(chǔ)在一個(gè)子目錄下的文件數(shù)目將大大增加,這也會(huì)導(dǎo)致系統(tǒng)尋找某一個(gè)文件的時(shí)間大大增加,從而使系統(tǒng)的整體性能急劇降低。所以,為了減少每個(gè)目錄下的文件數(shù)量,我們必須增加所使用的目錄的數(shù)量。如果僅僅使用一級(jí)子目錄則頂級(jí)目錄下的子目錄數(shù)目太大了,所以我們使用兩級(jí)子目錄結(jié)構(gòu)。
那么,怎么來(lái)確定你的系統(tǒng)所需要的子目錄數(shù)目呢?我們可以用下面的公式來(lái)估算。
已知量:
DS = 可用交換空間總量(單位KB)/ 交換空間數(shù)目
OS = 平均每個(gè)對(duì)象的大小= 20k
NO = 平均每個(gè)二級(jí)子目錄所存儲(chǔ)的對(duì)象數(shù)目 = 256
未知量:
L1 = 一級(jí)子目錄的數(shù)量
L2 = 二級(jí)子目錄的數(shù)量
計(jì)算公式:
L1 x L2 = DS / OS / NO
注意這是個(gè)不定方程,可以有多個(gè)解。
4.acl
說(shuō)明:定義訪問(wèn)控制列表。
定義語(yǔ)法為:
acl aclname acltype string1 ...
acl aclname acltype "file" ...
當(dāng)使用文件時(shí),該文件的格式為每行包含一個(gè)條目。
acltype 可以是 src dst srcdomain dstdomain url_pattern urlpath_pattern time port proto method browser user 中的一種。
分別說(shuō)明如下:
src 指明源地址。可以用以下的方法指定:
acl aclname src ip-address/netmask ... (客戶ip地址)
acl aclname src addr1-addr2/netmask ... (地址范圍)
dst 指明目標(biāo)地址。語(yǔ)法為:
acl aclname dst ip-address/netmask ... (即客戶請(qǐng)求的服務(wù)器的ip地址)
srcdomain 指明客戶所屬的域。語(yǔ)法為:
acl aclname srcdomain foo.com ... squid將根據(jù)客戶ip反向查詢DNS。
dstdomain 指明請(qǐng)求服務(wù)器所屬的域。語(yǔ)法為:
acl aclname dstdomain foo.com ... 由客戶請(qǐng)求的URL決定。
注意,如果用戶使用服務(wù)器ip而非完整的域名時(shí),squid將進(jìn)行反向的DNS解析來(lái)確 定其完整域名,如果失敗就記錄為“none”。
time 指明訪問(wèn)時(shí)間。語(yǔ)法如下:
acl aclname time [day-abbrevs] [h1:m1-h2:m2][hh:mm-hh:mm]
day-abbrevs:
S - Sunday
M - Monday
T - Tuesday
W - Wednesday
H - Thursday
F - Friday
A - Saturday
h1:m1 必須小于 h2:m2,表達(dá)示為[hh:mm-hh:mm]。
port 指定訪問(wèn)端口。可以指定多個(gè)端口,比如:
acl aclname port 80 70 21 ...
acl aclname port 0-1024 ... (指定一個(gè)端口范圍)
proto 指定使用協(xié)議。可以指定多個(gè)協(xié)議:
acl aclname proto HTTP FTP ...
method 指定請(qǐng)求方法。比如:
acl aclname method GET POST ...
5.http_access
說(shuō)明:根據(jù)訪問(wèn)控制列表允許或禁止某一類(lèi)用戶訪問(wèn)。
如果某個(gè)訪問(wèn)沒(méi)有相符合的項(xiàng)目,則缺省為應(yīng)用最后一條項(xiàng)目的“非”。比如最后一條為允許,則缺省就是禁止。所以,通常應(yīng)該把最后的條目設(shè)為"deny all" 或 "allow all" 來(lái)避免安全性隱患。
4.2 應(yīng)用實(shí)例
假想情景:某公司用squid作代理服務(wù)器,該代理服務(wù)器配置為PII450/256M/8.4G,公司所用ip段為1.2.3.0/24,并且想用8080作為代理端口。
則相應(yīng)的squid配置選項(xiàng)為:
1.http_port
http_port 8080
2.cache_mem
思路:由于該服務(wù)器只提供代理服務(wù),所以該值可以盡量設(shè)得大一些。
cache_mem 194M
3.cache_dir Directory-Name Mbytes Level-1 Level2
思路:硬盤(pán)為8.4G的,在安裝系統(tǒng)時(shí)應(yīng)該做好規(guī)劃,為不同的文件系統(tǒng)劃分可用空間。在本例中,我們可以這樣來(lái)劃分:
/cache1 3.5G
/cache2 3.5G
/var 400M
swap 127M
/ 剩余部分
并且,在安裝時(shí),我們盡量不安裝不必要的包。這樣在節(jié)約空間的同時(shí)可以提高系統(tǒng)的安全性和穩(wěn)定性。下面我們來(lái)計(jì)算所需的第一級(jí)和第二級(jí)子目錄數(shù)。
已知量:
DS = 可用交換空間總量(單位KB)/ 交換空間數(shù)目=7G/2=3500000KB
OS = 平均每個(gè)對(duì)象的大小= 20k
NO = 平均每個(gè)二級(jí)子目錄所存儲(chǔ)的對(duì)象數(shù)目 = 256
未知量:
L1 = 一級(jí)子目錄的數(shù)量
L2 = 二級(jí)子目錄的數(shù)量
計(jì)算公式:
L1 x L2 = DS / OS / NO=3500000/20/256=684
我們?nèi)?nbsp;
L1=16
L2=43
所以,我們的cache_dir語(yǔ)句為:
cache_dir /cache1 3500M 16 43
cache_dir /cache2 3500M 16 43
4.acl
思路:通過(guò)src來(lái)定義acl.
acl allow_ip src 1.2.3.4/255.255.255.0
5.http_access
http_access allow allow_ip
4.3啟動(dòng)、停止squid。
配置并保存好squid.conf后,可以用以下命令啟動(dòng)squid。
squid
或者,使用RedHat的啟動(dòng)腳本來(lái)啟動(dòng)squid.
/etc/rc.d/init.d/squid start
同樣地,你也可以用下列腳本停止運(yùn)行squid或重啟動(dòng)squid.
/etc/rc.d/init.d/squid stop
/etc/rc.d/init.d/squid restart
五、根據(jù)需求配置你的squid——進(jìn)階篇
5.1其它配置選項(xiàng)
在進(jìn)行squid的一些高級(jí)應(yīng)用之前,我們有必要對(duì)其他有用的配置選項(xiàng)作一個(gè)全面的了解。下面我們分類(lèi)來(lái)講一講這些選項(xiàng),用于某些特殊應(yīng)用的選項(xiàng)我們將放在講該種應(yīng)用時(shí)來(lái)講。
5.1.1網(wǎng)絡(luò)選項(xiàng)
1.tcp_incoming_address
tcp_outgoing_address
udp_incoming_address
udp_outgoing_address
說(shuō)明:
tcp_incoming_address指定監(jiān)聽(tīng)來(lái)自客戶或其他squid代理服務(wù)器的綁定ip地址;
tcp_outgoing_address指定向遠(yuǎn)程服務(wù)器或其他squid代理服務(wù)器發(fā)起連接的ip地址
udp_incoming_address為ICP套接字指定接收來(lái)自其他squid代理服務(wù)器的包的ip地址 udp_outgoing_address為ICP套接字指定向其他squid代理服務(wù)器發(fā)送包的ip地址;
缺省為沒(méi)有綁定任何ip地址。該綁定地址可以用ip指定,也可以用完整的域名指定。
5.1.2交換空間設(shè)定選項(xiàng)
1.cache_swap_low (percent, 0-100)
cache_swap_high (percent, 0-100)
說(shuō)明:squid使用大量的交換空間來(lái)存儲(chǔ)對(duì)象。那么,過(guò)了一定的時(shí)間以后,該交換空間就會(huì)用完,所以還必須定期的按照某種指標(biāo)來(lái)將低于某個(gè)水平線的對(duì)象清除。squid使用所謂的“最近最少使用算法”(LRU)來(lái)做這一工作。當(dāng)已使用的交換空間達(dá)到cache_swap_high時(shí),squid就根據(jù)LRU所計(jì)算的得到每個(gè)對(duì)象的值將低于某個(gè)水平線的對(duì)象清除。這種清除工作一直進(jìn)行直到已用空間達(dá)到cache_swap_low。這兩個(gè)值用百分比表示,如果你所使用的交換空間很大的話,建議你減少這兩個(gè)值得差距,因?yàn)檫@時(shí)一個(gè)百分點(diǎn)就可能是幾百兆空間,這勢(shì)必影響squid的性能。缺省為:
cache_swap_low 90
cache_swap_high 95
2.maximum_object_size
說(shuō)明:大于該值得對(duì)象將不被存儲(chǔ)。如果你想要提高訪問(wèn)速度,就請(qǐng)降低該值;如果你想最大限度地節(jié)約帶寬,降低成本,請(qǐng)?jiān)黾釉撝怠挝粸镵,缺省值為:
maximum_object_size 4096 KB
5.1.3有關(guān)日志的選項(xiàng)
1.cache_access_log
說(shuō)明:指定客戶請(qǐng)求記錄日志的完整路徑(包括文件的名稱(chēng)及所在的目錄),該請(qǐng)求可以是來(lái)自一般用戶的HTTP請(qǐng)求或來(lái)自鄰居的ICP請(qǐng)求。缺省值為:
cache_access_log /var/log/squid/access.log
如果你不需要該日志,可以用以下語(yǔ)句取消:cache_access_log none
2.cache_store_log
說(shuō)明:指定對(duì)象存儲(chǔ)記錄日志的完整路徑(包括文件的名稱(chēng)及所在的目錄)。該記錄表明哪些對(duì)象被寫(xiě)到交換空間,哪些對(duì)象被從交換空間清除。缺省路徑為:
cache_log /var/log/squid/cache.log
如果你不需要該日志,可以用以下語(yǔ)句取消:cache_store_log none
3.cache_log
說(shuō)明:指定squid一般信息日志的完整路徑(包括文件的名稱(chēng)及所在的目錄)。
缺省路徑為:cache_log /var/log/squid/cache.log
4.cache_swap_log
說(shuō)明:該選項(xiàng)指明每個(gè)交換空間的“swap.log”日志的完整路徑(包括文件的名稱(chēng)及所在的目錄)。該日志文件包含了存儲(chǔ)在交換空間里的對(duì)象的元數(shù)據(jù)(metadata)。通常,系統(tǒng)將該文件自動(dòng)保存在第一個(gè)“cache_dir”說(shuō)定義的頂級(jí)目錄里,但是你也可以指定其他的路徑。如果你定義了多個(gè)“cache_dir”,則相應(yīng)的日志文件可能是這樣的:
cache_swap_log.00
cache_swap_log.01
cache_swap_log.02
后面的數(shù)字?jǐn)U展名與指定的多個(gè)“cache_dir”一一對(duì)應(yīng)。
需要注意的是,最好不要?jiǎng)h除這類(lèi)日志文件,否則squid將不能正常工作。
5.pid_filename
說(shuō)明:指定記錄squid進(jìn)程號(hào)的日志的完整路徑(包括文件的名稱(chēng)及所在的目錄)。缺省路徑為
pid_filename /var/run/squid.pid
如果你不需要該文件,可以用以下語(yǔ)句取消:pid_filename none
6.debug_options
說(shuō)明:控制作日志時(shí)記錄信息的多寡。可以從兩個(gè)方面控制:section控制從幾個(gè)方面作記錄;level控制每個(gè)方面的記錄的詳細(xì)程度。推薦的方式(也是缺省方式)是:debug_options ALL,1
即,對(duì)每個(gè)方面都作記錄,但詳細(xì)程度為1(最低)。
7.log_fqdn on|off
說(shuō)明:控制在 access.log 中對(duì)用戶地址的記錄方式。打開(kāi)該選項(xiàng)時(shí),squid記錄客戶的完整域名,取消該選項(xiàng)時(shí),squid記錄客戶的ip地址。注意,如果打開(kāi)該選項(xiàng)會(huì)增加系統(tǒng)的負(fù)擔(dān),因?yàn)閟quid還得進(jìn)行客戶ip的DNS查詢。缺省值為:log_fqdn off
5.1.4有關(guān)外部支持程序的選項(xiàng)
1.ftp_user
說(shuō)明:設(shè)置登錄匿名ftp服務(wù)器時(shí)的提供的電子郵件地址,登錄匿名ftp服務(wù)器時(shí)要求用你的電子郵件地址作為登錄口令(更多的信息請(qǐng)參看本書(shū)的相關(guān)章節(jié))。需要注意的是,有的匿名ftp服務(wù)器對(duì)這一點(diǎn)要求很苛刻,有的甚至?xí)z查你的電子郵件的有效性。缺省值為:ftp_user Squid@
2.ftp_list_width
說(shuō)明:設(shè)置ftp列表的寬度,如果設(shè)得太小將不能的瀏覽到長(zhǎng)文件名。缺省值為: ftp_list_width 32
3.cache_dns_program
說(shuō)明:指定DNS查詢程序的完整路徑(包括文件的名稱(chēng)及所在的目錄)。缺省路徑為:
cache_dns_program /usr/lib/squid/dnsserver
4.dns_children
說(shuō)明:設(shè)置DNS查詢程序的進(jìn)程數(shù)。對(duì)于大型的登錄服務(wù)器系統(tǒng),建議該值至少為10。最大值可以是32,缺省設(shè)置為5個(gè)。注意,如果你任意的降低該值,可能會(huì)使系統(tǒng)性能急劇降低,因?yàn)閟quid主進(jìn)程要等待域名查詢的結(jié)果。沒(méi)有必要減少該值,因?yàn)镈NS查詢進(jìn)程并不會(huì)消耗太多的系統(tǒng)的資源。
5.dns_nameservers
說(shuō)明:指定一個(gè)DNS服務(wù)器列表,強(qiáng)制squid使用該列表中的DNS服務(wù)器而非使用/etc/resolv.conf文件中定義的DNS服務(wù)器。你可以這樣指定多個(gè)DNS服務(wù)器:dns_nameservers 10.0.0.1 192.172.0.4
缺省設(shè)置為:dns_nameservers none
6.unlinkd_program
說(shuō)明:指定文件刪除進(jìn)程的完整路徑。
缺省設(shè)置為:
unlinkd_program /usr/lib/squid/unlinkd
7.pinger_program
說(shuō)明:指定ping進(jìn)程的完整路徑。該進(jìn)程被squid利用來(lái)測(cè)量與其他鄰居的路由距離。該選項(xiàng)只在你啟用了該功能時(shí)有用。缺省為:
pinger_program /usr/lib/squid/pinger
8.authenticate_program
說(shuō)明:指定用來(lái)進(jìn)行用戶認(rèn)證的外部程序的完整路徑。squid的用戶認(rèn)證功能我們將在后面的章節(jié)講述。缺省設(shè)置為不認(rèn)證。
5.1.5用戶訪問(wèn)控制選項(xiàng)
1.request_size (KB)
說(shuō)明:設(shè)置用戶請(qǐng)求通訊量的最大允許值(單位為KB)。如果用戶用POST方法請(qǐng)求時(shí),應(yīng)該設(shè)一個(gè)較大的值。缺省設(shè)置為:
request_size 100 KB
2.reference_age
說(shuō)明:squid根據(jù)對(duì)象的LRU(最近最少使用算法)來(lái)清除對(duì)象,squid依據(jù)使用磁盤(pán)空間的總量動(dòng)態(tài)地計(jì)算對(duì)象的LRU年齡。我們用reference_age定義對(duì)象的最大LRU年齡。如果一個(gè)對(duì)象在指定的reference_age內(nèi)沒(méi)有被訪問(wèn),squid將刪除該對(duì)象。缺省值為一個(gè)月。你可以使用如下所示的時(shí)間表示方法。
1 week
3.5 days
4 months
2.2 hours
3.quick_abort_min (KB)
quick_abort_max (KB)
quick_abort_pct (percent)
說(shuō)明:控制squid是否繼續(xù)傳輸被用戶中斷的請(qǐng)求。當(dāng)用戶中斷請(qǐng)求時(shí),squid將檢測(cè)
quick_abort 的值。如果剩余部分小于“quick_abort_min”指定的值,squid 將繼續(xù)完成剩余部分的傳輸;如果剩余部分大于“quick_abort_max”指定的值,squid 將終止剩余部分的傳輸;如果已完成“quick_abort_pct”指定的百分比,squid將繼續(xù)完成剩余部分的傳輸。缺省的設(shè)置為:
quick_abort_min 16 KB
quick_abort_max 16 KB
quick_abort_pct 95
5.1.6各類(lèi)超時(shí)設(shè)置選項(xiàng)
1.negative_ttl time-units
說(shuō)明:設(shè)置消極存儲(chǔ)對(duì)象的生存時(shí)間。所謂的消極存儲(chǔ)對(duì)象,就是諸如“連接失敗”及"404 Not Found"等一類(lèi)錯(cuò)誤信息。缺省設(shè)置為:negative_ttl 5 minutes
2.positive_dns_ttl time-units
說(shuō)明:設(shè)置緩存成功的DNS查詢結(jié)果的生存時(shí)間。缺省為6小時(shí)。
positive_dns_ttl 6 hours
3.negative_dns_ttl time-units
說(shuō)明:設(shè)置緩存失敗的DNS查詢結(jié)果的生存時(shí)間。缺省為5分鐘。
negative_dns_ttl 5 minutes
4.connect_timeout time-units
說(shuō)明:設(shè)置squid等待連接完成的超時(shí)值。缺省值為2分鐘。
connect_timeout 120 seconds
5.read_timeout time-units
說(shuō)明:如果在指定的時(shí)間內(nèi)squid尚未從被請(qǐng)求的服務(wù)器讀入任何數(shù)據(jù),則squid將終止該客戶請(qǐng)求。缺省值為15分鐘。
read_timeout 15 minutes
6.request_timeout
說(shuō)明:設(shè)置在建立與客戶的連接后,squid將花多長(zhǎng)時(shí)間等待客戶發(fā)出HTTP請(qǐng)求。缺省值為30秒。
request_timeout 30 seconds
7.client_lifetime time-units
說(shuō)明:設(shè)置客戶在與squid建立連接后,可以將該連接保持多長(zhǎng)時(shí)間。
注意,因?yàn)榭蛻艚⒌拿總€(gè)連接都會(huì)消耗一定的系統(tǒng)資源,所以如果你是為一個(gè)大型網(wǎng)絡(luò)提供代理服務(wù)的話,一定要正確地修改該值。因?yàn)槿绻粫r(shí)間的連接數(shù)量太大的話,可能會(huì)消耗大量的系統(tǒng)資源,從而導(dǎo)致服務(wù)器宕機(jī)。缺省值為1天,該值太大了,建議根據(jù)你自己的情況適當(dāng)減小該值。
client_lifetime 1 day
8.half_closed_clients on/off
說(shuō)明:有時(shí)候由于用戶的不正常操作,可能會(huì)使與squid的TCP連接處于半關(guān)閉狀態(tài),
這時(shí)候,該TCP連接的發(fā)送端已經(jīng)關(guān)閉,而接收端正常工作。缺省地,squid將一直保持這種處于半關(guān)閉狀態(tài)的TCP連接,直到返回套接字的讀寫(xiě)錯(cuò)誤才將其關(guān)閉。如果將該值設(shè)為off,則一旦從客戶端返回“no more data to read”的信息,squid就立即關(guān)閉該連接。half_closed_clients on
9.pconn_timeout
說(shuō)明:設(shè)置squid在與其他服務(wù)器和代理建立連接后,該連接閑置多長(zhǎng)時(shí)間后被關(guān)閉。缺省值為120秒。
pconn_timeout 120 seconds
10.ident_timeout
說(shuō)明:設(shè)置squid等待用戶認(rèn)證請(qǐng)求的時(shí)間。缺省值為10秒。
ident_timeout 10 seconds
11.shutdown_lifetime time-units
說(shuō)明:當(dāng)收到SIGTERM 或者 SIGHUP 信號(hào)后, squid將進(jìn)入一種shutdown pending的模式,等待所有活動(dòng)的套接字關(guān)閉。在過(guò)了shutdown_lifetime所定義的時(shí)間后,所有活動(dòng)的用戶都將收到一個(gè)超時(shí)信息。缺省值為30秒。
shutdown_lifetime 30 seconds
5.1.7管理參數(shù)選項(xiàng)
1.cache_mgr
說(shuō)明:設(shè)置管理員郵件地址。缺省為:
cache_mgr root
2. cache_effective_user
cache_effective_group
說(shuō)明:如果用root啟動(dòng)squid,squid將變成這兩條語(yǔ)句指定的用戶和用戶組。缺省變?yōu)閟quid用戶和squid用戶組。注意這里指定的用戶和用戶組必須真是存在于/etc/passwd中。如果用非root帳號(hào)啟動(dòng)squid,則squid將保持改用戶及用戶組運(yùn)行,這時(shí)候,你不能指定小于1024地http_port。
cache_effective_user squid
cache_effective_group squid
3.visible_hostname
說(shuō)明:定義在返回給用戶的出錯(cuò)信息中的主機(jī)名。
如: visible_hostname www-cache.foo.org
4.unique_hostname
說(shuō)明:如果你有一個(gè)代理服務(wù)器陣列,并且你為每個(gè)代理服務(wù)器指定了同樣的“visible_hostname”,同時(shí)你必須為它們指定不同的“unique_hostname”來(lái)避免“forwarding loops ”(傳輸循環(huán))發(fā)生。
5.1.8其它雜項(xiàng)
1. dns_testnames
說(shuō)明:設(shè)置進(jìn)行DNS查詢測(cè)試,如果第一個(gè)站點(diǎn)解析成功則立即結(jié)束DNS查詢測(cè)試。如果你不愿意進(jìn)行DNS查詢測(cè)試,就不要去掉缺省的設(shè)置。
#dns_testnames netscape.com internic.net nlanr.net microsoft.com
2.logfile_rotate
說(shuō)明:通常,squid會(huì)定期的將日志文件更名并打包。比如正在使用的日志文件為access.log,squid會(huì)將其更名并打包為access.log.1.gz;過(guò)了一定時(shí)間后,squid又會(huì)將
access.log.1.gz更名為access.log.2.gz并將當(dāng)前的日志文件更名并打包為access.log.1.gz,以此循環(huán)。logfile_rotate所指定的數(shù)字即為打包并備份的文件的數(shù)量,當(dāng)達(dá)到這一數(shù)目時(shí),squid將刪除最老的備份文件。缺省值為10。如果你想手動(dòng)來(lái)進(jìn)行這些操作,你可以用logfile_rotate 0來(lái)取消自動(dòng)操作。
3.err_html_text
說(shuō)明:用該語(yǔ)句定義一個(gè)字符串變量,可以用%L在返回給用戶的錯(cuò)誤信息文件中引用。錯(cuò)誤信息文件通常在/etc/squid/errors目錄中,這是一些用HTML寫(xiě)成的腳本文件,你可以自己修改它。
4.deny_info
說(shuō)明:你可以定制自定義的拒絕訪問(wèn)信息文件,并且可以和不同的用戶列表相關(guān)聯(lián)。當(dāng)用戶被http_access相關(guān)規(guī)則拒絕時(shí),squid可以向用戶顯示你自定義的相應(yīng)的拒絕訪問(wèn)信息文件。語(yǔ)法為:
Usage: deny_info err_page_name acl
比如:
deny_info ERR_CUSTOM_ACCESS_DENIED bad_guys
5.memory_pools on|off
說(shuō)明:如果你將該項(xiàng)設(shè)為on,則squid將保留所有已經(jīng)分配(但是未使用)的內(nèi)存池以便在將來(lái)使用。缺省為on.
memory_pools on
6.log_icp_queries on|off
說(shuō)明:設(shè)置是否對(duì)ICP請(qǐng)求作日志。如果你的系統(tǒng)負(fù)載很大,你可以用off來(lái)取消該功能。缺省為:
log_icp_queries on
7.always_direct
說(shuō)明:該選項(xiàng)允許你指定某些用戶類(lèi),squid將這些用戶類(lèi)的請(qǐng)求直接轉(zhuǎn)發(fā)給被請(qǐng)求的服務(wù)器。語(yǔ)法為:
always_direct allow|deny [!]aclname ...
如:直接轉(zhuǎn)發(fā)FTP請(qǐng)求可以這樣設(shè)置:
acl FTP proto FTP
always_direct allow FTP
8.never_direct
說(shuō)明:與always_direct相反。語(yǔ)法為:
Usage: never_direct allow|deny [!]aclname ...
比如,為了強(qiáng)制除了本地域的其他用戶使用代理服務(wù)器,你可以這樣設(shè)置:
acl local-servers dstdomain foo.net
acl all src 0.0.0.0/0.0.0.0
never_direct deny local-servers
never_direct allow all
9.icon_directory
說(shuō)明:指明向用戶傳送錯(cuò)誤信息時(shí)所用到的圖標(biāo)文件的目錄。缺省路徑為: icon_directory /usr/lib/squid/icons
10.error_directory
說(shuō)明:指明向用戶傳送錯(cuò)誤信息所用到的錯(cuò)誤描述文件的目錄。缺省路徑為:
error_directory /etc/squid/errors
5.2 用戶認(rèn)證設(shè)置
缺省的,squid本身不帶任何認(rèn)證程序,但是我們可以通過(guò)外部認(rèn)證程序來(lái)實(shí)現(xiàn)用戶認(rèn)證。一般說(shuō)來(lái)有以下的認(rèn)證程序:
1.LDAP認(rèn)證:你可以訪問(wèn)以下資源來(lái)獲取更多的有用信息。
http://www.geocities.com/ResearchTriangle/Thinktank/5292/projects/ldap/
http://home.iae.nl/users/devet/squid/proxy_auth/contrib/ldap_auth.tar.gz
2.SMB認(rèn)證:可以實(shí)現(xiàn)基于NT和samba的用戶認(rèn)證。更多的信息請(qǐng)?jiān)L問(wèn)以下資源。
http://www.hacom.nl/~richard/software/smb_auth.html
3.基于mysql的用戶認(rèn)證。
http://home.iae.nl/users/devet/squid/proxy_auth/contrib/mysql_auth.c
4.基于sock5密碼用戶認(rèn)證。
http://nucleo.freeservers.com/
5.基于Radius 的用戶認(rèn)證。
http://home.iae.nl/users/devet/squid/proxy_auth/contrib/auth.pl
但是我們一般常用的是用ncsa實(shí)現(xiàn)的認(rèn)證和用smb_auth實(shí)現(xiàn)的基于NT和samba的用戶認(rèn)證。下面我們就來(lái)講這兩種認(rèn)證方法的具體實(shí)現(xiàn)。
5.2.1 ncsa用戶認(rèn)證的實(shí)現(xiàn)
ncsa是squid源代碼包自帶的認(rèn)證程序之一,下面我們以squid-2.3.STABLE2版本為例講述ncsa的安裝和配置。
1.從www.squid-cache.org下載squid源代碼包squid-2.3.STABLE2-src.tar.gz并放到/tmp目錄下。
2.用tar解開(kāi):
tar xvzf squid-2.3.STABLE2-src.tar.gz
%make
%make install
3.然后,進(jìn)入/tmp/squid-2.3.STABLE2/auth_modules/NCSA目錄。
% make
% make install
編譯成功后,會(huì)生成ncsa_auth的可執(zhí)行文件。
4.拷貝生成的執(zhí)行文件ncsa_auth到/usr/bin目錄
cp ncsa_auth /usr/bin/bin
5.修改squid.conf中的相關(guān)選項(xiàng)如下所示:
authenticate_program /usr/local/squid/bin/ncsa_auth /usr/bin/passwd
6.定義相關(guān)的用戶類(lèi)
acl auth_user proxy_auth REQUIRED
注意,REQUIRED關(guān)鍵字指明了接收所有合法用戶的訪問(wèn)。
7.設(shè)置http_access
http_access allow auth_user
注意,如果你在改行中指定了多個(gè)允許訪問(wèn)的用戶類(lèi)的話,應(yīng)該把要認(rèn)證的用戶類(lèi)放在第一個(gè)。如下所示:
錯(cuò)誤的配置:http_access allow auth_user all manager
正確的配置:http_access allow auth_user manager all
8.利用apache攜帶的工具軟件htpasswd在/usr/local/squid/etc下生成密碼文件并添加相應(yīng)的用戶信息。一般說(shuō)來(lái),該密碼文件每行包含一個(gè)用戶的用戶信息,即用戶名和密碼。
用htpasswd生成密碼文件passwd并添加用戶bye。
htpasswd -c /usr/local/squid/etc/passwd bye
然后重新啟動(dòng)squid,密碼認(rèn)證已經(jīng)生效。
5.2.2 smb用戶認(rèn)證的實(shí)現(xiàn)
國(guó)內(nèi)介紹并使用ncsa實(shí)現(xiàn)用戶認(rèn)證的文章不多,而使用smb_auth和samba實(shí)現(xiàn)基于NT的用戶認(rèn)證我還沒(méi)有看到過(guò),下面我們就來(lái)看一看在squid中實(shí)現(xiàn)基于NT的用戶認(rèn)證。
當(dāng)前smb_auth的最高版本是smb_auth-0.05,你可以在以下地址下載。當(dāng)然,squid的源代碼包中也包含smb_auth,但是是0.02版的。
http://www.hacom.nl/~richard/software/smb_auth-0.05.tar.gz
smb_auth的主頁(yè)地址是http://www.hacom.nl/~richard/software/smb_auth.html。
1.系統(tǒng)需求:
squid2.0以上版本。
安裝samba2.0.4以上版本。你并不需要運(yùn)行samba服務(wù),因?yàn)閟mb_auth只用到了 samba的客戶端軟件。
2.下載smb_auth-0.05.tar.gz并復(fù)制到/tmp.
3.tar xvzf smb_auth-0.05.tar.gz
4.根據(jù)你的要求修改Makefile中的SAMBAPREFIX和INSTALLBIN參數(shù)。SAMBAPREFIX指定了你的samba安裝路徑,INSTALLBIN指明了smb_auth的安裝路徑。我們指定:
SAMBAPREFIX=/usr,INSTALLBIN=/usr/bin.
5.make
6.make install,成功后會(huì)在INSTALLBIN指定路徑中生成可執(zhí)行文件smb_auth.
7.按下列步驟設(shè)置你要用于認(rèn)證的主域控制器:
首先在NETLOG共享目錄中建立一個(gè)“proxy”文件,該文件只包含一個(gè)“allow”的字符串,一般說(shuō)來(lái),該NETLOG目錄位于winntsystem32Replimportscripts目錄中;然后,設(shè)置所有你想讓其訪問(wèn)squid的用戶和用戶組擁有對(duì)該文件的讀的權(quán)力。
8.修改squid.conf中的相關(guān)選項(xiàng)如下所示:
authenticate_program /usr/local/squid/bin/smb_auth your_domain_name
9.定義相關(guān)的用戶類(lèi)
acl auth_user proxy_auth REQUIRED
注意,REQUIRED關(guān)鍵字指明了接收所有合法用戶的訪問(wèn)。
10.設(shè)置http_access
http_access allow auth_user
注意,如果你在改行中指定了多個(gè)允許訪問(wèn)的用戶類(lèi)的話,應(yīng)該把要認(rèn)證的用戶類(lèi)放在第一個(gè)。如下所示:
錯(cuò)誤的配置:http_access allow auth_user all manager
正確的配置:http_access allow auth_user manager all
如果一切正確的話,然后重新啟動(dòng)squid,密碼認(rèn)證已經(jīng)生效。
說(shuō)明:smb_auth的調(diào)用方法:
1.smb_auth -W your_domain_name
用your_domain_name指定你的域名。smb_auth將進(jìn)行廣播尋找該主域控制器。
2.smb_auth -W your_domain_name -B
如果你有多個(gè)網(wǎng)絡(luò)接口,可以用-B 指定用于廣播的網(wǎng)絡(luò)接口的ip地址。
3.smb_auth -W your_domain_name -U
也可以用-U直接指定該主域控制器的ip地址。
4.smb_auth -W your_domain_name -S share
可以用-S指定一個(gè)不同于NETLOG的共享目錄。
5.2.3 squid.conf中關(guān)于認(rèn)證的其他設(shè)置
1.authenticate_children
說(shuō)明:設(shè)置認(rèn)證子進(jìn)程的數(shù)目。缺省為5個(gè)。如果你處于一個(gè)繁忙的網(wǎng)絡(luò)環(huán)境中,你可以適當(dāng)增大該值。
2.authenticate_ttl
說(shuō)明:設(shè)置一次認(rèn)證的有效期,缺省是3600秒。
3.proxy_auth_realm
說(shuō)明:設(shè)置用戶登錄認(rèn)證時(shí)向用戶顯示的域名。
5.3透明代理的設(shè)置
關(guān)于透明代理的概念我們已經(jīng)在第一節(jié)將過(guò)了,下面我們看一下怎么樣在squid中實(shí)現(xiàn)透明代理。
透明代理的實(shí)現(xiàn)需要在Linux 2.0.29以上,但是Linux 2.0.30并不支持該功能,好在我們現(xiàn)在使用的通常是2.2.X以上的版本,所以不必?fù)?dān)心這個(gè)問(wèn)題。下面我們就用ipchains+squid來(lái)實(shí)現(xiàn)透明代理。在開(kāi)始之前需要說(shuō)明的是,目前我們只能實(shí)現(xiàn)支持HTTP的透明代理,但是也不必太擔(dān)心,因?yàn)槲覀冎允褂么恚康氖抢胹quid的緩存來(lái)提高Web的訪問(wèn)速度,至于提供內(nèi)部非法ip地址的訪問(wèn)及提高網(wǎng)絡(luò)安全性,我們可以用ipchains來(lái)解決。
實(shí)現(xiàn)環(huán)境:RedHat6.x+squid2.2.x+ipchains
5.3.1 linux的相關(guān)配置
確定你的內(nèi)核已經(jīng)配置了以下特性:
[*] Network firewalls
[ ] Socket Filtering
[*] Unix domain sockets
[*] TCP/IP networking
[ ] IP: multicasting
[ ] IP: advanced router
[ ] IP: kernel level autoconfiguration
[*] IP: firewalling
[ ] IP: firewall packet netlink device
[*] IP: always defragment (required for masquerading)
[*] IP: transparent proxy support
如果沒(méi)有,請(qǐng)你重新編譯內(nèi)核。一般在RedHat6.x以上,系統(tǒng)已經(jīng)缺省配置了這些特性。
5.3.2squid的相關(guān)配置選項(xiàng)
設(shè)置squid.conf中的相關(guān)選項(xiàng),如下所示:
http_port 3218
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
說(shuō)明:
1.http_port 3128
在本例中,我們假設(shè)squid的HTTP監(jiān)聽(tīng)端口為3128,即squid缺省設(shè)置值。然后,把所有來(lái)自于客戶端web請(qǐng)求的包(即目標(biāo)端口為80)重定向到3128端口。
2.httpd_accel_host virtual
httpd_accel_port 80
這兩個(gè)選項(xiàng)本來(lái)是用來(lái)定義squid加速模式的。在這里我們用virtual來(lái)指定為虛擬主機(jī)模式。80端口為要加速的請(qǐng)求端口。采用這種模式時(shí),squid就取消了緩存及ICP功能,假如你需要這些功能,這必須設(shè)置httpd_accel_with_proxy選項(xiàng)。
3.httpd_accel_with_proxy on
該選項(xiàng)在透明代理模式下是必須設(shè)置成on的。在該模式下,squid既是web請(qǐng)求的加速器,又是緩存代理服務(wù)器。
4.httpd_accel_uses_host_header on
在透明代理模式下,如果你想讓你代理服務(wù)器的緩存功能正確工作的話,你必須將該選項(xiàng)設(shè)為on。設(shè)為on時(shí),squid會(huì)把存儲(chǔ)的對(duì)象加上主機(jī)名而不是ip地址作為索引。這一點(diǎn)在你想建立代理服務(wù)器陣列時(shí)顯得尤為重要。
5.3.3 ipchains的相關(guān)配置
ipchains在這里所起的作用是端口重定向。我們可以使用下列語(yǔ)句實(shí)現(xiàn)將目標(biāo)端口為80端口的TCP包重定向到3128端口。
#接收所有的回送包
/sbin/ipchains -A input -j ACCEPT -i lo
#將目標(biāo)端口為80端口的TCP包重定向到3128端口
/sbin/ipchains -A input -p tcp -d 0.0.0.0/0 80 -j REDIRECT 80
當(dāng)然在這以前,我們必須用下面的語(yǔ)句打開(kāi)包轉(zhuǎn)發(fā)功能。
echo 1 > /proc/sys/net/ipv4/ip_forward
小節(jié)
開(kāi)始,我們討論了代理服務(wù)器的概念,代理服務(wù)器的分類(lèi);然后,我們把注意力集中在squid,講述了如何安裝和配置squid;最后我們講了一些squid配置中的高級(jí)話題,即實(shí)現(xiàn)用戶認(rèn)證的兩種方法,透明代理的實(shí)現(xiàn)等。當(dāng)然,還有一些高級(jí)話題本章沒(méi)有講到,如代理陣列的實(shí)現(xiàn),加速模式的運(yùn)用等等。但是,我們不可能把所有東西都講完講全,希望讀者能舉一反三,自己去摸索,去嘗試。