二、透明代理
透明代理提供的服务功能与传统代理是一致的,但是其“透明”的实现依赖于默认路由和防火墙的重定向策略,因此更适用于局域网主机服务,而不适合为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”的提示
用来下载测试的文件可以通过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/目录,可看到报表
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