一、什麼是代理伺服器?下面通過這個例子來認識:

(1)ClientA發出資源請求,根據用戶端上的代理服務配置設定,将請求發送到代理伺服器。
(2)然後由代理伺服器代表用戶端送出請求,假如代理伺服器将請求發給了一個web主機
(3)Web主機将資源返還給代理伺服器
(4)代理伺服器将資源返還給用戶端,并将内容存儲在緩存中
(5)ClientB請求與ClientA相同的資源,和ClientA一樣,也會将請求發送到代理伺服器
(6)代理伺服器已有該資源内容,是以代理伺服器直接将資源内容發送給用戶端ClientB。
由此可以看出,代理伺服器是介于浏覽器和Web伺服器之間的一台伺服器,當你通過代理伺服器上網浏覽時,浏覽器不是直接到Web伺服器去取回網頁而是向代理伺服器送出請求,由代理伺服器來取回浏覽器所需要的資訊并傳送給你的浏覽器。 而且,大部分代理伺服器都具有緩沖的功能,就好象一個大的Cache,它有很大的存儲空間,它不斷将新取得資料儲存到它本機的存儲器上,如果浏覽器所請求的資料在它本機的存儲器上已經存在而且是最新的,那麼它就不重新從Web伺服器取資料,而直接将存儲器上的資料傳送給使用者的浏覽器,這樣就能顯著提高浏覽速度和效率。
二、代理伺服器的功能
代理伺服器的功能不止是可以進行緩存,還有很多其他的功能:
(1)連接配接Internet與Intranet 充當firewall(防火牆):因為所有内部網的使用者通過代理伺服器通路外界時,隻映射為一個IP位址,是以外界不能直接通路到内部網;同時可以設定 IP位址過濾,限制内部網對外部的通路權限;另外,兩個沒有互聯的内部網,也可以通過第三方的代理伺服器進行互聯來交換資訊。
(2)設定使用者驗證和記賬功能,可按使用者進行記賬,沒有登記的使用者無權通過代理伺服器通路internet,并對使用者的通路時間、通路地點、資訊流量進行統計。
(3)對使用者進行分級管理,設定不同使用者的通路權限,對外界或内部的ip位址進行過濾,設定不同的通路權限。
(4)節省ip開銷,代理伺服器允許使用大量的僞ip位址,如果使用區域網路就介入internet,要位區域網路内的每台主機都申請一個ip,其費用可想而知,但是使用代理伺服器後,隻需代理伺服器有一個合法的ip位址,LAN内其他使用者可以使用私有的ip位址,這樣可以節約大量的ip,降低成本。
三、代理伺服器的分類
(1)标準代理伺服器
這種方式必須在每一個用戶端明确指定代理伺服器的ip位址、端口号。
(2)透明代理伺服器
代理操作對用戶端來說是透明的,即不必指明代理伺服器的ip和端口
(1)(2)這兩種伺服器的區分很讓人頭疼,下面就通過兩個小例子,來看這兩種代理伺服器的區分:
标準代理伺服器
當我們在用戶端浏覽器中打開一個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的角度看來,連接配接是在代理伺服器1037端口和202.99.11.120的80端口之間建立的。從client的角度看來,連接配接是在192.168.1.100的1025端口和代理伺服器的8080端口之間建立的。
‚透明代理伺服器
當我們在用戶端浏覽器中打開一個web請求,比如“http://www.linuxaid.com.cn”,這時将陸續發生以下事件:
<1>.用戶端向DNS請求“www.linuxaid.com.cn”,得到相應的IP位址202.99.11.120。然後,用戶端使用某一端口(比如1066)向該IP位址的80端口發起web連接配接請求,請求web頁面。
<2>.當該請求包通過透明代理伺服器時,被重定向到代理伺服器的綁定端口8080。于是,透明代理伺服器用某一端口(比如1088)向202.99.11.120的80端口發起web連接配接請求,請求web頁面。
<4>.用戶端浏覽器顯示該頁面。
從www.linuxaid.com.cn的角度看來,連接配接是在代理伺服器1088端口和202.99.11.120的80端口之間建立的。從client的角度看來,連接配接是在192.168.1.100的1066端口和202.99.11.120的80端口之間建立的。
(3)反向代理伺服器
反向代理伺服器時和前兩種完全不同的一種代理服務,反向代理伺服器位于internet和本地伺服器之間,如果internet上的使用者想要通路本地伺服器,則先要通過這個反向代理伺服器,如果使用者請求的資料在代理伺服器上有緩存,代理伺服器直接将緩存發送給使用者,如果沒有緩存,要現象本地的伺服器送出請求,取回資料,進行緩存後再發送給使用者。反向代理伺服器對外表現為一個web伺服器,外部網絡簡直就可以将它當做一個web伺服器而不需要特定的配置,不同之處在于這個web伺服器沒有儲存任何的真實資料,所有的真實的資料都儲存在内部的web伺服器上。是以對反向代理伺服器的攻擊不會使網頁的信心遭到破壞,這就增強了web伺服器的安全性。反向代理方式和包過濾方式或标準代理方式并沒有沖突,是以可以在防火牆裝置中同時使用這幾種方式,其中反向代理用于外部網路通路内部網絡時使用,正向代理或包過濾用于拒絕外部通路方式并提供内部網路對外部網絡的通路的能力,是以可以結合這些方式提供最佳的安全的通路方式。
四、實驗
1、實驗裝置:虛拟機裡面的兩台主機,linux主機充當代理伺服器,windows server 2003充當客戶機。
實驗準備:linux有兩塊網卡,eth1連接配接外網,選擇網橋連接配接方式(我主機的ip:192.168.0.102 子網路遮罩:255.255.255.0 網關:192.168.0.1,DNS是192.168.0.1)設定ip位址192.168.0.104,必須指定網關192.168.0.1,子網路遮罩255.255.255.0,DNS192.168.0.1,如此就可以和主機一樣連接配接外網;eth0網卡連接配接内網,ip位址是192.168.93.186,子網路遮罩255.255.255.0,windows 2003的ip位址是192.168.93.195,子網路遮罩255.255.255.0(不必配置dns,因為是交給代理伺服器來處理),都選擇host-only連接配接方式。
2、安裝squid
yum -y install squid.i*
3、安裝好之後就可以進行啟動了:
[root@localhost ~]# service squid start
init_cache_dir /var/spool/squid... 啟動 squid:. [确定]
4、"init_cache_dir /var/spool/squid... 啟動 squid:"在剛一開始啟動的時候會看到這樣的一句話,這是初始化緩存目錄,在硬碟上面會有這樣的一個目錄:
/var/spool/squid,專門用來存放那些緩存。進入到這個目錄裡面去:cd /var/spool/squid;[root@localhost squid]# ll,會看到以下内容:
drwxr-x--- 258 squid squid 4096 10-31 04:26 00
drwxr-x--- 258 squid squid 4096 10-31 04:26 01
drwxr-x--- 258 squid squid 4096 10-31 04:26 02
drwxr-x--- 258 squid squid 4096 10-31 04:26 03
drwxr-x--- 258 squid squid 4096 10-31 04:26 04
drwxr-x--- 258 squid squid 4096 10-31 04:26 05
drwxr-x--- 258 squid squid 4096 10-31 04:26 06
drwxr-x--- 258 squid squid 4096 10-31 04:26 07
drwxr-x--- 258 squid squid 4096 10-31 04:26 08
drwxr-x--- 258 squid squid 4096 10-31 04:26 09
drwxr-x--- 258 squid squid 4096 10-31 04:26 0A
drwxr-x--- 258 squid squid 4096 10-31 04:26 0B
drwxr-x--- 258 squid squid 4096 10-31 04:26 0C
drwxr-x--- 258 squid squid 4096 10-31 04:26 0D
drwxr-x--- 258 squid squid 4096 10-31 04:26 0E
drwxr-x--- 258 squid squid 4096 10-31 04:26 0F
-rw-r----- 1 squid squid 48 10-31 04:26 swap.state
這一共是十六個目錄,每個目錄又分為256個小目錄,分别放置不同的檔案類型。
5、檢視squid的端口:
[root@localhost squid]# netstat -tupln |grep squid
tcp 0 0 0.0.0.0:3128 0.0.0.0:* LISTEN 20
說明安裝成功,這時候是按照預設的配置來工作的,要讓squid按照我們意願來工作,還要對squid進行相應的配置才可以。
6、檢視squid的配置檔案:
rpm -ql squid |less //可以看到生成了很多的檔案
7、編輯squid的主配置檔案:
vim /etc/squid/squid.conf
進入這個檔案後會發現這個檔案很大,有四千多行,其實有用的需要我們進行配置的也就幾十行,其他的都是注釋,為了友善,我使用下面的過濾的指令将這些注釋行去掉:
grep -v "^#" /etc/squid/squid.conf |grep -v "^$"
執行這個指令後,可以看到主要有下面的内容:
acl all src 0.0.0.0/0.0.0.0 //這裡表示是任意ip任意掩碼,就是any,all元素就是表示所有的主機。
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT //上面的acl是定義元素,賦予值比如端口号ip位址等,然後下面根 據這個元素來操作這些值,一個元素可以賦多個值。http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all //通過http_access來寫政策以達到控制的目的,要用到上面的元素,這句中的all就是上面定義的所有的主機,這裡表示拒絕所有主機通路代理伺服器,這是預設值,一般的都會是拒絕所有。
icp_access allow all
http_port 3128 //代理伺服器的端口,為了安全最好在前面加上内網位址
hierarchy_stoplist cgi-bin ?
access_log /var/log/squid/access.log squid
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
coredump_dir /var/spool/squid
8、現在我先對配置檔案不做任何改動,打開一台客戶機進行測試
這裡是标準的代理伺服器,是以要在windows server 2003中進行設定,指定對應的代理伺服器和端口,打開IE:
工具->internet選項->連接配接->區域網路設定->代理伺服器,如圖
9、在浏覽器中輸入:http://www.baidu.com
會看到被拒絕通路,并且傳回這樣的語句:
原來squid的預設值是拒絕所有,是以才被拒絕通路,編輯配置檔案:
vim /etc/squid/squid.conf,找到下面一行:
637 http_access deny all
隻需在這一行前面加上一行:
http_access allow all
重新開機squid,再次通路百度,就可以通路了!
10、可以通過檢視日志來看這次通路的詳細:cd /var/log/squid/
[root@localhost squid]# ls
access.log cache.log squid.out store.log
其中的access.log就是通路通過的日志:
[root@localhost squid]# tail -f access.log
可以看到記錄的一些關于這次通路的資訊,這是第一次通路,仔細看日志記錄的内容隻是有一些tcp、http的連接配接,找不到HIT标示。
我們再次通路百度,檢視日志會發現很多HIT标示,這是通路命中的标示,為什麼會這樣呢?很簡單,就是因為我們剛才已經通路過百度了,代理伺服器已經做過緩存,是以當再次通路的時候代理伺服器直接從緩存中拿出來給我們,也就出現通路命中的标示,這正是代理伺服器功能的展現。
11、上面我們雖然通路成功了,但隻是進行了極小的配置,下面就看一下還需要進行的配置:
http_port 8080 //使用8080作為代理伺服器端口,squid預設是使用3128,隻是目前比較流行使用8080,可以通過多個http_pot參數來指定多個端口,可以在端口前面加上ip位址,做的這個執行個體:http_port 192.168.93.186:3128
dns_nameserver //指定dns伺服器
visible_hostname //指定主機名,當通路出錯時傳回給用戶端頁面包含的名字
cache_dir ufs /var/spool/squid 8000 16 256 //定義緩存機制,緩存目錄
cache_mem 1000MB //定義高速緩存,是指使用多收記憶體來充當緩存
acl lanclient src 192.168.93.0/24
http_access allow lanclient //以上這兩項定義可提供代理服務功能的網絡,squid預設隻為localhost提供代理服務
通過這些參數的設定,重新啟動squid,一個最基本的标準代理伺服器就配置完成了!
五、通路控制清單
1、通路控制元素
ACL元素是Squid的通路控制基礎,ACL指定包括ip位址、端口号、主機名和URL比對等變量,ACL的文法如下:acl name type value1 value2 ...,可以對一個acl列舉多個值。
ACL可用元素有很多,常用的有:
src:通過比對源ip位址限制通路;
dst:通過比對目的ip進行通路
time:通過時間限制通路,分别用SMTWHFA表示周一到周六,D表示周一到周五;
maxconn:通過來自客戶ip位址的最大同時連接配接數來限制通路;url_regex:通過比對url正規表達式來限制通路;
urlpath_regex:和url_regex類似,可以檢測某些檔案類型
2、通路控制規則
ACL元素是建立通路控制的第一步,第二部是通路控制規則,用來允許和拒絕某些動作,如果有多個動作需注意先後順序,因為squid總是找到第一個來執行:規則動作 allow|deny ACLname ...
常用的通路控制規則有一下幾種:
http_access:決定哪些使用者的通路被允許和拒絕
no_cach:被拒絕的内容将不被緩存
reply_body_ max_size:限制http相應主題的最大接受size
Squid預設情況下會通過以下的配置拒絕所有用戶端(除localhost)的通路,是以在使用的時候最好将通路控制清單放在以下的控制之前而不是删掉:http_access allow localhost http_access deny all
3、通路控制清單執行個體
#禁止Squid相應ip位址為192.168.93.100用戶端的請求#
acl badclientip1 src 192.168.93.100
http_access deny badclienttip1
#禁止Squid相應192.168.93.0/24子網所有用戶端周一到周五的9:00到18:00的請求#
acl clientnet1 src 192.168.93.0/24
acl worktime WTWHF 9:00-18:00
http_access deny clientnet1 worktime
#限制ip位址為192.168.93.200的用戶端的并發最大連接配接數是5#
acl clientip1 src 192.168.93.200
acl conn5 macconn 5
http_access deny clientlip1 conn5
#限制Squid響應用戶端下載下傳*.mp3、*.exe、*.zip的檔案#
acl badfiles urlpath_regex -i \.mp3$ \.exe$ \.zip$
http_access deny badfiles
#禁止用戶端通過Squid通路210.21.118.1#
acl badsrvipl dst 210.21.118.1
http_access deny badsrvipl
以上這些實驗都可以做通,這裡就不再贅述。
六、多種使用者認證方式
在管理方面可能不僅隻是限于某些網站不能通路,還有一個常用的方法是必須有合法的使用者名和密碼,squid才相應用戶端的請求。
使用本機檔案的使用者及密碼驗證方式:
使用htpasswd指令(要安裝了apapche才可以用該指令)生成一個新的使用者名及密碼檔案,過程如下:
1、安裝apache(為了使用htpasswd)
Yum -y install httpd.i*
2、使用httd指令生成一個使用者及密碼檔案,在本章中該檔案位于/etc/squid/中目錄名為.puser,并且建立一個使用者user1,密碼123:
[root@localhost squid]# htpasswd -cm /etc/squid/.puser user1
New password:
Re-type new password:
Adding password for user user1
3、切換到squid主目錄中vim /etc/squid/squid.conf,添加如下的内容:
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/.puser //使用ncsa_auth讀取.puser内容
auth_param basic children 10 //使用十輔助程序用于身份驗證,預設是5,如果指定過少的程序,squid會在/var/log/squid/cache.log中報警
auth_param basic realm "input username&passwd" //提示
auth_param basic credentialsttl 1 hour//身份驗證結果緩存時間
acl authuser proxy_auth REQUIREO //定義一個acl
http_access allow authuser //通路政策,注意這個語句的位置
4、檢查文法squid -k parse
5、重新啟動
[root@localhost squid]# service squid restart
停止 squid:. [确定] 啟動 squid:. [确定]
6、在windows 2003 進行通路,輸入http://www.baidu.com得到結果如下
輸入使用者名user1和密碼123,就可以通路到了!