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