一、缓存代理概述

作为应用层的代理服务软件,Squid主要提供缓存加速、应用层过滤控制的功能。

1.代理的工作机制

当客户机通过代理来请求Web页面时,指定的代理服务器会先检查自己的缓存,如果缓存中已经有客户机需要的页面,则直接将缓存中的页面内容反馈给客户机;如果缓存中没有客户机要的访问的页面,则由代理服务器向Internet发送访问请求,当获得返回的Web页面以后,将网页数据保存到缓存中并发送给客户机。

作用:

减少了向Internet提交重复的Web请求的过程,提高了客户机的Web访问响应速度;

客户机的web访问请求实际上是由代理服务器来代替完成的,从而可以隐藏用户的真实IP地址;

代理服务器有机会针对要访问的目标、客户机的地址、访问时间段等进行过滤控制,还能起到监控的作用。

 

2.代理的基本类型

传统代理:首先必须在客户机的浏览器、QQ聊天工具、下载软件等程序中手动设置代理服  务器的地址和端口,然后才

          能使用代理来访问网络。网页浏览器访问网站时的域  名解析请求也会发给指定的代理服务器。

透明代理:提供与传统代理形同的功能和服务,其区别在于客户机不需要指定代理服务器的 地址和端口,而是通过默

          认路由、防火墙策略将Web访问重定向。重定向的过程 对客户机来说是“透明”的,用户甚至不知道自己在

          使用代理服务,所以称为“透 明代理”。网页浏览器访问网站时的域名解析请求将优先发给DNS服务器。

 

实际应用中,传统代理多见于Internet环境,如为QQ程序使用代理可以隐藏本机的真实IP地址,为下载工具使用多个代理可以规避服务器的并发链接限制;透明代理多见于局域网环境。

 

二、安装及运行控制

1.编译安装

wKiom1hSIgaCY_aVAAAEEGCTZgs065.png

wKiom1hSIgbSH3skAAAKUS30xLA439.png

主要配置项含义:

--sysconfdir=/etc                    //单独将配置文件修改到其他目录

--enable-arp-acl                     //可以在规则中设置直接通过客户端MAC  行管理,防止客户端使用IP欺骗

--enable-linux-netfilter             //使用内核过滤

--enable-linux-tproxy                //支持透明模式

--enable-async-io=值                 //异步I/O,提升存储性能,

--enable-err-language=Simplify_Chinese”    //错误信息的显示语言

--enable-underscore                  //允许URL中有下划线

--enable-poll                        //使用Poll()模式,提升性能

--enable-gunregex                    //使用GNU正则表达式

 

wKioL1hSIgeDEAqpAAAGIT7Npm0245.png

安装完成后,创建链接文件、创建用户和组。

 

2.Squid的配置文件

wKiom1hSIgeCmwzoAAADdI0xn_o483.png

Squid代理服务器_第1张图片

主要修改有以下几条配置项,有的配置项需要修改,而有的配置项需要添加。

http_port 3128   //用来指定代理服务器监听的地址和端口,默认

                                       端口号为3128  修改

cache_effective_user squid //指定squid的程序用户,用来设置初始化、运

                                       行时缓存的账号,否则启动不成功! 添加

cache_effective_group squid  //默认为cache_effective_user指定账号的基

                                       本组  添加

visible_hostname  主机名             //代理服务器的主机名  添加

cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256

 

3.Squid的运行控制

wKiom1hSIgjxes5rAAAB3gSFJSQ168.png

检查配置文件语法是否正确


wKioL1hSIgjR4xNIAAABpFDk0UI293.png

-z选项用来初始化缓存目录

 

wKioL1hSIgjAeJ--AAABe5GXmh8000.png

启动squid服务

 

注意:第一次启动Squid服务时,会自动初始化缓存目录。在没有可用的Squid服务脚本的情况下,需要直接调用Squid程序来启动服务,这时需要先进行初始化。

 

wKiom1hSIgmyyXnnAAAE9G4kOt0852.png

确认服务处于正常监听状态

 

为了使Squid服务的启动、停止、重载等操作更加方便,可以编写Squid服务脚本,并使用chkconfigservice工具来进行管理。

wKioL1hSIgmzRrFkAAACHACZml4373.png

#!/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

wKioL1hSI02y-7z9AAAEWLfB1pI638.png


三、构建透明代理服务器

透明代理依赖于默认路由和防火墙的重定向策略,因此更适用于为局域网主机服务,而不适合为Internet中的客户机提供服务。

 

案例:

·linux网关上,构建Squid为客户机访问Internet提供代理服务,设置ACL访问控制。

·在所有的局域网客户机上,只需要正确设置IP地址、默认网关,不需要手动指定代理服务器的地址、端口等信息。


Squid代理服务器_第2张图片



1.配置Squid支持透明代理

wKioL1hSI0-yhl3FAAACEP0Q1Zk192.png

wKiom1hSI0_hpPG6AAACjfRq-W4464.png

wKiom1hSI0-gNEQ8AAACC9FxaEc243.png

对于2.6以上版本的Squid服务,只要在http_port配置行加上一个transparent选项,就可以支持透明代理了。


2.设置iptables的重定向策略

wKioL1hSI1DBsDllAAADQLpq128197.png

在防火墙上为3128端口开启例外


wKioL1hSI1CTZw6dAAAOtMFMqOk050.png

设置重定向策略

控制类型REDIRECT:实现本机端口的重定向,此例中将访问网站协议HTTPHTTPS的外发数据交给本机的Squid服务

                  (3128端口)。

选项--to  端口号:指定映射的目标端口

 

