簡介
普通代理
透明代理
反向代理
故障處理
一個范例
一個限制訪問的范例
官方網站:http://www.squid-cache.org/
相關技術網站:http://www.visolve.com/
一. 代理服務簡介
返回1. 什么是代理服務器(Proxy Server)
代理服務可以代表其它計算機傳遞數據包或信息,這些數據包和信息包括網頁、電子郵件、多媒體文件和其它網絡應用程序等。通過它的文件緩存和訪問控制等功能,可以實現快速瀏覽和對用戶訪問的有效管理。
Web代理服務器(通常所說的代理服務器)是介于瀏覽器和Web服務器之間的一臺服務器,當你通過代理服務器上網瀏覽時,瀏覽器不是直接到Web服務器去取回網頁而是向代理服務器發出請求,由代理服務器來取回瀏覽器所需要的信息并傳送給你的瀏覽器。 而且,大部分代理服務器都具有緩沖的功能,就好象一個大的Cache,它有很大的存儲空間,它不斷將新取得數據儲存到它本機的存儲器上,如果瀏覽器所請求的數據在它本機的存儲器上已經存在而且是最新的,那么它就不重新從Web服務器取數據,而直接將存儲器上的數據傳送給用戶的瀏覽器,這樣就能顯著提高瀏覽速度和效率。
更重要的是:代理服務器是 Internet鏈路級網關所提供的一種重要的安全功能,它的工作主要在開放系統互聯 (OSI) 模型的對話層。主要的功能有:
1、連接Internet與Intranet 充當firewall(防火墻):因為所有內部網的用戶通過代理服務器訪問外界時,只映射為一個IP地址,所以外界不能直接訪問到內部網;同時可以設置 IP地址過濾,限制內部網對外部的訪問權限;另外,兩個沒有互聯的內部網,也可以通過第三方的代理服務器進行互聯來交換信息。
2、共享因特網連接,節省IP開銷:如前面所講,所有用戶對外只占用一個IP,所以不必租用過多的IP地址,降低網絡的維護成本。這樣,局域局內沒有與外網相連的眾多機器就可以通過內網的一臺代理服務器連接到外網,大大減少費用。當然也有它不利的一面,如許多網絡黑客通過這種方法隱藏自己的真實IP地址,而逃過監視。
3、提高訪問速度,節約通信帶寬。而且通常代理服務器都設置一個較大的硬盤緩沖區(可能高達幾個GB或更大),當有外界的信息通過時,同時也將其保存到緩沖區中,當其他用戶再訪問相同的信息時,則直接由緩沖區中取出信息,傳給用戶,從而達到提高訪問速度的目的。
2. 代理服務器的硬件需求
代理服務器對于硬件的要求相當的高!因為我們架設代理服務器的目的就是希望能夠加快網絡的傳輸速度因此,雖然代理服務器幾乎在任何的 Linux 系統上面都能跑,但是代理服務器最好還是有較高的硬件配置:
CPU 足夠好;
RAM 足夠大,這也是很重要的一個硬件參數
Hard Disk 最好能用 SCSI 接口的,因為速度與穩定度都比較好!如果不能的話,那么 IDE 接口的硬盤由于目前速度也越來越快,所以使用 IDE 也沒有問題,但是最好是『多塊硬盤』的架構,例如我總共需要 30 GB 的硬盤空間,那么最好是 10 GB 的硬盤三塊這樣的架構較佳。 最好在架設代理服務器時,將整體主機的規劃做好,并且讓代理服務器主機的服務單純一點,最好只負責代理服務
每顆硬盤的容量不需要太大,此外,最好將硬盤分割一下,一個分區在 2~4 GB 之間即可,因為分太大的話資料的搜尋耗費時間較長,但是分區太小又可能造成空間的浪費
cache 是放置在某個目錄下的,而最好一個目錄底下就是獨立的一個partition 。此外,由于 cache 所在的硬盤常常會有資料的存取,因此可能此一硬盤的損耗率會比較大,所以這個 cache 所在的硬盤最好不要跟重要數據文件,例如 /, /etc, /usr, /home 等等重要的系統文件放在一起!
也由于 cache 所在的硬盤資料存取太密集了,所以,硬盤的選擇上面需要 (1)轉速不能太低; (2)磁頭的機械臂需要可以忍受頻繁的動作;(3)發熱量不可太大,或者可以考慮加裝硬盤用風扇。
網絡卡與網絡周邊最好使用 GBytes 的網絡卡
3. 使用squid的好處
squid是開源軟件,性能優秀。并仍在世界各地的squid開發者的共同努力下,不斷發展。
快速響應,減少網絡阻塞,Squid將遠程Internet對象保存為本地拷貝。當本地用戶再次訪問這些對象時,Squid可以直接快速地提供對這些對象的訪問,而不必再次占用帶寬訪問遠程服務器上的對象。
增強訪問控制,提高安全性。可以針對特定的的網站、用戶、網絡、數據類型實施訪問控制
squid可以工作在普通代理模式、透明代理模式各反向代理模式
4. squid的結構
多個squid代理服務器可以通過icp協議相互溝通,形成樹形層次關系(父代理、兄弟代理、子代理),構建代理服務器群。
二. squid.conf的典型配置(普通代理)
返回
1. 配置
#vi /etc/squid/squid.conf
#http_port指令告訴squid在哪個端口偵聽HTTP請求。默認端口是3128,除下面的形式外,也可以是http_port 192.168.63.50:3128
http_port 3128
icp_port 3130
#緩存目錄的設置,可以設置多個緩存目錄,語法為:<cache_dir> <aufs|ufs> <目錄所在> <MBytes大小> <dir1> <dir2>
cache_dir ufs /var/spool/squid 1000 64 1024
#下面是關于日志文件的放置目錄與文件名!
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
pid_filename /var/run/squid.pid
#關閉認證機制,有些版本的 squid 會自動的加入代理認證機制,而普通情況下是不需要的,故找到包括auth_param的行,給它們加上注釋
#auth_param basic children 5
#auth_param basic realm Squid proxy-caching web server
#auth_param basic credentialsttl 2 hours
#設置squid用戶及用戶組、管理員賬號
cache_effective_user squid
cache_effective_group squid
cache_mgr youraccount@your.e.mail
# 與內存有關的配置:因為我的系統內存很小,所以只給 8 MB!如果您的物理內存很大的情況下,例如 512 MB,可以考慮加大到 64 或 128 MB。
cache_mem 128 MB
# 與磁盤容量有關的配置(注:下列的 90 與 95 是百分比 ),如果您的 cache_dir 所在磁盤很大時,可以考慮將 4096 改成 32768 KB
cache_swap_low 90
cache_swap_high 95
maximum_object_size 4096 KB
# 與內存保存資料有關的配置
maximum_object_size_in_memory 8 KB
#定義acl(訪問控制列表), 語法為:acl<acl> <acl名稱> <acl類型> <配置的內容>
#黑體為用戶自定義部分
acl All src 0/0
acl Manager proto cache_object
acl Localhost src 127.0.0.1/32
acl Safe_ports port 80 21 443 563 70 210 280 488 591 777 1025-65535
acl SSL_ports 443 563
acl CONNECT method CONNECT
acl MyNetwork src 192.168.0.0/16
#利用前面定義的acl,定義訪問控制規則
http_access allow Manager Localhost
http_access deny Manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow MyNetwork
http_access deny All
#定義與其它代理服務器的關系,語法: <cache_peer> <主機名稱> <類別> <http_port> <icp_port> <其它參數>
cache_peer 192.168.60.6 parent 4480 7 no-query default
#設置與其它代理服務器的關系:
# <cache_peer_access> <上層 Proxy > <allow|deny> <acl名稱>
#cache_peer_access 192.168.60.6 allow aclxxx
#cache_peer_access 192.168.60.6 deny !aclxxx
coredump_dir /var/spool/squid
2. 激活squid
1). 在開啟squid之前,你應該驗證其配置文件是否正確。運行如下命令即可:
# squid -k parse
假如你看不到輸出,配置文件有效,你能繼續后面的步驟。然而,如果配置文件包含錯誤,squid會告訴你:
2). 初始化cache目錄.即建立緩存目錄的存儲格式
只需在第一次啟動squid服務之前執行(在初次運行squid之前,或者無論何時你增加了新的cache_dir,你必須初始化cache目錄。)
# squid -z
cache目錄初始化可能花費一些時間,依賴于cache目錄的大小和數量,以及磁盤驅動器的速度。假如你想觀察這個過程,請使用-X選項:
# squid -zX
3). 啟動squid服務
# service squid start
假定squid安裝在/usr/local/squid目錄下,也可以
# /usr/local/squid/sbin/squid -sD
4). 停止squid
最安全的停止squid的方法是使用squid -k shutdown命令:
# squid -k shutdown
5). 重配置運行中的squid進程
在你了解了更多關于squid的知識后,你會發現對squid.conf文件做了許多改動。為了讓新設置生效,你可以關閉和重啟squid,或者在squid運行時,重配置它。
重配置運行中的squid最好的方法是使用squid -k reconfigure命令:
# squid -k reconfigure
6). 滾動日志文件
除非你在squid.conf里禁止,squid會寫大量的日志文件。你必須周期性的滾動日志文件,以阻止它們變得太大。squid將大量的重要信息寫入日志,假如寫不進去了,squid會發生錯誤并退出。為了合理控制磁盤空間消耗,在cron里使用如下命令:
%squid -k rotate
例如,如下任務接口在每天的早上4點滾動日志:
0 4 * * * /usr/local/squid/sbin/squid -k rotate
該命令做兩件事。首先,它關閉當前打開的日志文件。然后,通過在文件名后加數字擴展名,它重命名cache.log,store.log,和 access.log。例如,cache.log變成cache.log.0,cache.log.0變成cache.log.1,如此繼續,滾動到 logfile_rotate選項指定的值。
squid僅僅保存每個日志文件的最后logfile_rotate版本。更老的版本在重命名過程中被刪除。假如你想保存更多的拷貝,你需要增加logfile_rotate限制,或者編寫腳本用于將日志文件移動到其他位置。 請見13.7章關于滾動日志的其他信息。
3. 訪問控制示例
1) 禁止訪問某個網站
在squid配置文件中添加以下acl名稱及訪問規則,并重新加載配置文件
acl sina dstdomain .sina.com.cn .sina.com
http_access deny sina
或
acl sina dst 58.63.236.26 58.63.236.27 58.63.236.28 58.63.236.29 58.63.236.30 58.63.236.31 58.63.236.32 58.63.236.33 58.63.236.34 58.63.236.35 58.63.236.36 58.63.236.37 58.63.236.38 58.63.236.39 58.63.236.49 58.63.236.50
http_access deny sina
或
acl sina dst www.sina.com.cn
http_access deny sina
2) 禁止來自某些IP地址的訪問
在squid配置文件中添加以下acl名稱及訪問規則,并重新加載配置文件
acl zhang src 192.168.63.6/32
http_access deny zhang
3) 禁止在某些時段訪問
acl Working_hours MTWHF 08:00-17:00
http_access allow Working_hours
http_access deny !Working_hours
4) 禁止某個代理客戶建立過多連接
acl OverConnLimit maxconn 4
http_access deny OverConnLimit
三. 透明代理
返回
讓我們現在來想象一個聯機狀態,就是你有一整組內部網絡,而這個內部網絡都是透過 NAT 主機聯機出去的。那么我們談過,就是在一個內部網很大的情況下,使用 Proxy 是一個很不錯的選擇,因為至少他可以減輕帶寬負荷!不過,遺憾的是,架設 Proxy 的時候,也要使用者在瀏覽器上面設置代理!那么有沒有辦法在『使用者不需要在瀏覽器上面進行任何配置,就可以實現以 Proxy 幫助使用者聯接Internet?當然有啦!那就是 Transparent Proxy 啦!也有人翻譯成『透明代理服務器』,其原理是:
當使用者經過 NAT 服務器來聯機進入 Internet 時,假如使用的 Internet 協議為 80 (也就是 WWW) ,那么就將這個要求交給 Proxy 來工作,以達到代理服務器的功能。
呵呵!也就是說,當使用者是經過 NAT 主機聯機出去時,只要讓 NAT 主機發現『咦!你是要去讀取 www 的資料對吧!好!那么這個動作由 Proxy 主機幫你搞定!』如此一來,使用者根本就不需要在瀏覽器上面配置 Proxy 的相關資料,因為這個動作是『由 NAT 主機自己決定的』,所以只要在 NAT 主機上面配置妥當即可,使用者不必配置任何資料呢!那么要怎么進行呢?只要兩個步驟即可:
1. 配置 Proxy 主機:
1) 如果是squid 2.5,需要更改squid配置文件中的下列指令:
[root@test root]# vi /etc/squid/squid.conf
!
httpd_accel_host virtual # 告訴web加速器,針對所有的URL
httpd_accel_port 80 # 告訴web加速器,要監聽的端口是80!
httpd_accel_with_proxy on # 這個很重要!因為配置 httpd_accel_host 之后, cache 的配置會自動被終止,必須要加上這個配置為 on 之后,才能提供 cache 的功能!
httpd_accel_uses_host_header on
2) 如果是squid 2.6,則只需要更改squid配置文件中的一個指令:
http_port 192.168.63.50:3128 transparent #192.168.63.50 就是squid服務器的地址
[root@test root]# squid -k reconfigure
2. 配置 NAT 主機的 port map :
再來讓我們到 NAT 主機上面看看先,因為需要將 80 這個 port 交給 Proxy 的 3128 來幫忙協助,所以你的防火墻 script 必須要加入這一段才行:
#iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.62.0/24 --dport 80 -j REDIRECT --to-ports 3128
注意一下,那個 eth0 是『你的 NAT 對內的網卡』,至于 192.168.62.0/24 則是你的內部網域,請依照你的主機實際狀態來配置!這樣一來,您的 client 端完全不需要進行任何的配置,立刻就可以使用 Proxy 的好處啰
3. 配置轉發
#echo 1 > /proc/sys/net/ipv4/ip_forward
或:
#vi /etc/sysctl.conf
net_ipv4_forword=1
#vi /etc/sysconfig/network
FORWARD_IPV4=yes
#service network restart
4. 配置客戶端
將另外一臺計算機作為客戶機進行測試,需要將網關、首選DNS服務器指向設置透明代理的服務器,清除客戶端的瀏覽器代理設置。
四. 反向代理
返回
代理服務器是使用非常普遍的一種將局域網主機聯入互聯網的一種方式,使用代理上網可以節約緊缺的IP地址資源,而且可以阻斷外部主機對內部主機的訪問,使內部網主機免受外部網主機的攻擊。但是,如果想讓互聯網上的主機訪問內部網的主機資源(例如:Web站點),又想使內部網主機免受外部網主機攻擊,一般的代理服務是不能實現的,需要使用反向代理來實現。
什么是反向代理呢?其實,反向代理也就是通常所說的WEB服務器加速,它是一種通過在繁忙的WEB服務器和Internet之間增加一個高速的WEB緩沖服務器(即:WEB反向代理服務器)來降低實際的WEB服務器的負載。典型的結構如下圖所示:
Web服務器加速(反向代理)是針對Web服務器提供加速功能的。它作為代理Cache,但并不針對瀏覽器用戶,而針對一臺或多臺特定Web服務器(這也是反向代理名稱的由來)。實施反向代理(如上圖所示),只要將Reverse Proxy Cache設備放置在一臺或多臺Web服務器前端即可。當互聯網用戶訪問某個WEB服務器時,通過DNS服務器解析后的IP地址是Reverse Proxy Server的IP地址,而非原始Web服務器的IP地址,這時Reverse Proxy Server設備充當Web服務器,瀏覽器可以與它連接,無需再直接與Web服務器相連。因此,大量Web服務工作量被卸載到反向代理服務上。不但能夠防止外部網主機直接和web服務器直接通信帶來的安全隱患,而且能夠很大程度上減輕web服務器的負擔,提高訪問速度。
1. Squid反向代理單個后臺WEB服務器

