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代替

所以这里一定要注意,版本更换对于我们搭建服务影响还是挺大的,一定要与时俱进!!