一、传统代理


    使用传统代理的特点在于,客户机的相关程序(如IE浏览器、QQ聊天工具)必须指定代理服务器的地址、端口等信息。下面通过一个简单的应用案例来学习传统代理的配置和使用


     基于Internet网络环境,案例的主要需求描述如下:


  • 在Linux主机B上,构建Squid为客户机访问各种网站提供代理服务,但禁止通过代理下载超过10MB大小的文件


  • 在客户机C上,指定主机B作为Web访问代理,以隐藏自己的真实IP地址


Squid代理服务器--实战篇_第1张图片

    针对上述实验环境,主机B作为代理服务器必须正确构建Squid服务,并允许客户机使用代理;若要客户机通过代理以http://www.linuxfan.cn/的域名形式访问,则代理服务器本身必须能够正确解析该域名。主机C作为客户机,需要为浏览器等程序指定所使用的代理服务器地址、端口号等信息,主机A作为测试网站,需要启用httpd服务


    关于httpd服务器、DNS服务器的构建,请参考相关的资料,这里不在重复讲解。下面主要介绍Squid服务器的配置、客户机的代理配置、以及代理服务的验证方法


1、Squid服务器的配置


    配置Squid实现传统代理服务时,需要注意添加http_access  allow  all访问策略,以便允许任意客户机使用代理服务。除此之外,为了限制下载的文件大小,还需设置reply_ body_max_size项,其他各种参数均可保持默认


(1)修改squid.conf配置文件


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

http_port 3128

reply_body_max_size 10 MB                    //允许下载的最大文件大小(10MB)

http_access allow all                        //放在http_access  deny  all之前

......                                       //省略部分内容


在防火墙上添加允许策略


