如何在CentOS或RHEL上搭建Squid透明Web代理系統(tǒng)?
譯文【51CTO精選譯文】我們在前一篇教程中介紹了使用用戶空間實現(xiàn)的應(yīng)用程序iptables搭建網(wǎng)關(guān)的方法,詳見http://xmodulo.com/2014/06/internet-connection-sharing-iptables-linux.html。本教程將重點(diǎn)介紹將網(wǎng)關(guān)變成透明代理服務(wù)器。如果客戶端沒有意識到其請求是通過代理處理的,該代理就被稱為“透明”代理。
使用透明代理有幾個好處。首先,對最終用戶來說,透明代理可以改善上網(wǎng)瀏覽體驗,因為緩存了經(jīng)常訪問的網(wǎng)站內(nèi)容,同時給他們帶來的配置開銷最小。對管理員來說,透明代理可用于執(zhí)行各種管理政策,比如內(nèi)容/URL/IP過濾和速率限制等。
代理服務(wù)器充當(dāng)客戶端和目的地服務(wù)器之間的中介??蛻舳藢⒄埱蟀l(fā)送到代理服務(wù)器,隨后代理服務(wù)器評估請求,并采取必要的動作。在本教程中,我們將使用Squid搭建一個Web代理服務(wù)器,而Squid是一種健壯的、可定制的、穩(wěn)定的代理服務(wù)器。就個人而言,大概一年來我管理著一臺拖有400多個客戶端工作站的Squid服務(wù)器。雖然平均而言我大概一個月就要重啟一次服務(wù),但處理器和存儲使用率、吞吐量以及客戶端響應(yīng)時間都表現(xiàn)不錯。
我們將配置Squid以獲得下列拓?fù)浣Y(jié)構(gòu)。CentOS/RHEL設(shè)備有一塊網(wǎng)卡(eth0)連接到專有局域網(wǎng),另一塊網(wǎng)卡(eth1)則連接到互聯(lián)網(wǎng)。
Squid的安裝
想使用Squid搭建透明代理系統(tǒng),我們首先要添加必要的iptables規(guī)則。這些規(guī)則應(yīng)該會幫助你開始上手,不過務(wù)必要確保它們與任何的現(xiàn)有配置沒有沖突。
- # iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
- # iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
***條規(guī)則將引起來自eth1(廣域網(wǎng)接口)的所有出站數(shù)據(jù)包都有eth1的源IP地址(也就是啟用NAT)。第二條規(guī)則將把來自eth0(局域網(wǎng)接口)的所有入站HTTP數(shù)據(jù)包(發(fā)往TCP 80)重定向至Squid偵聽端口(TCP 3128),而不是直接將其轉(zhuǎn)發(fā)到廣域網(wǎng)接口。
我們使用yum,開始安裝Squid。
- # yum install squid
現(xiàn)在,我們將改動Squid配置,將其變成透明代理系統(tǒng)。我們將局域網(wǎng)子網(wǎng)(比如10.10.10.0/24)定義為有效的客戶端網(wǎng)絡(luò)。不是來自該局域網(wǎng)子網(wǎng)的任何流量將被拒絕訪問。
- # vim /etc/squid/squid.conf
- visible_hostname proxy.example.tst
- http_port 3128 transparent
- ## 定義我們的網(wǎng)絡(luò)## acl our_network src 10.10.10.0/24
- ## 確保我們的網(wǎng)絡(luò)允許訪問## http_access allow our_network
- ## ***拒絕其他的所有流量## http_access deny all
現(xiàn)在我們開啟Squid服務(wù),確保它已被添加到啟動項。
- # service squid start
- # chkconfig squid on
鑒于Squid已搭建并運(yùn)行起來,我們可以測試其功能了,為此只需監(jiān)測Squid日志。從連接至該局域網(wǎng)的計算機(jī)訪問任何URL,你應(yīng)該會在日志中看到類似以下的內(nèi)容。
- # tailf /var/log/squid/access.log
- 1402987348.816 1048 10.10.10.10 TCP_MISS/302 752
- GET http://www.google.com/ - DIRECT/173.194.39.178
- text/html
- 1402987349.416 445 10.10.10.10 TCP_MISS/302 762
- GET http://www.google.com.bd/? - DIRECT/173.194.78.
- 94 text/html
據(jù)日志文件顯示,IP地址為10.10.10.10的機(jī)器試圖訪問google.com,Squid處理了這個請求。
一種最基本的Squid代理服務(wù)器現(xiàn)已準(zhǔn)備就緒。在本教程的余下部分,我們將調(diào)整Squid的一些參數(shù),以控制出站流量。請注意:這僅僅為了演示。實際的政策應(yīng)加以定制,以滿足你的具體要求。
準(zhǔn)備工作
在開始配置之前,我們先明確幾個要點(diǎn)。
Squid配置解析
在閱讀配置文件時,Squid以一種自上而下的方式來解析文件。自上而下地解析規(guī)則,直到發(fā)現(xiàn)匹配為止。一旦發(fā)現(xiàn)匹配,該規(guī)則就被執(zhí)行;其下面的其他任何規(guī)則將被忽視。所以,添加過濾規(guī)則的***實踐就是,按下列順序指定規(guī)則。
explicit allow
explicit deny
allow entire LAN
deny all
Squid重啟與Squid重新配置
一旦Squid配置經(jīng)過改動,Squid服務(wù)就需要重啟。重啟服務(wù)可能需要一段時間,有時要幾分鐘,長短取決于活動連接的數(shù)量。在這個期間,局域網(wǎng)用戶無法訪問互聯(lián)網(wǎng)。想避免這種服務(wù)中斷,我們可以使用下面這個命令,而不是使用“service squid restart”。
- # squid -k reconfigure
該命令將允許Squid使用更新后的參數(shù)來運(yùn)行,而不需要重啟本身。
按照IP地址過濾局域網(wǎng)主機(jī)
在這個演示中,我們想要搭建這樣的Squid:禁止擁有IP地址10.10.10.24的主機(jī)和IP地址10.10.10.25的主機(jī)訪問互聯(lián)網(wǎng)。為此,我們創(chuàng)建了一個文本文件“denied-ip-file”,里面含有所有被拒絕訪問的主機(jī)的IP地址,然后將該文件添加到Squid配置中。
- # vim /etc/squid/denied-ip-file
- 10.10.10.24
- 10.10.10.25
- # vim /etc/squid/squid.conf
- ## 首先我們創(chuàng)建訪問控制列表(ACL),隔離被拒絕訪問的IP地址##acl denied-ip-list src "/etc/squid/denied-ip-file"
- ##然后,我們應(yīng)用ACL ## http_access deny denied-ip-list ## 明確拒絕## http_access allow our_network
- ## 允許局域網(wǎng)## http_access deny all ## 拒絕所有deny all ##
現(xiàn)在我們需要重啟Squid服務(wù)。Squid將不再認(rèn)可來自這些IP地址的請求。如果我們檢查squid日志,就會發(fā)現(xiàn)來自這些主機(jī)的請求處于“TCP_DENIED”狀態(tài)。
過濾黑名單中的網(wǎng)站
這個方法將只適用于HTTP。假設(shè)我們想阻止badsite.com和denysite.com,就可以將這兩個網(wǎng)址添加到文件,并且將引用添加到squid.conf。
- # vim /etc/squid/badsite-file
- badsite
- denysite
- # vim /etc/squid/squid.conf
- ## ACL定義##acl badsite-list url_regex "/etc/squid/badsite-file"
- ## ACL 應(yīng)用## http_access deny badsite-list
- http_access deny denied-ip-list ## 之前設(shè)置,但這里不起作用## http_access allow our_network
- http_access deny all
請注意:我們使用了ACL類型“url_regex”,這將與所請求的URL中的“badsite”和“denysite”這兩個詞相匹配。也就是說,凡是在URL中含有“badsite”或“denysite”(比如badsite.org、newdenysite.com或otherbadsite.net)的請求一律被阻止。
合并多個ACL
我們將創(chuàng)建一個訪問列表,阻止IP地址為10.10.10.200的客戶端和IP地址為10.10.10.201的客戶端訪問custom-block-site.com。其他任何客戶端都能夠訪問該網(wǎng)站。為此,我們將首先創(chuàng)建一個訪問列表以隔離這兩個IP地址,然后創(chuàng)建另一個訪問列表以隔離所需的網(wǎng)站。***,我們將同時使用這兩個訪問列表,以滿足要求。
- # vim /etc/squid/custom-denied-list-file
- 10.10.10.200
- 10.10.10.201
- # vim /etc/squid/custom-block-website-file
- custom-block-site
- # vim /etc/squid/squid.conf
- acl custom-denied-list src "/etc/squid/custom-denied-list-file"
- acl custom-block-site url_regex "/etc/squid/custom-block-website-file"
- ## ACL應(yīng)用 ## http_access deny custom-denied-list custom-block-site
- http_access deny badsite-list ## 之前設(shè)置,但這里不起作用## http_access deny denied-ip-list ## 之前設(shè)置,但這里不起作用## http_access allow our_network
- http_access deny all
- # squid -k reconfigure
被阻止的主機(jī)現(xiàn)在應(yīng)該無法訪問上述網(wǎng)站了。日志文件/var/log/squid/access.log應(yīng)該含有相應(yīng)請求的“TCP_DENIED”。
設(shè)定***下載文件大小
Squid可以用來控制***的可下載文件大小。我們想把IP地址為10.10.10.200的主機(jī)和IP地址為10.10.10.201的主機(jī)的***下載大小限制在50MB。我們之前已經(jīng)創(chuàng)建了ACL“custom-denied-list”,以隔離來自這些源地址的流量?,F(xiàn)在,我們將使用同一個訪問列表來限制下載文件大小。
- # vim /etc/squid/squid.conf
- reply_body_max_size 50 MB custom-denied-list
- # squid -k reconfigure
建立Squid緩存層次體系
Squid支持緩存的方式是,將經(jīng)常訪問的文件存儲在本地存儲系統(tǒng)中。設(shè)想一下:你的局域網(wǎng)上有100個用戶在訪問google.com。要是沒有緩存功能,就要為每一個請求單獨(dú)獲取Google標(biāo)識或涂鴉。Squid可以將標(biāo)識或涂鴉存儲在緩存中,以便從緩存來提供。這不僅改善了用戶感覺得到的性能,還減少了帶寬使用量。這可以說是一舉兩得。
想啟用緩存功能,我們可以改動配置文件squid.conf。
- # vim /etc/squid/squid.conf
- cache_dir ufs /var/spool/squid 100 16 256
數(shù)字100、16和256 有下列含義。
•為Squid緩存分配100 MB存儲空間。如果你愿意,也可以加大所分配的空間。
•16個目錄(每個目錄里面含有256個子目錄)將用于存儲緩存文件。這個參數(shù)不應(yīng)該改動。
我們可以通過日志文件/var/log/squid/access.log來證實Squid緩存是否被啟用。如果緩存成功命中,我們應(yīng)該會看到標(biāo)有“TCP_HIT”的項。
總而言之,Squid是一種功能強(qiáng)大的、基于行業(yè)標(biāo)準(zhǔn)的Web代理服務(wù)器,被全球各地的系統(tǒng)管理員們廣泛使用。Squid提供了簡易的訪問控制功能,可用于管理來自局域網(wǎng)的流量。它既可以部署到大企業(yè)網(wǎng)絡(luò)中,也可以部署到小公司網(wǎng)絡(luò)中。本教程只介紹了Squid所有功能的一小部分。想了解完整的功能,請參閱其官方說明文檔(http://wiki.squid-cache.org/Features)。
但愿本文對各位有所幫助。
英文原文:http://xmodulo.com/2014/06/squid-transparent-web-proxy-centos-rhel.html