實驗環境準備:
本次實驗用到三台虛拟機,在CentOS6.0啟用squid做代理上網伺服器,特意用windows server2003來做軟路由,用redhat5.0來做用戶端,最後的目的就是用戶端通過軟路由到達squid代理伺服器,然後通過代理伺服器可以上網,各網段的ip設定如圖所示,這裡不再描述說明.
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321614124YPxp.png"></a>
主機間的軟路由
1:先在win2k3上開啟軟體路由
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321614133r3E9.png"></a>
當然你也可以用linux主機做軟路由,開啟的方法是把ip_forward值至為1即可.
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321613715D4TN.png"></a>
2:在用戶端添加一條預設路由,因為用戶端想連接配接到外面的話,它都必須通過我們的軟路由的eth0網卡走出去,是以我們需要添加一條這樣的預設路由條目,凡是想出去的資料告訴它請走軟路由的eth0網卡(請結合上面拓撲圖來看就知道了)
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321614139vicA.png"></a>
ping192.168.10.1成功了,但此時發現ping192.168.10.2時,确一直沒有反應,是什麼原因導緻的呢?我們的軟路由轉發了資料沒?192.168.10.2到底有沒有收到我們發出的ping的資料包?答案是軟路由既轉發了資料192.168.10.2也收到了資料包,那即然轉發了資料包也收到了資料包,那為什麼ping不通呢?
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_13216141462ZNO.png"></a>
為了找到答案我們先來看代理伺服器的路由表,兩條直連路由和一條預設路由,它知不知道172.16.0.0/16網段怎麼走?它不知道吧,因為路由表裡面并沒有它的路由條目,即便它收到來自172.16.0.0網段的資料包,它也不知該如何響應.(也許你可能要問,它不是有一條預設路由麼?這條預設路由是外網的網關,它能知道内網某個網段的該如何走麼?)
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321614150DSjQ.png"></a>
知道原因了我們在代理伺服器端添加一條路由條目告訴它去172.16.0.0網段該怎麼走
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321614152K9sc.png"></a>
這時再傳回到用戶端來ping,立稈見影馬上就通了.
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321614154sdAe.png"></a>
此時我們試着再ping代理伺服器的外網卡,注意這裡顯示是目的主機不可到達的提示,那這又是什麼原因呢?
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321614158VgGa.png"></a>
我們再來到軟路由伺服器上發現也有同樣的問題,為什麼呢?我們通過檢視它的路由表就可以知道問題的原因何在了,它的路由表裡面有沒有去192.168.1.0網段的條目?沒有吧,是以當然資料包到達不了目的地.
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321614162kYTE.png"></a>
接下來就告訴它去192.168.1.0網段的路由該怎麼走,我們在靜态路由表裡面建立一條路由條目,告訴它去192.168.1.0網段應該通過代理伺服器的eth2網卡即192.168.10.2即可到達,因為在代理伺服器的路由表裡面它知道192.168.1.0就是它的直連網段.
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321614166YSoB.png"></a>
加了路由條目以後我們再到用戶端看看是不是全部的網段都可以進行通信了.ok,環境準備部分pass!
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321614170g7lq.png"></a>
代理服務安裝:
這裡我直接用yum來安裝了,裝上去的版本為3.1.4
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321613748FgNd.png"></a>
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321613748FsWe.png"></a>
squid服務啟動前的準備:
确認主機具有完整的域名,squid服務運作需要linux主機具有完整的域名
vi /etc/squid/squid.conf 加入如下内容
acl our_network src 172.16.0.0/16 192.168.10.0/24 #定義一個可以通過的本地網段
http_access allow our_network #允許此網段的所有資料通行
# And finally deny all other access to this proxy
http_access deny all #最後一條預設拒絕所有
# Squid normally listens to port 3128
http_port 192.168.1.109:8080 #預設端口是3128,當然也可以是任何其它端口,隻要不與其它服務發生沖突即可。為了安全起見,在前面加上IP位址,Squid就不會監聽外部的網絡接口。
#以下這些參數告訴Squid緩存的檔案系統、位置和緩存政策:
cache_dir ufs /var/spool/squid 100 16 256 #(緩存的空間,第一個機關為M,建議使用一個大一點的分區,來區分開。16在cache下生成16個檔案夾,在其他再建立256檔案夾)
cache_mem 100 MB #若專門做代理伺服器,沒有其他服務,那麼可以設定成記憶體的一半以上,如果有其他的服務,那麼不要超過實體記憶體的1/3。
maximum_object_size 20 MB #超過此檔案大小的對象将不緩存
maximum_object_size_in_memory 20 MB #記憶體中能緩存的最大檔案大小
cache_swap_low 90
cache_swap_high 95 #在這裡,Squid會将/var/spool/squid目錄作為儲存緩存資料的目錄,每次處理的緩存大小是100兆位元組,當緩存空間使用達到95% 時,新的内容将取代舊的而不直接添加到目錄中,直到空間又下降到90%才停止這一活動。如果不想Squid緩存任何檔案,如某些存儲空間有限的專有系統, 可以使用null檔案系統(這樣不需要那些緩存政策):
下面的幾個關于緩存的政策配置中,較主要的是第一行,即使用者的通路記錄,可以通過分析它來了解所有使用者通路的詳盡位址:
access_log /var/log/squid/access.log #(3.0以前的版本參數為cache_access_log,這個參數是指定存放記錄用戶端的通路記錄的日志檔案路徑)
cache_store_log /var/log/squid/store.log #記錄緩存了哪些網站
cache_log /var/log/squid/cache.log #緩存日志
visible_hostname CentOS6.0.allan.cn # 告訴Squid在錯誤頁面中顯示的伺服器名稱(主機名需寫到/etc/hosts和/etc/sysconfig/network中,這樣才可以确切定位)
如果隻做普通代理伺服器,以上的配置已經足夠。
/etc/squid/squid -z 初始化,然後再确認緩存空間目錄是否建立
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321614175wjx9.png"></a>
然後檢查一下squid.conf配置檔案是否存在錯誤
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321613753ailq.png"></a>
配置檔案沒有問題,我們就可以啟動squid服務了.
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321613754juUt.png"></a>
現在回到用戶端在IE浏覽器設定通過代理上網
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321613755MXJl.png"></a>
發現可以通過代理伺服器上網了(測試的時候要注意防火牆)
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321614692LDAo.png"></a>
注意linux下面firefox代理上網的設定在"編輯-首選項"而不是在工具裡面哈.
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321614699MC1b.png"></a>
梆定IP和MAC位址的方法,用一台機器舉例(如果隻允許相應的ip通路internet,那麼這裡有一個問題,在公司裡隻要誰知道這樣的規則,那麼他手動指定到這段位址任意一個ip他就可以上網了,是以為了更加保險起見,我們用IP加MAC位址的方法來做梆定)
acl mac_acl arp **** #指定一個mac
acl ip_acl src ***** #指定一個ip
http_access allow mac_acl ip_acl #同時滿足ip 和Mac兩個條件,不就等于綁定ip mac
不過對于多個機器,這個辦法就比較麻煩了,當然為了更加安全這個方法還是值得去做的.記住acl應用也有順序的,這裡例子http_access allow single single_mac一定要放在http_access deny our_network前面,不然直接拒絕以後,下面就算你允許也是無效的.
<a href="http://allanfan.blog.51cto.com/attachment/201111/18/520839_1321613769fytR.png"></a>
squid指令應用總結:
1:對你的squid.conf 排錯,即驗證 squid.conf 的 文法和配置。
/etc/squid/squid -k parse
如果squid.conf 有文法或配置錯誤,這裡會傳回提示你,如果沒有傳回,恭喜,可以嘗試啟動squid。
2:在前台啟動squid,并輸出啟動過程。
/etc/squid/squid -N -d1
3:啟動squid在背景運作。
/etc/squid/squid -s
這時候可以 ps -A 來檢視系統程序,可以看到倆個 squid 程序。
4:停止 squid
/etc/squid/squid -k shutdown
5:重引導修改過的 squid.conf
/etc/squid/squid -k reconfigure //載入新的配置檔案,這個估計用的時候比較多,當你發現你的配置有不盡你意的時候,可以随時修改squid.conf,然後别忘記對你的 squid.conf排錯,然後再執行此指令,即可讓squid重新按照你的 squid.conf 來運作。
6:/usr/local/squid/sbin/squid -k rotate #輪循日志,對LOG檔案做輪換;所謂的輪換就是在日志增長到太大的時候,重新命名一組新的檔案開始使用
7:把squid添加到系統啟動項
編輯 /etc/rc.d/rc.local
添加如下行: /etc/squid/squid -s
代理伺服器的類型簡單差別總結:
正向代理:為用戶端提供代理服務,需要在用戶端指定代理服務的位址(我們可以通過組政策來設定用戶端的代理伺服器)
透明代理:特殊的正向代理,不需要在用戶端做任何設定,但需要工作在網關上面.(透明代理和正向代理設定大體是都差不多,隻是有些地方有一點小小的差別,這裡不做說明,想要了解可以去百度一下哈)
反向代理:為伺服器提供代理緩存服務(什麼情況需要用到反向代理呢?舉一個簡單的例子,比如新浪和網易這樣的大型網站,它一般都會在各個省會城市租用反向代理服務為它工作,每個省都有,比如我們在廣東的話當通路新浪或網易的時候解析出來的IP會是廣東本地反向代理伺服器的IP,是以不論我們在哪個省打開新浪或網易網站都會發現打開網頁的速度都非常快,是以反向代理是用于減輕真實WEB伺服器的負擔而工作的,我們說這樣的服務是反向代理伺服器)
以下部分是我從網上摘錄下來供有需要深入研究需求來做參考學習
進階應用通路控制
所有設定完成後,關鍵且重要的任務是通路控制。Squid支援的管理方式很多,使用起來也非常簡單,Squid可以通過IP位址、主機名、MAC位址、使用者/密碼認證等識别使用者,也可以通過域名、 域字尾、檔案類型、IP位址、端口、URL比對等控制使用者的通路,還可以使用時間區間對使用者進行管理,是以通路控制是Squid配置中的重點。Squid 用ACL(Access Control List,通路控制清單)對通路類型進行劃分,用http_access deny 或allow進行控制。根據需求首先定義兩組使用者manager和staff,還有代表所有未指明的使用者組all及不允許上網的denyuser,的拒絕上的網站位址baddst,配置代 碼如下:
acl manager src 192.168.10.1-192.168.10.20/24
acl staff src 192.168.10.20-192.168.10.254/24
acl denyuser src 192.168.10.100/24
acl all src 0.0.0.0/0
http_access deny denyuser
http_access allow manager
http_access allow staff
http_access deny baddst
http_access deny all
上面幾行代碼告訴Squid不允許denyuser組通路Internet,但manager、staff組允許,由于 Squid是按照順序讀取規則,會首先禁止denyuser,然後允許manager和staff。如果将兩條規則順序颠倒,由于deny在staff 範圍中,Squid先允許了所有的staff,那麼再禁止denyuser就不會起作用。
特别要注意的是,Squid将使用allow-deny-allow-deny……這樣的順序套用規則。例如,當一個使用者通路代理伺服器時, Squid會順序測試Squid中定義的所有規則清單,當所有規則都不比對時,Squid會使用與最後一條相反的規則。是以在所有squid.conf中,最後一條規則永遠是http_access deny all,而all就是前面定義的“src 0.0.0.0”。
進階控制
前面說過,Squid的控制功能非常強大,隻要了解Squid的行為方式,基本上就能夠滿足所有的控制要求。下面就一步一步來了解Squid是如何進行控制管理的,通過IP位址來識别使用者很不可靠,比IP位址更好的是網卡的MAC實體位址。要在Squid中使用MAC位址識别,必須在編譯時加上“--enable-arp-acl”選項,然後可以通過以下的語句來識别使用者:
acl manager arp 00:01:02:1f:2c:3e #定manager 使用者組 通過MAC實體位址來它直接使用使用者的MAC位址,而MAC位址一般是不易修改的,即使有普通使用者将自己的IP位址改為進階使用者也無法通過,是以這種方式比IP位址可靠得多。
假如不想讓使用者通路某個網站應該怎麼做呢?可以分為兩種情況:一種是不允許通路某個站點的某個主機,比如ok的主機是ok.sina.com.cn,而其它的新浪資源卻是允許通路的,那麼ACL可以這樣寫:
acl ok dstdomain ok.sina.com.cn
http_access deny ok
另一種情況是整個網站都不許通路,那麼隻需要寫出這個網站共有的域名即可,配置如下:
acl qq dstdomain .tcccent.com.cn
http_access deny qq
注意tcccent前面的“.”,正是它指出以此域名結尾的所有主機都不可通路,否則就隻有tcccent.com.cn這一台主機不能通路。
如果想禁止對某個IP位址的通路,如202.118.2.182,可以用dst來控制,代碼如下:
acl badaddr dst 202.118.2.182
http_access deny badaddr
當然,這個dst也可以是域名,由Squid查詢DNS伺服器将其轉換為IP。
還有一種比較廣泛的控制是檔案類型。如果不希望普通使用者通過代理伺服器下載下傳MP3、AVI等檔案,完全可以對他們進行限制,代碼如下:
acl mmxfile urlpath_regex \.mp3$ \.avi$ \.exe$
http_access deny mmxfile
看到regex,很多讀者應該心領神會,因為這條語句使用了标準的規則表達式(又叫正規表達式)。它将比對所有以.mp3、.avi等結尾的URL請求,還可以用-i參數忽略大小寫,例如以下代碼:
acl mmxfile urlpath_regex -i \.mp3$
這樣,無論是.mp3還是.MP3都會被拒絕。當然,-i參數适用于任何可能需要區分大小寫的地方,如前面的域名控制。
如果想讓普通使用者隻在上班時間可以上網,而且是每周的工作日,用Squid應當如何處理呢?看看下面的ACL定義:
acl worktime time MTWHF 8:30-12:00 14:00-18:00
http_access deny !worktime
首先定義允許上網的時間是每周工作日(星期一至星期五)的上午和下午的固定時段,然後用http_access 定義所有不在這個時間段内的請求都是不允許的。
或者為了保證進階使用者的帶寬,希望每個使用者的并發連接配接不能太多,以免影響他人,也可以通過Squid控制,代碼如下:
acl conncount maxconn 3
http_access deny conncount normal
http_access allow normal
這樣,普通使用者在某個固定時刻隻能同時發起三個連接配接,從第四個開始,連接配接将被拒絕。
總之,Squid的ACL配置非常靈活、強大,更多的控制方式可以參考squid.conf.default。
6.認證
使用者/密碼認證為Squid管理提供了更多便利,最常用的認證方式是NCSA。從Squid 2.5版本開始,NCSA認證包含在了basic中,而非以前單獨的認證子產品。下面來看看實作認證的具體操作。
首先在編譯時配置選項應包括以下配置:
--enable-auth="basic" --enable-basic-auth-helpers="NCSA"
make install”以後,需要将“helpers/basic_auth/NCSA/ncsa_auth”拷貝到使用者可執行目錄中,如/usr/bin(如 果在該目錄中找不到這個執行檔案,在編譯時請使用make all而不是make,或者直接在該目錄中執行make),然後需要借助Apache的密碼管理程式htpasswd來生成使用者名/密碼對應的檔案,就像 下面這行代碼:
htpasswd -c /var/squid/password guest
在輸入兩遍guest使用者的密碼後,一個guest使用者就生成了。如果以後需要添加使用者,把上面的指令去掉-c參數再運作即可。
Squid 2.5在認證處理上有了較大的改變,這裡就隻讨論2.5版本的處理方法,2.4及以下版本請參考squid.conf.default。在2.5版的squid.conf中,包括以下幾個相關選項:
#該選項指出了認證方式(basic)、需要的程式(ncsa_auth)和
對應的密碼檔案(password)
auth_param basic program /usr/bin/ncsa_auth /var/squid/password 1092行
# 指定認證程式的程序數
auth_param basic children 5
# 浏覽器顯示輸入使用者/密碼對話框時的領域内容
auth_param basic realm My Proxy Caching Domain
# 基本的認證有效時間
auth_param basic credentialsttl 2 hours
# 普通使用者需要通過認證才能通路Internet
acl normal proxy_auth REQUIRED #不能放到advance組前面
通過以上的配置即可完成認證工作。有的讀者可能要問:認證隻針對普通使用者,而進階使用者是直接上網的,該怎麼處理呢?其實,這兩種使用者是可以共存的。如 前所述,Squid是順序處理http_access的,是以在http_access處理過程中,如果先處理normal使用者,那麼目前使用者無論是否屬 于進階使用者,都會被要求進行認證;相反如果先處理進階使用者,剩下的就隻有需要認證的普通使用者了。
例如以下配置代碼:
...
http_access allow normal (需要認證)
http_access allow advance (不需要認證)
不管是否為noauth使用者,都要求進行使用者名/密碼驗證。
正确的方法是将二者位置交換,代碼如下:
http_access allow advance
這時,進階使用者不會受到任何影響。
7.下面把整個squid.conf總結一下:
# 伺服器配置
http_port 192.168.0.1:3128
cache_mgr [email protected]
cache_dir null /tmp
cache_access_log /var/spool/squid/access.log
cache_log /var/spool/squid/cache.log
cache_store_log /var/spool/squid/store.log
visible_hostname 192.168.0.1
client_mask 255.255.255.255
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_user_host_header on
# 使用者分類
acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b ...
acl normal proxy_auth REQUIED
acl all src 0.0.0.0
# 行為分類
acl sinapage dstdomain ok.sina.com.cn
# 處理
配置後的狀況是,advance組可以不受任何限制地通路Internet,而normal組則隻能在工作時間上網,而且不能下載下傳多媒體檔案,不能通路某些特定的站點,而且發送請求不能超過3個。
通過本文的介紹,可以了解Squid的基本能力。當然,它的能力遠不止此,可以建立強大的代理伺服器陣列,可以幫助本地的Web伺服器提高性能,可以提高本地網絡的安全性等。要想發揮它的功效,還需要進一步控制。
本文轉自allanhi 51CTO部落格,原文連結:http://blog.51cto.com/allanfan/718398,如需轉載請自行聯系原作者