1) 如果WEB服務器和反向代理服務器是兩臺單獨的機器(一般的反向代理應該有兩塊網卡分別連接了內外部網絡)。那么,應該修改下面的內容來設置反向代理服務。
http_port 80 #squid監聽的端口
httpd_accel_host 172.16.250.250 #內部WEB服務器的IP地址
httpd_accel_port 80 #WEB服務的端口號
httpd_accel_single_host on #轉發沒有緩沖的請求到一臺單獨的機器,squid被設置成僅對單一的web服務器作反向代理
httpd_accel_with_proxy on #如果希望squid既作反向代理服務器又作本地機器的上網代理,需要將此設為on,默認是off
httpd_accel_uses_host_header off #在HTTP協議1.1中,HTTP請求包括一個主機頭信息,指定URL的主機名或者主機的IP地址。這個選項可以用來完成多個后臺WEB服務器的反向代理功能。
2) 如果WEB服務器和反向代理服務器是同一臺機器。那么,應該設置WEB服務器的監聽端口為非80端口(比如:81端口)。要修改的內容如下:
http_port 80 #squid監聽的端口
httpd_accel_host localhost #內部WEB服務器的IP地址
httpd_accel_port 81 #WEB服務器的端口號
httpd_accel_single_host on
httpd_accel_with_proxy on
httpd_accel_uses_host_header off
2.Squid反向代理多個后臺WEB服務器
我們可以用Squid反向代理多個后臺WEB服務器。例如:我們可以配置squid同時反向代理www.abc.com, www.xyz.com, www.lmn.com三個后臺WEB服務器,示意圖如下:

