二、透明代理

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

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

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

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

wKioL1Xi2tmhgzSyAAFqG8k4sLc046.jpg 使用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预定义类型有很多种,常用的包括源地址、目标地址、访问时间、访问端口等

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

[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代理服务

拒绝下载超过大小的文件

用来下载测试的文件可以通过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/目录,可看到报表

sarg报表

6、计划任务

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

如下示例,写个日报告

[root@localhost ~]# vim /usr/local/sarg/daily.sh //示例:每日报告,内容如下: 1 2 3 4 5 6 7 #!/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