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