Squid的配置如下:
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_single_host off
httpd_accel_uses_host_header on
(注意:編譯Squid時需激活Internal DNS選項)
然后設置設置反響代理需要的域名解析(Internet用戶通過這里解析三個網站的域名)如下:
www.abc.com 202.102.240.74
www.xyz.com 202.102.240.74
www.lmn.com 202.102.240.74
使三個域名都指向反向代理服務器的IP地址202.102.240.74。
下面設置反向代理所需要的DNS入口信息(即設置內部DNS,僅僅是squid在內部使用,Internet用戶不可見)。有兩種方法可以設置內部DNS,使用內部DNS服務器來解析或者使用/etc/hosts文件來實現。
使用內部DNS服務器的資源記錄如下:
www.abc.com IN A 192.168.62.2
www.xyz.com IN A 192.168.62.3
www.lmn.com IN A 192.168.62.4
如果使用/etc/hosts文件來實現內部DNS(編譯時應使用disable internal dns選項),編輯/etc/hosts文件添加如下條目:
192.168.62.2 www.abc.com
192.168.62.3 www.xyz.com
192.168.62.4 www.lmn.com
結論:通過本文中的論述和相關實例,可以看出,反向代理方式不單是一種WEB服務器加速器,而且使也一種對外提供Web發布時使用的有效的防火墻技術,使用它不但能節約緊缺的IP地址資源,加速WEB服務器的訪問速度,而且能夠保護WEB主機,因此能夠適應多種應用場合。
五. 故障處理
返回
1. 如果在啟動squid時出現下述信息:
% squid -Nd1
FATAL: Could not determine fully qualified hostname. Please set 'visible_hostname'
則需要在squid的配置文件中設置visible_hostname,如:
visible_hostname squid.packet-pushers.net
2. 如果在配置squid代理后,客戶訪問出現以下提示:
ERROR
The requested URL could not be retrieved
While trying to retrieve the URL: http://.../
可能需要在squid配置文件中加入以下指令:
always_direct allow all
六. 一個范例
返回
http_port 3128
icp_port 0
cache_mem 64 MB
cache_swap_low 80
cache_swap_high 85
maximum_object_size 32000 KB
cache_dir ufs /var/spool/squid 500 64 1024
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
pid_filename /var/run/squid.pid
acl all src 0.0.0.0/0.0.0.0
acl alldst dst 0.0.0.0/0.0.0.0
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 163 url_regex 163.com
acl sina url_regex sina.com.cn
acl myclient src 192.168.6.0/24
http_access allow 163
http_access allow sina
http_access deny !sina
http_access deny !163
cache_peer 192.168.1.8 parent 8080 7 no-query default
cache_effective_user squid
cache_effective_group squid
cache_mgr root@net03.org
coredump_dir /var/spool/squid
七. 一個限制訪問的范例
返回
http_port 3128
icp_port 0
cache_mem 64 MB
cache_swap_low 80
cache_swap_high 85
maximum_object_size 32000 KB
cache_dir ufs /var/spool/squid 500 64 1024
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
pid_filename /var/run/squid.pid
acl all src 0.0.0.0/0.0.0.0
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 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
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 myclient src 192.168.6.0/24
acl 163 url_regex 163.com
acl sina url_regex sina.com.cn
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports
cache_peer 192.168.1.8 parent 8080 7 no-query default
acl ip_acl src 192.168.6.0/24
acl time_acl time M T W H F A S 9:00-19:00
http_access allow ip_acl time_acl
cache_peer_access 192.168.1.8 allow 163
cache_peer_access 192.168.1.8 deny !163
cache_peer_access 192.168.1.8 allow sina
cache_peer_access 192.168.1.8 deny !sina
cache_effective_user squid
cache_effective_group squid
cache_mgr root@net03.org
coredump_dir /var/spool/squid
#acl pl800_arp arp 00:08:c7:9f:34:41
#http_access allow pl800_arp