客户机配置正确的IP和默认网关后,就可以访问网站服务器了,接下来通过设置ACL访问控制,实现有针对性的过滤。

 

3.ACL访问控制

在配置文件squid.conf中,ACL访问控制通过两个步骤:

第一、使用acl配置项定义需要控制的条件;

第二、通过http_access配置项对已定义列表做“允许”或“拒绝”访问的控制。

 

(1)定义访问控制列表

格式:acl 列表名称  列表类型  列表内容

 

[root@localhost ~]# vim /etc/squid.conf

……

acl SAFEPORT port 80 443

acl MALAN src 192.168.1.0 /24                    //客户机网段

acl MEIDAFILE urlpath_regex -i \.mp4$ \.avi$     //.mp4.avi结尾的URL路径

acl WORKING time MWTHF 0830-1730                               //时间为周一至周五830~1730

……

当要限制的同一类对象较多时,可以使用独立的文件来存放,在acl配置行的列表内容处指定对应的文件位置即可。例如,要针对目标地址建立黑名单文件,操作如下:

[root@localhost ~]# mkdir /etc/squid

[root@localhost ~]# vim /etc/squid/ipblock.list    //建立目标IP地址名单

61.135.167.36

125.39.127.25

……

[root@localhost ~]# vim /etc/squid/dmblock.list    //建立目标域地址名单

.qq.com

.msn.com

.live.com

……

[root@localhost ~]# vim /etc/squid.conf

……

acl IPBLOCK dst /etc/squid/ipblock.list          //调用指定文件中的内容

acl DMBLOCK dstdomain /etc/squid/dmblock.list

 

常用的访问控制列表类型

src:源IP地址、网段、IP地址范围

dst:目标IP地址、网段、主机名

port:目标端口

dstdomain:目标域

time:上网时间,WTWHFAS表示一星期中的各天的英文缩写(H-Thursday

maxconn:每个客户机的并发连接数

url_regex:目标资源的URL地址,-i表示忽略大小写(例如:^rtsp://

urlpath_regex:目标资源的整个URL路径(例如:\.mp3$

 

(2)设置访问权限

使用http_access配置项来进行控制,需要注意的是,http_access配置行必须放在对应的acl配置行之后。

格式:http_access  allowdeny  列表名……

 

[root@localhost ~]# vim /etc/squid.conf

……                            //acl列表

http_access deny MYLAN MEDIAFILE IPBLOCK DMBLOCK        

                                //禁止客户机下载MP4avi类型文件,禁止客户机访问黑名单中的IP地址、网站域

http_access allow MYLAN WORKTIME        //允许客户机在工作时间上网

http_access deny all                    //默认策略禁止所有客户机使用代理

 

执行访问控制时,squid将按照各条规则的顺序一次进行检查,如果找到一条相匹配的规则就不再向后搜索,需要注意的是:

·没有设置任何规则时:Squid服务器拒绝客户端的请求

·有规则但找不到相匹配的项:Squid将采用与最后一条规则的相反的权限


四、Squid日志分析

Sarg全名是Squid Analysis Report Generator,是一款Squid日志分析工具,采用HTML格式,详细列出每一位用户访问Internet的站点信息、时间占用信息、排名、连接次数、访问量等。

 

1.安装GD

[root@localhost ~]# yum -y install gd gd-devel

 

2.安装sarg

wKiom1hSI1CCArmcAAAEdWA0grY881.png

wKioL1hSI1DTvTx7AAAHywa9oiw784.png

上述配置项的含义:

--sysconfdir=/etc/sarg      //配置文件目录,默认是/usr/local/etc

--enable-extraprotection    //添加额外的安全保护

 

3.配置

[root@localhost ~]# vim /etc/sarg/sarg.conf

access_log  /usr/local/squid/var/logs/access.log     //指定squid的访问日志文件

title  Squid User Access Report”                                                //网页标题

output_dir  /var/www/html/sarg                        //sarg报告的输出目录

user_ip  no                                           //使用户名显示

exclude_hosts  /usr/local/sarg/noreport               //指定不计入排序的站点列表文件

topuser_sort_filed connect BYTES reverse

                            //top排序中,指定连接次数、访问字节数,采用降序排列,升序将reverse换成normal

user_sort_filed connect reverse                       //对于用户访问记录,连接次数按降序排列

overwrite_report  no                                  //当那个日期报告已经存在,是否覆盖报告

charset  UTF-8                                        //使用字符集

weekdays  0-6                                         //指定top排序时的星期周期,0为周日

hours  9-12,14-16,18-20                               //指定top排序时的时间周期

www_document_root  /var/www/html                      //网页根目录

 

4.运行

上述配置中,添加了不计入排序的站点,需要存在这个文件中:

[root@localhost ~]# touch /usr/local/sarg/noreport

这个文件中添加的 域名将不被显示在排序中

 

[root@localhost ~]# ln -s /usr/local/sarg/bin/sarg  /usr/local/bin    //设置符号链接

[root@localhost ~]# sarg                                              //启动一次记录


5.验证

在客户端上访问http://192.168.1.254/sarg/,可以看到报表。

 

6.计划任务

可以将sarg做成计划任务,定期执行

例如,写个日报告:

[root@localhost ~]# vim /usr/local/sarg/daily.sh

#/bin/bash

#get current date

TODAY=$(date +%d/%M/%Y)

#get one week ago today

YESTERDAY=$(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 $YESTERDAY-$TODAY &> /dev/null

exit 0

 

[root@localhost ~]# chmod +x /usr/local/sarg/dalily.sh

[root@localhost ~]# crontab -e

00 00 * * *  /usr/local/sarg/daily.sh

[root@localhost ~]# chkconfig crond on