1. 程式人生 > >構建Squid代理服務器

構建Squid代理服務器

reload) color 停止 /dev/null class 轉發 頁面 錯誤 則表達式

Squid(Squid cache,簡稱Squid)是Linux系統中最常用的一款開源代理服務軟件,可以很好地實現HTTP和FTP,以及DNS查詢、SSL等應用的緩存代理,功能十分強大,官方網站為http://www.squid-cache.org


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瀏覽器設置中,不要勾選使用代理服務器,直接訪問訪問


http://172.16.16.172,然後觀察Squid服務器、Web服務器的訪問日誌,驗證透明代理是否發生作用,和前面案例的方法一樣,就不在贅述了


由於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代理服務器