[root@localhost ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT

[root@localhost ~]# service iptables save


(2)重载squid服务


    修改squid.conf配置文件以后,需要重新加载方可生效,执行“service  squid  reload”或者“squid  -k  reconfigure”,都可重新加载服务配置


[root@localhost ~]# service squid reload


2、客户机的代理配置


    在IE浏览器中,选择“工具”→“Internet选项”对话框,在“连接”选项卡中的“局域网(LAN)设置”选项组中单击“局域网设置”按钮,弹出“局域网(LAN)设置”对话框


Squid代理服务器--实战篇_第2张图片

                                                                                                                                                IE浏览器的代理设置


    若要在Linux客户机的命令行界面中使用代理服务器(如elinks网页浏览器、wget下载工具),必须通过环境变量来指定代理服务器的地址、端口等信息(大小写区分)


[root@localhost ~]# vim /etc/profile

......                //省略部分内容

HTTP_PROXY=http://172.16.1.20:3128                     //为使用HTTP协议指定代理

HTTPS_PROXY=http://172.16.1.20:3128                    //为使用HTTPS协议指定代理

FTP_PROXY=http://172.16.1.20:3128                      //使用FTP协议指定代理

NO_PROXY=http://172.16.2.,172.16.3.                    //对两个局域网不使用代理

export HTTP_PROXY HTTPS_PROXY FTP_PROXY NO_PROXY


[root@localhost ~]# source /etc/profile


3、代理服务的验证方法


    在客户机172.16.1.10中通过浏览器访问目标网站http://172.16.1.30,然后观察Squid代理服务器、Web 服务器的访问日志,以验证代理服务是否发挥作用


(1)查看Squid访问日志的新增记录


    在Squid代理服务器中,通过跟踪Squid服务的访问日志文件,应该能够发现客户机172.16.1.10访问网站服务器172.16.1.30的记录


[root@localhost ~]# tail /usr/local/squid/var/logs/access.log

1440927958.950      0 172.16.1.10 TCP_MISS/200 382 GET http://172.16.1.30/ - HIER_DIRECT/172.16.1.30 text/html

1440927996.276      0 172.16.1.10 TCP_CLIENT_REFRESH_MISS/304 235 GET http://172.16.1.30/ - HIER_DIRECT/172.16.1.30 -


(2)查看Web访问日志的新增记录


    在被访问的Web服务器中,通过跟踪httpd服务的访问日志文件,应该能够发现来自代理服务器172.16.1.20的访问记录。这说明当客户机使用代理以后,Web服务器并不知道客户机的真实IP地址,因为实际行是由代理服务器替它在访问


[root@localhost ~]# tail /var/log/httpd/access_log 


172.16.1.20 - - [30/Aug/2015:17:53:20 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"


    当从客户机再次访问同一Web页面时,Squid访问日志中会增加新的记录,但Web访问日志中的记录不会有变化(除非页面变更或执行强制刷新等操作)。这说明当客户机重复访问同一静态页面时,实际上是由代理服务器通过缓存提供的


二、透明代理


    透明代理提供的服务功能与传统代理是一致的,但是其“透明”的实现依赖于默认路由和防火墙的重定向策略,因此更适用于局域网主机服务,而不适合为Internet中的客户机提供服务。下面也通过一个简单的应用案例来学习透明代理的配置和使用


    基于局域网主机通过Linux网关访问Internet的环境,案例的主要需求描述如下


  • 在Linux网关上,构建Squid为客户机访问Internet提供代理服务


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


Squid代理服务器--实战篇_第3张图片

                                          使用Squid透明代理


   针对上述实验环境,透明代理的关键在于Linux网关服务器,而对于客户机仅需正确设置网络地址、默认网关,而并不需要指定代理服务器(若指定了反而易出错)


    关于客户机的DNS解析工作,最好还是通过正常的DNS服务器来提供,不建议抛给代理服务器来处理。下面主要介绍Squid服务的透明代理设置、防火墙策略设置,其他配置操作请参考前面的传统代理构建过程


1、配置Squid支持透明代理


    Squid服务的默认配置并不支持透明代理,因此需要调整相关设置。对于2.6以上版本的Squid服务,只要在http_port配置行加上一个“transparent(透明)”选项,就可以支持透明代理了


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

......      //省略部分内容

http_port 192.168.4.1:3128 transparent             //只在其中一个IP地址上提供服务


[root@localhost ~]# service squid reload


2、设置iptables的重定向策略


    透明代理中的Squid服务实际上是构建在Linux网关主机上的,因此只需正确设置防火墙策略,就可以将局域网主机访问Internet的数据包转交给Squid进行处理。这需要用到iptables的REDIRECT(重定向)策略。其作用是实现本机端口的重新定向,将访问网站协议HTTP、HTTPS的外发数据包转发交给本机的Squid服务(3128端口)


    REDIRECT也是一种数据包控制类型,只能在nat表的PREROUTING或OUTPUT链以及被其调用的链中使用,通过“--to-ports  端口号”的形式来指定映射的目标端口。本例中可以将来自局域网端192.168.4.0/24且访问HTTP、HTTPS等协议的数据包转交给运行在本机3128端口上的Squid服务处理


    防火墙做重定向操作,将访问本机80、443端口的请求重定向到3128端口


[root@localhost ~]# iptables -t nat -I PREROUTING -i enp0s8 -s 192.168.4.0/24 -p tcp --dport 80 -j REDIRECT --to 3128


[root@localhost ~]# iptables -t nat -I PREROUTING -i enp0s8 -s 192.168.4.0/24 -p tcp --dport 443 -j REDIRECT --to 3128


[root@localhost ~]# service iptables save


    由于FTP协议涉及多个端口、多个连接,虽然也可以通过HTTP代理进行访问,但使用透明代理不便实现,因此最佳做法仍然是采用传统代理的方式------手动指定代理服务器的地址、端口号


3、验证透明代理的使用


    为了验证透明代理的效果,如果存在手动指定的代理服务器设置应在客户机中将其去除。例如,在IE或Firefox浏览器的连接设置中不要勾选“使用代理服务器”;在Linux客户机的命令行界面中,可以通过Unset命令清除HTTP_PROXY、HTTPS_PROXY等变量


[root@localhost ~]# unset HTTP_PROXY HTTPS_PROXY


    在客户机192.168.4.10中通过浏览器访问目标网站http://172.16.1.30,然后观察Squid代理服务器、Web服务器的访问日志,以验证透明代理是否发挥作用。操作方法可参考传统代理验证,验证结果为在Squid代理服务器中,应该能够发现客户机192.168.4.10访问网站服务器172.168.1.30的记录;在被访问的Web服务器中,应该能够发现来自代理服务器172.16.1.1的访问记录 


三、ACL访问控制


    Squid提供了强大的代理控制机制,通过合理设置ACL(Access  Control  List,访问控制列表)并进行限制,可以针对源地址、目标地址、访问的URL路径、访问的时间等各种条件进行过滤


    在配置文件squid.conf中,ACL访问控制通过以下两个步骤来实现:其一,使用acl配置项定义需要控制的条件;其二,通过http_access配置项对已定义的列表做“允许”或“拒绝”访问的控制


1、定义访问控制列表


    每一行acl配置可以定义一条访问控制列表,格式如下所示


    acl  列表名称  列表类型  列表内容  ...


    其中,“列表名称”由管理员自行指定,用来识别控制条件;“控制类型”必须使用Squid预定义的值,对应着不同类别的控制条件;“列表内容”是要控制的具体对象,不同类型的列表所对应的内容也不一样,可以有多个值(以空格分割,为“或”的关系)


    通过上述格式可以发现,定义访问控制列表时,关键在于选择“列表类型”并设置具体的条件对象。Squid预定义类型有很多种,常用的包括源地址、目标地址、访问时间、访问端口等


列表类型 列表内容示例 含义/用途
src

192.168.1.168

192.1681.0/24

192.168.1.0-192.168.3.0/24

源IP地址、网段、IP地址范围
dst

216.163.137.3

61.135.167.0/24

www.playboy.com

目标IP地址、网段、主机名
port
80  443  8080  20  21 目标端口
dstdomain .qq.com  .msn.com 目标域,匹配域内所有站点
time

MTWHF  8:30-17:30

12:00-13:00

AS

字母表示一星期天中各天的缩写

M--Monday

T--Tuesday

W--Wednesdat

H--Thursday

F--Fridat

A--Saturdat

S--Sunday

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

url_regex  -i  ^rtsp://

url_regex  -i  ^emule://

目标资源的URL地址,-i表示忽略大小写
urlpath_regex

urlpath_regex  -i  sex  adult

urlpath_regex  -i  \.mp3$

目标资源的整个URL路径,-i表示忽略大小写


    在定义访问控制列表时,应结合当前网络环境正确分析用户的访问需求,准确定义使用代理服务的控制条件。例如,针对不同的客户机地址,需要限制访问的目标网站、特定的时间段......,分别定义列表


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

......

acl localhost src  127.0.0.1/255.255.255.255           //源地址为127.0.0.1

acl MYLAN src 192.168.1.0/24  192.168.4.0/24           //客户机网段

acl to_localhost dst 127.0.0.0/8                       //目标地址为127.0.0.0/8网段

acl MC20 maxconn 20                                    //最大并发连接20

acl BlankURL url_regex -i ^rtsp:// ^emule://           //以rtsp://等开头的URL

acl MEDIAFILE urlpath_regex -i \.mp3& \.mp4& \.rmvb&   //以.mp3、.mp4等结尾的URL路径

acl WORKTIME time MTWHF 08:30-17:30                    //时间为周一至周五08:30-17:30


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


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

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

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

61.135.167.36

125.39.127.25

60.28.14.0/24


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

.qq.com

.msn.com

.live.com

.verycd.com


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

......

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

acl DMBLOCK dstdomain "/etc/squid/dmblock.list"


2、设置访问权限


    定义好各种访问控制列表以后,需要使用http_access配置项来进行控制。必须注意的是,http_access配置行必须放在对应的acl配置行之后。每一行http_access配置确定一条访问控制规则。格式如下所示


    http_access  allow或deny  列表名  ......


    在每一条http_accsess规则中,可以同时包含多个访问控制列表名,各个列表之间以空格分隔,为“与”的关系,表示必须满足所有访问控制列表对应的条件才会进行限制。需要使用取反条件时,可以在访问控制列表前添加“!”符号


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

......

http_access deny MYLAN MEDIAFILE                   //禁止客户机下载MP3、MP4等文件

http_access deny MYLAN IPBLOCK                     //禁止客户机访问黑名单中的IP地址

http_access deny MYLAN DMBLOCK                     //禁止客户机访问黑名单中的网站域

http_access deny MYLAN MC20                        //客户机的并发连接超过20时将被阻止

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

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


    执行访问控制时,Squid将按照各条规则的顺序依次进行检查,如果找到一条相匹配的规则就不再向后搜索(这点与iptables的规则匹配类似)。因此,规则的顺序安排是非常重要的,以下两种默认情况需要我们注意


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


  • 有规则但找不到相匹配的项:Squid将采用最后一条规则相反的权限,即如果最后一条规则时allow,就拒绝客户机的请求,否则允许该请求


    通常清空下,把最常用的控制规则放在最前面,以减少Squid的负载。在访问控制的总体策略上,建议采用“先拒绝后允许”或“先允许后拒绝”的方式,最后一条规则设为默认策略,设置“http_access  allow  all”或者“http_access  deny  all”


3、验证访问控制效果


    关于Squid服务的访问控制效果,无外乎两种情况:一种是能够正常访问,另一种时禁止访问。当客户机的代理访问请求被Squid服务被拒绝时,在浏览器中会看到ERROR报错页面,具体内容会根据限制条件不同有些细小差别


(1)测试访问权限限制


    对于使用http_access规则拒绝访问的情况(如访问被禁止的网站或者禁止的时间段访问),浏览器的报错页面中出现“Access  Denied”的提示


Squid代理服务器--实战篇_第4张图片

                                                                                                                                            拒绝使用Squid代理服务


Squid代理服务器--实战篇_第5张图片

                                                                                                                                            拒绝下载超过大小的文件


    用来下载测试的文件可以通过dd命令生成。例如,若限制的大小为10MB,则可以在目标网站服务器中创建一个15MB的测试文件


[root@localhost ~]# dd  if=/dev/zero  of=/var/www/html/file1.tgz  bs=1MB  count=15


四、Squid日志分析


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


    Sarg部署过程如下所述


1、安装GD库


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


2、安装sarg



[root@localhost ~]# mkdir /usr/local/sarg

[root@localhost ~]# tar -zxf sarg-2.3.9.tar.gz 

[root@localhost ~]# cd sarg-2.3.9/

[root@localhost sarg-2.3.9]# ./configure --prefix=/usr/local/sarg --sysconfdir=/etc/sarg --enable-extraprotection && make && make install


    上述配置项含义如下


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

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


3、配置



[root@localhost ~]# 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/squid-reports              //sarg报告的输出目录

user_ip no                                          //使用用户名显示

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

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

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

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

mail_utility mailq.postfix                          //发送邮件报告的命令

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 squid]# touch /usr/local/sarg/noreport


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


    直接执行sarg即可启动一次记录,建立设置符号链接,然后执行sarg,会看到提示信息


[root@localhost squid]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/

[root@localhost ~]# sarg 

SARG: Records in file: 156, reading: 100.00%

SARG: Successful report generated on /var/www/html/squid-reports/2015Aug30-2015Aug30


5、验证


    在sarg.conf配置中可设置字体、颜色等信息,方便查询。多次执行sarg后,在客户端上访问/sarg/目录,可看到报表


Squid代理服务器--实战篇_第6张图片

                                                                                                                                                      sarg报表


6、计划任务


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


    如下示例,写个日报告


[root@localhost ~]# vim  /usr/local/sarg/daily.sh        //示例:每日报告,内容如下:

#!/bin/bash
# Get current date
TODAT=$(date)
# Get one week ago today
YESTERDAY=$(date -d "1 day ago")          
/usr/local/sarg/bin/sarg -l /usr/local/squid/var/logs/access.log -o /var/www/html/squid-reports -z -d $YESTERDAY-$TODAT &>/dev/null
exit 0


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

[root@localhost ~]# crontab -e                           //添加任务计划,每天00:00执行

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


[root@localhost ~]# systemctl enable crond