Squid-4.1 ACL訪問控制、日誌分析和反向代理
ACL訪問控制
Squid提供了強大的代理控制機制,通過結合設置ACL(Access Control List,訪問控制列表)並進行限制,可以針對源地址、目標地址、訪問的URL路徑、訪問時間等各種條件進行過濾。
在配置文件squid.conf中,ACL訪問控制通過以下兩個步驟實現:其一,使用acl配置項定義需要控制的條件;其二,通過http_access配置項對已定義的列表做“allow”或者“deny”訪問控制。本文還是基於上篇博客的透明代理環境下完成。
1、定義訪問控制列表
每一行acl配置可以定義一條訪問控制列表,格式如下:
acl 列表名稱 列表類型 列表內容
“列表名稱“可以自行指定,用來識別控制條件,見名知意;“列表類型”必須使用Squid預定義的值,對應不同類別的控制條件;“列表內容” 是要控制的具體對象,不同類型的列表所對應的內容也不一樣,也可以有很多值(以空格分隔,都為“或”的關系)。下面是常用的訪問控制列表類型:
src 源IP地址、網段、IP地址範圍 dst 目標IP地址、網段、主機名 port 目標端口 dstdomain 目標域,匹配域內所有的站點 time 使用代理服務的時間段,使用英文縮寫星期一到星期日為MTWHFAS maxconn 每個客戶機的並發連接數 url_regex 目標資源的URL地址,-i表示忽略大小寫 urlpath_regex 目標資源的整個URL路徑,-i表示忽略大小寫
在執行訪問控制的時候,Squid將按照各條規則由上而下依次訪問,如果找到相匹配的規則就不在往後搜索。因此,規則的順序安排非常重要。以下兩種默認情況需要我們註意:
1、沒有設置任何規則的時候,Squid服務將拒絕客戶端請求
2、有規則但是找不到匹配項,Squid將才有與最後一條相反的權限,即如果最後一條規則是allow,就拒絕客戶端請求,否則就允許該請求。
對src來源地址控制
可以看到本來是可以訪問到的,下面在配置文件中設置對192.168.100.130地址進行控制。修改完後,重啟服務。
重新使用客戶機再訪問web服務器發現已經訪問不了。
對時間區間控制
我們將上面基於src來源地址的語句註釋掉,重新寫對於訪問時間的控制,今天是星期二,那我這裏為了體現實驗效果,就控制客戶機星期二不能訪問Web服務器。配置如下,重啟服務。還有很多中控制方式,這裏就不一一贅述了,可以自行嘗試。
Squid日誌分析
Sarg全名是Squid Analysis Report Generator,這是一款Squid日誌分析工具,采用HTML格式,詳細列出每一位用戶訪問Internet的站點信息,時間占用信息,排名,連接次數和訪問量。Sarg部署如下:
安裝GD庫
GD庫主要是負責圖像處理的,在網站上GD庫通常用來生成縮略圖,或者用來對圖片加水印,或者用來生成漢字驗證碼,或者對網站數據生成報表等。這裏我要先將Squid代理服務器上一塊網卡換成NAT在線用yum安裝GD庫(不容易啊!)這是我換完NAT模式的網卡信息。
[root@promote ~]# yum install -y gd gd-devel
額,提示已經安裝過了,好吧,應該是上回已經做過了。繼續把網卡配置換回來。
安裝Sarg
首先到網上找到Sarg的安裝包,這裏我提供一個網址,大家直接去下載就行了。
https://sourceforge.net/projects/sarg/
[root@promote ~]# mkdir /usr/local/sarg #為sarg創建安裝目錄
[root@promote ~]# tar zxvf sarg-2.3.11.tar.gz -C /opt/ #將sarg解壓到指定目錄
[root@promote ~]# cd /opt/sarg-2.3.11/ #到sarg目錄中進行編譯安裝
[root@promote sarg-2.3.11]# ./configure --prefix=/usr/local/sarg \ #這裏指定安裝目錄
> --sysconfdir=/etc/sarg \ #指定配置文件目錄
> --enable-extraprotection #開啟額外保護功能
配置完後,進行編譯和安裝
[root@promote sarg-2.3.11]# make && make install
配置
到sarg配置文件中,一項一項的進行修改。
[root@promote /]# vim /etc/sarg/sarg.conf #開始修改配置文件
access_log /usr/local/squid/var/logs/access.log #指定訪問日誌文件
title "Squid User Access Reports" #網頁標題
output_dir /var/www/html/squid-reports #報告輸出目錄
user_ip no #使用用戶名顯示
exclude_hosts /usr/local/sarg/noreport #不計入排序的站點列表文件
topuser_sort_field connect reverse #top排序中有連接次數、訪問字節、降序排列升序是normal
user_sort_field connect reverse #用戶訪問記錄 連接次數、訪問字節按降序排序
overwrite_report no #同名日誌是否覆蓋
mail_utility mailq.postfix #發送郵件報告命令
charset UTF-8 #使用字符集
weekdays 0-6 #top排行的星期周期
hours 0-23 #top排行的時間周期
www_document_root /var/www/html #網頁根目錄
[root@promote /]# touch /usr/local/sarg/noreport
#創建上述不計入站點文件,添加的域名將不被顯示在排序中
[root@promote /]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/
#建立軟鏈接,方便使用命令
[root@promote /]# systemctl start httpd.service
#因為我們要在網頁裏訪問日誌,需要我們開啟httpd服務
運行
直接執行sarg即可啟動依次記錄,會看到下面提示信息。然後我們去網頁中訪問,管理頁面。我們也能周期性計劃任務執行每天生成報告。
[root@promote /]# sarg -l /usr/local/squid/var/logs/access.log -o /var/www/html/squid-reports/ -z -d $(date -d "1 day ago" +%d/%m/%Y)-$(date +%d/%m/%Y)
#這個就是生成昨天到今天的日誌報告
Squid反向代理
許多大型門戶網站架構都采用反向代理加速,使用比較多的就是Nginx和squid。如下圖所示,通過squid反向代理可以加速網站訪問速度,可將不同的URL請求發送不同的Web服務器上,同時互聯網只能看到反向代理服務器的地址,加強了網站的安全。
反向代理和正向代理區別
到這裏肯定有很多同學和我一樣困惑,什麽叫反向代理,什麽叫正向代理?這裏我用兩句話來概括下,多讀幾遍,大家就自然而然明白了。
- 正向代理代理的對象是客戶端(傳統代理),反向代理代理的對象是服務端
- 正向代理中,客戶端對於服務端是透明的(不知道服務端真實IP);反向代理中,服務端對於客戶端是透明的(不知道真實服務器的IP,知道的可能是代理服務器的)
Squid反向代理原理
- Squid反向代理服務器位於本地Web服務器和Internet之間,客戶端請求訪問Web服務器時,DNS將訪問的域名解析為Squid反向代理服務器的IP地址,客戶端將訪問Squid代理服務器。
- 如果Squid反向代理服務器緩存了該請求的資源,則將該請求的資源返回給客戶端,否則反向代理服務器將向後臺的Web服務器請求資源,然後將應答資源返回給客戶端,同時也將該資源在本地緩存一份,供下一個請求使用。
這裏我需要把試驗環境調整以下,將代理服務器還是配置成單網卡的普通代理。
- 代理服務器IP:192.168.100.100
- 客戶端IP:192.168.100.110
- 真實服務器1(win7):192.168.100.130
- 真實服務器2(centos7):192.168.100.140
修改配置文件加入下面幾行代碼,很重要的就是一定要關防火墻!!由於之前做透明代理 ,防火墻還有策略在裏面,導致訪問不了:
[root@localhost run]# vim /etc/squid.conf
acl web1 dstdomain www.yun.com
acl web2 dstdomain www.yun.com
#定義兩個個基於域名的控制列表,分別命名為web1,web2
http_access allow web1 web2
#允許以web1,web2為目標域名的訪問
http_port 192.168.100.100:80 accel vhost vport
#將端口監聽在 192.168.100.100的80端口上,accel 指啟用加速模式,vhost,vport用於轉發請求
cache_peer 192.168.100.130 parent 80 0 no-query originserver round-robin weight=1 name=web1
#cache_peer 指定後端服務器地址,80 為後端服務端口,0 為 ICP 端口號(多個 Squid 時用),originserver 指定資源服務器,round-robin指使用輪詢方式,weight指的是權重,自由分配,name 指定一個別名
cache_peer 192.168.100.140 parent 80 0 no-query originserver round-robin weight=1 name=web2
#和上面的一樣
實驗結果成功,訪問www.yun.com,真實服務器會使用輪詢的方式,分別輪流訪問兩臺web服務器。
Squid 4.1之前做反向代理的區別
Squid 4.1之前做做反向代理主要用下面幾行代碼:
http_port 192.168.100.100:80 accel vhost vport
cache_peer 192.168.100.130 parent 80 0 no-query originserver round-robin weight=1 name=web1
cache_peer 192.168.100.140 parent 80 0 no-query originserver round-robin weight=1 name=web2
cache_peer_domain web1 web2 www.yun.com
[root@localhost run]# squid -k parse #檢查配置文件語法
2018/07/24 22:40:38| ERROR: Directive ‘cache_peer_domain‘ is obsolete.
#cache_peer_domain指令已經廢棄
2018/07/24 22:40:38| cache_peer_domain : Replace with dstdomain ACLs and cache_peer_access.
#cache_peer_domain可以用ACL域名控制和cache_peer_access代替
所以這裏一定要註意,版本更換對於我們搭建服務影響還是挺大的,一定要與時俱進!!
Squid-4.1 ACL訪問控制、日誌分析和反向代理