序言:衆所周知,現代互聯網上大多數的的門戶網站使用較多的Web服務器架構是基於CDN(內容分發網絡)開發的。那什麼是CDN呢?我們通過下面這張圖來簡單瞭解一下:
CND架構下,各個地區的IDC機房裏最重要的設施就是代理服務器和智能DNS解析,而最常用的代理服務器就是Squid,其最重要的功能就是緩存功能。在Windows上使用較多的代理服務器如:WinGate、SyGate、WinRoute、Proxy(現已發展成爲ISA防火牆);Linux上的使用較多的代理服務器就是Squid.
【Squid & NAT】
網絡中大部分應用都是支持NAT的,NAT轉換是工作在網絡層的,可以基於網絡層的來源地址和目的地址進行轉換;也可以基於傳輸層的協議(tcp/udp)和端口(來源端口、目的端口)進行NAT。Squid代理服務器,因其功能也稱作代理服務器防火牆。quid只支持少量的應用,支持web上的http、ftp代理,郵件上的smtp、pop3、imap的代理。但其安全性確實非常高的,不僅可以基於網絡成的來源地址和目的地址進行代理,還可以基於傳輸層的協議(tcp/udp)和端口(來源端口、目的端口)進行代理服務,最重要就是Squid可以基於應用層的賬號、內容、域名等進行代理,這是NAT所做不到的,這也是Squid的最大優勢所在。
我們來通過幾張圖來簡單看一下NAT和Squid的工作機制:
【NAT的工作機制】
當內網用戶訪問Internet時,在網絡出口路由器上進行SNAT,在進行SNAT時,因爲內網的私有IP在Internet上是不能傳輸的,所以在發往Internet時,數據包的源地址已經被SNAT成了路由器的外口公網IP發往了ISP;當進行內部服務器發佈時,要進行DNAT,爲了內部服務器的安全,隱藏IP,要進行DNAT,在DNAT過程中,內網服務器相對於外部網絡就是Destination了,所以當外部訪問內部服務器時,內網IP是私有地址,在經過內網出口路由器時,要進行DNAT,將來源數據包的目的地址(出口路由器的外口公網地址)轉成內網服務器私有地址,然後進行服務。
【Squid的工作機制】
當內部的用戶訪問Internet時,將數據包發往代理服務器Squid,代理服務查詢自身的緩存信息,如果緩存命中(Hit),就將數據直接送往用戶,如果緩存未命中(Missing),就向兄弟代理服務器發送請求,如果兄弟代理服務器有請求頁面,就將數據返回,如果兄弟也沒有,那麼代理服務器就以自己的地址作爲源地址,父級服務器地址作爲目的地址,將數據包發往父親服務器,進行請求。可能我們會奇怪的發現Squid和NAT不是一樣的嗎?其實不然,Squid在進行代理時,是不會對原始的數據包進行任何的修改的,整個過程中,數據包的源地址和目的地址都沒有發生改變。如果緩存命中,直接返回,未命中,以自己地址去查詢了,這樣就顯得非常的高效。
通過上面的簡單瞭解,是不覺得Squid真的很強大呢?
下面我們結合案例來談一下Squild的具體應用。
【實驗拓撲】
基本環境搭建:
【實驗設備】
Linux虛擬機( Red Hat) WinXP虛擬機(測試P C) 寬帶路由器(訪問Internet)
【參數設定】
Step1:搭建Squid緩存服務器(Linux虛擬機)
安裝需要的軟件包,啓動服務.
如果啓動過程出錯時
Step2:WinXP虛擬機(測試PC)
Step3:寬帶路由器(提供Internet訪問)
到現在,我們基本的環境就已經搭建好了,下面我們來做一些案例:
一:代理的基本應用.
測試代理可用性:此時在WinXP虛擬機上訪問www.baidu.com會出現下面問題:
這是由於Squild的配置中默認是deny all的,所以爲了測試,稍作修改。
service squid restart後,再刷新頁面試試看。。。(同時觀察我們的日誌信息)
tail -f /var/log/squid/access.log觀察日誌信息.
Squid:代理服務器,又稱爲代理服務器防火牆.因此它是可以做很多訪問控制的,下面我們在Squid的配置中加入一些訪問控制,來測試一下。。。。。
①基於來源地址的控制.
service squid restart再次刷新頁面測試結果.
將WinXP虛擬機的ip地址改一下(192.168.2.101)再刷新測試一下.
Squid還可以對一段來源地址範圍進行控制
例如:
acl badip src 192.168.2.100-192.168.2.110/255.255.255.255
http_access deny badip
重啓服務,刷新就會再次被拒絕.
Squid還可以基於目的地址進行控制
(不過用處不是很大,因爲Internet上的ip地址一般都是動態或則不止一個)
例如:
①acl internetip dst 192.168.101.254/255.255.255.255
②acl managerip src 192.168.2.100/255.255.255.255
③http_access allow managerip internetip
④http_access deny all internetip
//第③④行也可以換成下面的這種寫法
//http_access deny !managerip internetip
說明:192.168.101.254是寬帶路由器的管理ip(模擬Internet des主機).
192.168.2.100主機ip
重啓服務,就可以登陸寬帶路由器管理界面,更換主機地址,會再次被拒絕.
Squid還可以基於mac地址進行控制,但是這裏我們做不了這樣的實驗,因爲Red Hat的Squid安裝包沒有這項功能,如果想基於mac進行控制,可以下載Squid的源碼安裝包,進行源碼安裝,編譯的時候加入 --enable-arp-acl.
使用方法:
acl aclname arp mac-address....(XX:XX:XX:XX:XX:XX notation)
Squid還可以基於來源和目標域名地址進行控制,這是NAT所做不到.
acl baddomain dstdomain .sina.com.cn
http_access deny all baddomain
把訪問的域名換成非新浪的就可以正常訪問了.
Squid的基於域名的控制可以有效地杜絕一些釣魚網站用非法域名進行詐騙.
Squid還可以基於內容、端口、端口、時間等進行代理控制,有興趣的話可以參考一下Squid的配置文檔.
前面所講的都是一些代理的基本應用,可以實現基本的代理服務,但是有沒有發現有一個很現實的問題?用戶還要手動修改代理地址和添加代理端口(默認3128)。這樣以來,會產生兩方面的問題:
①給用戶帶來了很多不便②服務器的安全性就會降低.(端口暴露)
這樣就要求我們使用更加安全和方便的代理方式----透明代理
二:透明代理
【實現步驟】
1、WinXP客戶端:需要配置網關和DNS參數,取消瀏覽器上的代理配置.
(說明:因爲局域網訪問Internet時,DNS服務器如果在局域網外部的時候,內部主機需要進行DNS解析,才能訪問Internet,所以需要網關和DNS參數)
2、Squid代理服務器:需要進行SNAT配置.
(說明:因爲Squid代理所支持的服務很少http、ftp、smtp、pop3、imap等,它是不支持DNS代理的,所以爲了局域網用戶的數據包能夠出去,進行DNS解析,所以要在代理服務器上進行基於來源的SNAT轉換)
3、Squid代理服務器;開啓ip轉發,而且需要進行端口重定向(80—>3128)
(說明:爲了實現ip數據包能夠出去,必須開啓ip轉發功能;爲了實現Squid進行透明代理,當用戶訪問正常的80端口時,在經過代理服務器時,要將端口重定向爲Squid的3128端口,這些操作對於用戶是完全透明的)
進行端口重定向配置(80—>3128)
4、Squid代理服務器;開啓Squid的透明代理功能.
【透明代理測試】
這樣就完成了全部的配置過程,實現了代理對於用戶的完全透明。。。。
三:Squid還有一種比較實際的應用就是反向代理,當外網的用戶需要訪問內網的服務器(www等)時,需要在代理服務上做反向代理.
【實驗拓撲】(在內網添加一臺Web服務器:WinServer2003)
【配置詳情】
Step1:搭建內部的Web環境(WinServer2003虛擬機IIS)(過程略)
Step2:在Squid代理服務器上開啓反向代理.(Linux)
Step3:將代理服務器的外卡Eth1監聽端口由原來的3128改爲80.
service squid restart
【驗證分析】用虛擬機橋接的宿主機Win7(ip:192.168.102.111)做爲Internet主機,訪問服務器外口地址(192.168.102.102)模擬反向代理,進行測試.
【擴展分析】如果希望同時實現正向和反向代理,簡單修改就OK了
server squid restart就完全OK了!!!
下面是測試最終截圖:
注意:測試的時候,測試主機的DNS是要指定的。。。。。。。
【總結】
到此,Squid的基本應用就算講完了,有興趣的話可以自己試一試!
有什麼問題歡迎留言討論!!!!!!!