構建Squid代理服務器
Squid代理的工作機制
Squid是一個緩存Internet數據的一個軟件,它接收用戶的下載申請,並自動處理所下載的數據。也就是說,當一個用戶想要下載一個主頁時,它向Squid發出一個申請,要Squid替它下載,然後Squid 連接所申請網站並請求該主頁,接著把該主頁傳給用戶同時保留一個備份,當別的用戶申請同樣的頁面時,Squid把保存的備份立即傳給用戶,減少了向Internet提交重復的Web請求的過程,提高了用戶下載網頁的速度,隱藏了客戶機的真實IP,如下圖所示:
安裝Squid軟件
下面以Squid 3.4.6版為例,介紹其安裝和運行控制
1. 編譯安裝Squid
[root@localhost ~]# tar zxf squid-3.4.6.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/squid-3.4.6/ //配置前可參考"./configure --help"給出的說明 [root@localhost squid-3.4.6]# ./configure --prefix=/usr/local/squid //安裝目錄 --sysconfdir=/etc/ //單獨將配置文件修改到/etc目錄下 --enable-arp-acl //可在ACL中設置通過MAC地址進行管理,防止IP欺騙 --enable-linux-netfilter //使用內核過濾 --enable-linux-tproxy //支持透明模式 --enable-async-io=100 //異步I/O,提升儲存性能,值可修改 --enable-err-language="Simplify_Chinese" //錯誤信息的顯示語言 --enable-underscore //允許URL中有下劃線 --enable-poll //使用Poll()模式,提升性能 --enable-gnuregex //使用GNU正則表達式 [root@localhost squid-3.4.6]# make && make install //編譯安裝 [root@localhost squid-3.4.6]# cd ~ [root@localhost ~]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/ //創建鏈接文件,優化路徑 [root@localhost ~]# useradd -M -s /sbin/nologin squid //創建程序用戶、組 [root@localhost ~]# chown -R squid:squid /usr/local/squid/var/
2. 修改Squid的配置文件
[root@localhost ~]# vim /etc/squid.conf http_port 3128 //指定監聽地址和端口,默認端口3128 cache_effective_user squid //用來設置初始化、運行時緩存的賬號,否則啟動不成功 cache_effective_group squid //默認為指定賬號的基本組 cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256 //此行去掉註釋,最大緩存100MB文件,16個一級文件目錄,256個二級文件目錄 [root@localhost ~]# squid -k parse //檢查語法是否正確 [root@localhost ~]# squid -z //初始化緩存目錄 [root@localhost ~]# squid //啟動squid服務 [root@localhost ~]# netstat -anpt | grep squid //確認squid服務處於正常監聽狀態 tcp 0 0 :::3128 :::* LISTEN 40936/(squid-1)
3. 編寫Squid服務腳本
為了使Squid服務的啟動、停止、重載等操作更加方便,可以編寫Squid服務腳本,並使用chkconfig和service工具來進行管理
[root@localhost ~]# vim /etc/init.d/squid #!/bin/bash # chkconfig: 2345 90 25 # config: /etc/squid.conf # pidfile: /usr/local/squid/var/run/squid.pid # Description: Squid - internet object cache. PID="/usr/local/squid/var/run/squid.pid" CONF="/etc/squid.conf" CMD="/usr/local/squid/sbin/squid" case "$1" in start) netstat -anpt | grep squid &> /dev/null if [ $? -eq 0 ] then echo "squid is running" else echo "正在啟動squid..." $CMD fi ;; stop) $CMD -k kill &> /dev/null rm -fr $PID &> /dev/null ;; status) [ -f $PID ] &> /dev/null if [ $? -eq 0 ] then netstat -anpt | grep squid else echo "squid is not running." fi ;; restart) $0 stop &> /dev/null echo "正在關閉squid..." $0 start &> /dev/null echo "正在啟動squid..." ;; reload) $CMD -k reconfigure ;; check) $CMD -k parse ;; *) echo "用法:$0 {start | stop | restart | reload | check | status}" ;; esac [root@localhost ~]# chmod +x /etc/init.d/squid [root@localhost ~]# chkconfig --add squid //添加為系統服務 [root@localhost ~]# chkconfig squid on
構建代理服務器
根據實現方式的不同,代理服務可分為傳統代理和透明代理
傳統代理:適用於Internet,必需在客戶機手動設置代理服務器的地址和端口
透明代理:適用於局域網環境,客戶端不需要指定代理服務器的地址和端口
1. 傳統代理
使用傳統代理的特定在於,客戶機的相關程序(如IE瀏覽器、QQ)必須指定代理服務器的地址、端口等信息,下面通過一個案例來配置和使用傳統代理
案例:如上圖所示,在服務器B上構建Squid代理服務器,允許客戶機C指定服務器B作為Web代理,訪問網站服務器,但禁止通過代理下載超過10MB的文件,超過4MB的文件不進行緩存
(1)配置服務器A(Web服務器)
[root@localhost ~]# yum -y install httpd //安裝httpd服務 [root@localhost ~]# echo www.yangshufan.com > /var/www/html/index.html //制作測試網頁 [root@localhost ~]# /etc/init.d/httpd start //開啟httpd服務 [root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT //允許Web流量訪問
(2)配置服務器B(Squid服務器)
[root@localhost ~]# vim /etc/squid.conf //修改squid配置文件 reply_body_max_size 10 MB //禁止下載的超過10MB的文件 maximum_object_size 4096 KB //超過4MB的文件不進行緩存 http_access deny all //前面兩行需要放在這行之上才生效 [root@localhost ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT [root@localhost ~]# service iptables save //允許squid流量通過 iptables:將防火墻規則保存到 /etc/sysconfig/iptables: [確定] [root@localhost ~]# service squid reload //重載squid服務
(3)配置客戶機C(代理配置)
打開IE瀏覽器,依次選擇“工具”、“Internet選項”、“連接”“局域網設置”,如下圖所示:
(4)驗證代理服務是否發揮作用
1)查看Squid訪問日誌的新增記錄
[root@localhost ~]# tail /usr/local/squid/var/logs/access.log //可以看到客戶機C訪問Web服務器的記錄 1515630849.964 10 192.168.1.30 TCP_MISS/200 380 GET http://192.168.1.1/ - HIER_DIRECT/192.168.1.1 text/html 1515630850.113 1 192.168.1.30 TCP_MISS/404 561 GET http://192.168.1.1/favicon.ico - HIER_DIRECT/192.168.1.1 text/html
2)查看Web訪問日誌的新增記錄
[root@localhost ~]# tail /var/log/httpd/access_log //可以看到來著Squid服務器的訪問記錄,Squid服務器代替客戶機C訪問Web服務器 192.168.1.10 - - [11/Jan/2018:08:34:18 +0800] "GET /favicon.ico HTTP/1.1" 404 287 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1;WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
當客戶機再次訪問同一頁面時,Squid訪問日誌會增加新的記錄,而Web訪問日誌的記錄不會變化(除非頁面變更或強制刷新等操作)。這說明當客戶機訪問同一靜態頁面時,實際上是由代理服務器通過緩存提供的
2. 透明代理
透明代理的提供的功能和傳統代理是一致的,但其依賴於默認路由和防火墻的重定向策略,因此更適用於局域網,而不適用於Internet中的客戶機,下面也通過一個案例來配置和使用透明代理
案例:在Linux網關上構建Squid為客戶機訪問Internet提供代理服務,在客戶機上設置IP地址、默認網關,不需要指定代理服務器的地址、端口等信息
(1)配置網站服務器
前面的案例配置一樣,就不在贅述了
(2)配置Squid服務器
[root@localhost ~]# vim /etc/squid.conf //啟用透明代理,後面加一個transparent,但3.x版本後改為intercept http_port 192.168.1.1:3128 transparent //修改此項,只在這個IP地址提供代理服務 [root@localhost ~]# service squid reload //重載服務 [root@localhost ~]# vim /etc/sysctl.conf //啟用路由轉發功能 net.ipv4.ip_forward = 1 [root@localhost ~]# sysctl -p //立即生效 [root@localhost ~]# iptables -t nat -I PREROUTING -i eth1 -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to 3128 [root@localhost ~]# service iptables save //將80端口轉到3128端口,有透明代理訪問網站服務器 iptables:將防火墻規則保存到 /etc/sysconfig/iptables: [確定]
(3)在客戶機上驗證
在IE瀏覽器設置中,不要勾選使用代理服務器,直接訪問訪問
由於FTP協議涉及多個端口,多個連接,使用透明代理不便實現,因此最佳做法是采用傳統代理的方式實現
ACL訪問控制
Squid提供了強大的代理控制機制,通過合理設置ACL並進行控制,可以針對源地址、目標地址、URL路徑、訪問時間等各種條件進行設置
ACL訪問控制通過以下兩個步驟來實現:
(1)使用acl配置項定義需要控制的條件
(2)通過http_access配置項對已定義的條件做限制,如“允許”或“拒絕”
1. 定義acl配置項
每一行acl配置可以定義一條訪問控制列表,格式如下:
acl 列表名稱 列表類型 列表內容
其中,
列表名稱:由管理員自行指定,用來識別控制條件
列表類型:必須使用Squid預定義的值,對應不同類別的控制條件
列表內容:具體控制的對象,不同的類型對應的內容也不一樣,可以有多個值,用空格分隔
下面是一些常用的訪問控制列表類型:
列表類型 | 含義/用途 | 列表內容示例 |
src | 源IP地址、網段、IP地址範圍(客戶機IP地址) | 192.168.1.100 192.168.1.0/24 192.168.1.0-192.168.3.0/24 |
dst | 目標IP地址、網段主機名(服務器IP地址) | 216.182.154.9 216.182.154.0/24 www.ysf.com |
port | 目標端口 | 80 443 20 22 |
srcdomain | 源名稱(客戶機所屬的域) | .yangshufan.com |
dstdomain | 目標名稱(服務器所屬的域) | .qq.com |
time | 字母表示一星期中各天的英文縮寫MTWHFAS | MTWHF 8:30-17:30(周一至周五的時刻) 12:30-13:30 AS(周六、日) |
maxconn | 每個客戶機的並發連接數 | 20 |
url_regex | 目標資源的URL地址,-i表示忽略大小寫 | url_regex -i ^rtsp:// |
urlpath_regex | 目標資源的整個URL路徑 | urlpath_regex -i sex adult urlpath_regex -i \.mp3$ |
例如:針對不同的客戶機地址、時間段等,分別定義列表
[root@localhost ~]# vi /etc/squid.conf …… acl mylan src 192.168.1.0/24 192.168.4.0/24 //客戶機網段 acl worktime time MTWHF 08:30-17:30 //周一至周五的工作時間段 acl to_host dst 127.0.0.0/8 //目標地址 acl mc20 maxconn 20 //最大並發連接20 acl blackURL url_regex -i ^rtsp:// ^ emo:// //以rtsp://等開頭的URL acl fileURL urlpath_regex -i \.mp3$ \.mp4$ //以.mp3、.mp4結尾的URL路徑 #當需要限制的同一類型較多時,可以用獨立的文件來存放 [root@localhost ~]# mkdir /etc/squid //建立目標地址名單 [root@localhost ~]# cd /etc/squid [root@localhost squid]# vim ipblock.list //建立目標IP地址名單 89.23.12.34 191.12.37.112 171.23.65.0/24 [root@localhost squid]# vim dmblock.list //建立目標域地址名單 .qq.com .ysf.com .yang.com [root@localhost squid]# vim /etc/squid.conf acl ipblock dst "/etc/squid/ipblock.list" //調用指定文件的列表內容 acl dmblock dstdomain "/etc/squid/dmblock.list"
2. 設置訪問權限
定義好acl後,需要設置訪問權限,並必須防止對應的acl配置項之後,格式如下:
http_access deny或allow 列表名
例如:對應上面的acl配置設置相應的訪問權限
[root@localhost ~]# vi /etc/squid.conf …… http_access allow mylan !fileURL //!取反值,表示禁止客戶機下載MP3、MP4文件 http_access allow mylan worktime safeport !ipblock !dmblock //允許客戶機在工作時間訪問80、443端口,拒絕訪問黑名單的IP地址、域 http_access deny all //默認禁止所有客戶機使用代理 [root@localhost squid]# service squid reload //重載服務,使配置生效
3. 驗證訪問控制效果
(1)在網站服務器上添加一個以.MP3結尾的文件
[root@localhost squid]# echo yangshufan > /var/www/html/ysf.mp3 [root@localhost squid]# cat /var/www/html/ysf.mp3 yangshufan
(2)在客戶機上驗證是否可以訪問這個文件
Squid日誌分析
Sarg全名是Squid Analysis Report Generator,是一款Squid日誌分析工具,采用HTML格式,詳細列出每一位用戶訪問Internet的站點信息、時間占用信息、排名、連接次數、訪問量等
1. 配置過程如下:
[root@localhost ~]# yum -y install gd gd-devel [root@localhost ~]# tar zxf sarg-2.3.7.tar.gz [root@localhost sarg-2.3.7]# ./configure --prefix=/usr/local/sarg//安裝目錄 --sysconfdir=/etc/sarg //配置文件目錄 --enable-extraprotection && make && make install //添加額外的安全保護 [root@localhost sarg-2.3.7]# cd /etc/sarg/ [root@localhost sarg]# vim sarg.conf //修改配置文件,去掉# access_log /usr/local/squid/var/logs/access.log //指定Squid的訪問日誌文件 title "Squid User Access Reports" //網頁標題 output_dir /var/www/html/sarg //sarg報告的輸出目錄 user_ip no //使用用戶名顯示 topuser_sort_field BYTES reverse //降序排列指定連接次數、訪問字節數,升序換成normal user_sort_field BYTES reverse //降序排列用戶訪問記錄、連接次數 overwrite_report no //當那麽日期時間報告已存在,是否覆蓋報告 mail_utility mailq.postfix //發送郵件報告的命令 exclude_hosts /usr/local/sarg/noreport //指定不計入排列的站點目錄 charset UTF-8 //使用字符集 weekdays 0-6 //指定top排列的星期,0為周日 hours 7-12,14,16,18-20 //指定top排列的時間周期 www_document_root /var/www/html //網頁根目錄 [root@localhost sarg]# touch /usr/local/sarg/noreport //把不計入站點的文件添加到文件 [root@localhost sarg]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/ //優化路徑 [root@localhost sarg]# sarg //啟動一次記錄 SARG: 紀錄在文件: 171, reading: 100.00% SARG: 成功的生成報告在 /var/www/html/squid-reports/2018Jan11-2018Jan11
2. 驗證
3. 設置計劃任務,定期執行
[root@localhost ~]# vim /usr/local/sarg/ysf.sh //編寫腳本,每天的報告 #/bin/bash today=$(date +%d/%M/%Y) terday=$(date -d "1 day ago" +%d/%m/%Y) /usr/local/sarg/bin/sarg -l /usr/local/squid/var/logs/access.log -o /var/www/html/sarg -z -d $terday-$today &> /dev/null exit 0 [root@localhost ~]# chmod +x /usr/local/sarg/ysf.sh [root@localhost ~]# crontab -e //每天00:00執行 00 00 * * * /usr/local/sarg/ysf.com [root@localhost ~]# chkconfig crond on
構建Squid代理服務器