Squid-4.1ACL访问控制、日志分析和反向代理
ACL访问控制
Squid提供了强大的代理控制机制,通过结合设置ACL(Access Control List,访问控制列表)并进行限制,可以针对源地址、目标地址、访问的URL路径、访问时间等各种条件进行过滤。
在配置文件squid.conf中,ACL访问控制通过以下两个步骤实现:其一,使用acl配置项定义需要控制的条件;其二,通过http_access配置项对已定义的列表做“allow”或者“deny”访问控制。本文还是基于上篇博客的透明代理环境下完成。
1、定义访问控制列表
每一行acl配置可以定义一条访问控制列表,格式如下:
acl 列表名称 列表类型 列表内容
“列表名称“可以自行指定,用来识别控制条件,见名知意;“列表类型”必须使用Squid预定义的值,对应不同类别的控制条件;“列表内容” 是要控制的具体对象,不同类型的列表所对应的内容也不一样,也可以有很多值(以空格分隔,都为“或”的关系)。下面是常用的访问控制列表类型:
src 源IP地址、网段、IP地址范围
dst 目标IP地址、网段、主机名
port 目标端口
dstdomain 目标域,匹配域内所有的站点
time 使用代理服务的时间段,使用英文缩写星期一到星期日为MTWHFAS
maxconn 每个客户机的并发连接数
url_regex 目标资源的URL地址,-i表示忽略大小写
urlpath_regex 目标资源的整个URL路径,-i表示忽略大小写
在执行访问控制的时候,Squid将按照各条规则由上而下依次访问,如果找到相匹配的规则就不在往后搜索。因此,规则的顺序安排非常重要。以下两种默认情况需要我们注意:
1、没有设置任何规则的时候,Squid服务将拒绝客户端请求
2、有规则但是找不到匹配项,Squid将才有与最后一条相反的权限,即如果最后一条规则是allow,就拒绝客户端请求,否则就允许该请求。
对src来源地址控制
可以看到本来是可以访问到的,下面在配置文件中设置对192.168.100.130地址进行控制。修改完后,重启服务。
重新使用客户机再访问web服务器发现已经访问不了。
对时间区间控制
我们将上面基于src来源地址的语句注释掉,重新写对于访问时间的控制,今天是星期二,那我这里为了体现实验效果,就控制客户机星期二不能访问Web服务器。配置如下,重启服务。还有很多中控制方式,这里就不一一赘述了,可以自行尝试。
Squid日志分析
Sarg全名是Squid Analysis Report Generator,这是一款Squid日志分析工具,采用HTML格式,详细列出每一位用户访问Internet的站点信息,时间占用信息,排名,连接次数和访问量。Sarg部署如下:
安装GD库
GD库主要是负责图像处理的,在网站上GD库通常用来生成缩略图,或者用来对图片加水印,或者用来生成汉字验证码,或者对网站数据生成报表等。这里我要先将Squid代理服务器上一块网卡换成NAT在线用yum安装GD库(不容易啊!)这是我换完NAT模式的网卡信息。
[root@promote ~]# yum install -y gd gd-devel
额,提示已经安装过了,好吧,应该是上回已经做过了。继续把网卡配置换回来。
安装Sarg
首先到网上找到Sarg的安装包,这里我提供一个网址,大家直接去下载就行了。
https://sourceforge.net/projects/sarg/
[root@promote ~]# mkdir /usr/local/sarg #为sarg创建安装目录
[root@promote ~]# tar zxvf sarg-2.3.11.tar.gz -C /opt/ #将sarg解压到指定目录
[root@promote ~]# cd /opt/sarg-2.3.11/ #到sarg目录中进行编译安装
[root@promote sarg-2.3.11]# ./configure --prefix=/usr/local/sarg \ #这里指定安装目录
> --sysconfdir=/etc/sarg \ #指定配置文件目录
> --enable-extraprotection #开启额外保护功能
配置完后,进行编译和安装
[root@promote sarg-2.3.11]# make && make install
配置
到sarg配置文件中,一项一项的进行修改。
[root@promote /]# vim /etc/sarg/sarg.conf #开始修改配置文件
access_log /usr/local/squid/var/logs/access.log #指定访问日志文件
title "Squid User Access Reports" #网页标题
output_dir /var/www/html/squid-reports #报告输出目录
user_ip no #使用用户名显示
exclude_hosts /usr/local/sarg/noreport #不计入排序的站点列表文件
topuser_sort_field connect reverse #top排序中有连接次数、访问字节、降序排列升序是normal
user_sort_field connect reverse #用户访问记录 连接次数、访问字节按降序排序
overwrite_report no #同名日志是否覆盖
mail_utility mailq.postfix #发送邮件报告命令
charset UTF-8 #使用字符集
weekdays 0-6 #top排行的星期周期
hours 0-23 #top排行的时间周期
www_document_root /var/www/html #网页根目录
[root@promote /]# touch /usr/local/sarg/noreport
#创建上述不计入站点文件,添加的域名将不被显示在排序中
[root@promote /]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/
#建立软链接,方便使用命令
[root@promote /]# systemctl start httpd.service
#因为我们要在网页里访问日志,需要我们开启httpd服务
运行
直接执行sarg即可启动依次记录,会看到下面提示信息。然后我们去网页中访问,管理页面。我们也能周期性计划任务执行每天生成报告。
[root@promote /]# sarg -l /usr/local/squid/var/logs/access.log -o /var/www/html/squid-reports/ -z -d $(date -d "1 day ago" +%d/%m/%Y)-$(date +%d/%m/%Y)
#这个就是生成昨天到今天的日志报告
Squid反向代理
许多大型门户网站架构都采用反向代理加速,使用比较多的就是Nginx和squid。如下图所示,通过squid反向代理可以加速网站访问速度,可将不同的URL请求发送不同的Web服务器上,同时互联网只能看到反向代理服务器的地址,加强了网站的安全。
反向代理和正向代理区别
到这里肯定有很多同学和我一样困惑,什么叫反向代理,什么叫正向代理?这里我用两句话来概括下,多读几遍,大家就自然而然明白了。
- 正向代理代理的对象是客户端(传统代理),反向代理代理的对象是服务端
- 正向代理中,客户端对于服务端是透明的(不知道服务端真实IP);反向代理中,服务端对于客户端是透明的(不知道真实服务器的IP,知道的可能是代理服务器的)
Squid反向代理原理
- Squid反向代理服务器位于本地Web服务器和Internet之间,客户端请求访问Web服务器时,DNS将访问的域名解析为Squid反向代理服务器的IP地址,客户端将访问Squid代理服务器。
- 如果Squid反向代理服务器缓存了该请求的资源,则将该请求的资源返回给客户端,否则反向代理服务器将向后台的Web服务器请求资源,然后将应答资源返回给客户端,同时也将该资源在本地缓存一份,供下一个请求使用。
这里我需要把试验环境调整以下,将代理服务器还是配置成单网卡的普通代理。
- 代理服务器IP:192.168.100.100
- 客户端IP:192.168.100.110
- 真实服务器1(win7):192.168.100.130
- 真实服务器2(centos7):192.168.100.140
修改配置文件加入下面几行代码,很重要的就是一定要关防火墙!!由于之前做透明代理 ,防火墙还有策略在里面,导致访问不了:
[root@localhost run]# vim /etc/squid.conf
acl web1 dstdomain www.yun.com
acl web2 dstdomain www.yun.com
#定义两个个基于域名的控制列表,分别命名为web1,web2
http_access allow web1 web2
#允许以web1,web2为目标域名的访问
http_port 192.168.100.100:80 accel vhost vport
#将端口监听在 192.168.100.100的80端口上,accel 指启用加速模式,vhost,vport用于转发请求
cache_peer 192.168.100.130 parent 80 0 no-query originserver round-robin weight=1 name=web1
#cache_peer 指定后端服务器地址,80 为后端服务端口,0 为 ICP 端口号(多个 Squid 时用),originserver 指定资源服务器,round-robin指使用轮询方式,weight指的是权重,自由分配,name 指定一个别名
cache_peer 192.168.100.140 parent 80 0 no-query originserver round-robin weight=1 name=web2
#和上面的一样
实验结果成功,访问www.yun.com,真实服务器会使用轮询的方式,分别轮流访问两台web服务器。
Squid 4.1之前做反向代理的区别
Squid 4.1之前做做反向代理主要用下面几行代码:
http_port 192.168.100.100:80 accel vhost vport
cache_peer 192.168.100.130 parent 80 0 no-query originserver round-robin weight=1 name=web1
cache_peer 192.168.100.140 parent 80 0 no-query originserver round-robin weight=1 name=web2
cache_peer_domain web1 web2 www.yun.com
[root@localhost run]# squid -k parse #检查配置文件语法
2018/07/24 22:40:38| ERROR: Directive 'cache_peer_domain' is obsolete.
#cache_peer_domain指令已经废弃
2018/07/24 22:40:38| cache_peer_domain : Replace with dstdomain ACLs and cache_peer_access.
#cache_peer_domain可以用ACL域名控制和cache_peer_access代替
所以这里一定要注意,版本更换对于我们搭建服务影响还是挺大的,一定要与时俱进!!