我的上一篇博客中介绍了squid服务的传统代理和透明代理,用的安装方式是yum在线安装,这一篇中我将采用手工编译的方式来介绍一下其他功能

实验环境:

角色名称     系统环境     IP地址

squid          CentOS7     192.168.199.129

Apache1    CentOS7      192.168.199.128

Apache2    CentOS7      192.168.199.130

客户机        win7             192.168.199.133


squid3.5源码包链接 :https://pan.baidu.com/s/1Il8z8QNCa-F4CIuDhvkjxQ     提取码:f1m2

sarg2.3.7源码包链接:https://pan.baidu.com/s/1YninQTO0lyLgalujQKO77Q    提取码:ca7l

一、手工编译安装squid

yum install gcc gcc-c++ make -y  #安装编译环境

tar zxvf squid-3.5.23.tar.gz -C /opt   #解压软件包

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第1张图片

上述选项含义如下:

./configure --prefix=/usr/local/squid \   #安装目录

 --sysconfdir=/etc \   #配置文件目录

 --enable-arp-acl \   #MAC地址管理

 --enable-linux-netfilter \    #使用内核过滤

 --enable-linux-tproxy \    #支持透明模式

 --enable-async-io=100 \   #异步I/O,提升储存性能

 --enable-err-language="Simlify_Chinese" \   #错误信息的显示语言

 --enable-underscore \   #允许URL中有下划线

 --enable-poll \    #使用Poll()模式,提升性能

 --enable-gnuregex   #使用GNU正则表达式


make && make install   #编译安装


ln -s /usr/local/squid/sbin/* /usr/local/sbin/   #建立软链接

useradd -M -s /sbin/nologin squid    #创建管理用户

chown -R squid.squid /usr/local/squid/var/ 

  

vim /etc/squid.conf

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第2张图片

cache_effective_user squid   #这一项指定squid的程序用户,用来设置初始化,否则启动不成功

cache_effective_group squid   #默认为cache_effective_user基本组


squid -z   #-z选项用来初始化缓存目录

squid   #开启squid服务

二、创建squid的启动脚本

image.png

#!/bin/bash

#chkconfig: 2345 90 25

PID="/usr/local/squid/var/run/squid.pid"

CONF="/etc/squid.conf"

CMD="/usr/local/squid/sbin/squid"

 

case                "$1" in

   start)           

      netstat -ntap | grep squid &> /dev/null

      if [ $? -eq 0 ]

      then

        echo "squid is running"

        else

        echo "正在启动 squid..."

        $CMD

      fi

    ;;

   stop)

      $CMD -k kill &> /dev/null

      rm -rf $PID &> /dev/null

    ;;

   status)

      [ -f $PID ] &> /dev/null

         if [ $? -eq 0 ]

           then

             netstat -ntap | grep squid

           else

             echo "squid is not running"

         fi  

     ;;  

    restart)

       $0 stop &> /dev/null

       echo "正在关闭 squid..."

           $0 start &> /dev/null

       echo "正在启动 squid..."

     ;;

    reload)

       $CMD -k reconfigure

     ;;

    check)

       $CMD -k parse

     ;;

     *)

         echo "用法: $0{start|stop|status|reload|check|restart}"

     ;;

esac


chmod +x squid

chkconfig --add squid

chkconfig --level 35 squid on

service squid check       #检查语法

squid服务安装完成后就可以配置代理功能了,具体配置过程我在上一篇博客中有详细讲解。

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第3张图片


三、ACL访问控制

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

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

1 定义访问控制列表,格式如下:

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

 常用的访问控制列表类型



列表类型 用途
src 源IP地址,网段,IP地址范围
dst 目标IP地址,网段,主机名
port 目标端口
dstdomain 目标域,匹配域内所有站点
time 使用代理服务的时间段字母表示一星期中各天的英文缩写,星期一到星期天分别为M T WH F A S
maxconn 每个客户机的并发连接数
url_regex 目标资源的URL地址,-i表示忽略大小写
urlpath_regex 目标资源的整个URL地址,-i表示忽略大小写

2 设置访问权限

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

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

下面我通过实验来说明:

     (1)基于源地址进行控制


vim /etc/squid.conf

#在配置文件中添加acl配置行,名称为test,内容为我的客户机地址

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第4张图片

#在配置行下面我定义了禁止192.168.199.133进行访问

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第5张图片


service squid stop

service squid start  #重新启动squid服务

#再次访问Apache已经是无法访问了

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第6张图片

(2)创建相应的列表进行限制

  当需要限制的同一类对象较多时,可以使用独立的文件来存放,在ACL配置行的列表内容处指定相应的文件位置即可。

[root@promote init.d]# vim /etc/squid.conf

[root@promote init.d]# mkdir /etc/squid

[root@promote init.d]# vim /etc/squid/list01    #指定一个名单

192.168.199.0/24

acl list01 src "/etc/squid/list01"   #在列表中指定文件的路径

 

http_access allow list01   #设置访问权限

在配置ACL时,以下两种默认情况需要注意一下:

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

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


四、squid日志分析

sarg是一款squid日志分析工具,采用HTML格式,详细列出每一位用户访问Internet的站点信息,时间占用信息,排名,连接次数和访问量等。

部署过程如下:

1 安装GD库和Apache


yum install gd gd-devel -y   #安装GD

yum install httpd -y   #安装Apache

systemctl start httpd.service   #开启Apache

2 安装sarg


tar zxvf sarg-2.3.7.tar.gz -C /opt   #解压sarg软件包

cd /opt/sarg-2.3.7/   #到sarg的目录下

 

./configure --prefix=/usr/local/sarg --sysconfdir=/etc/sarg --enable-extraprotection

--prefix=/usr/local/sarg   #指定安装目录

--sysconfdir=/etc/sarg    #配置文件目录

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

make && make install 

3 配置


vim /etc/sarg/sarg.conf

7 access_log /usr/local/squid/var/logs/access.log    #指定squid的访问日志文件

25 title "Squid User Access Reports"    #网页标题

120 output_dir /var/www/html/squid-reports   #sarg报告输出目录

178 user_ip no     #使用用户名显示

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

183 topuser_sort_field connect reverse       #在top排序中,指定连接次数,访问字节数,采用降序排序

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

256 overwrite_report no                      #当那个日期报告已存在,是否覆盖报告

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

433 charset UTF-8    #使用字符集                     

517 weekdays 0-6     #指定top排序时的星期周期

522 hours 7-12,14,16,18-20   #指定top排序是的时间周期

632 www_document_root /var/www/html   #网页根目录

4 运行

上述配置中,添加了不计入排序的站点,所以需要创建下面这个文件


touch /usr/local/sarg/noreport     #创建不计入排序的站点

ln -s /usr/local/sarg/bin/sarg  /usr/local/bin/   #建立软链接

sarg   #开启服务

  

5 验证

输入squid地址,指定sarg的报告输出目录即可进行访问

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第7张图片

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第8张图片



五、squid反向代理

原理:1 squid反向代理服务器位于本地WEB服务器和Internet之间,客户端请求访问WEB服务器时,DNS将访问的域名解析为squid反向代理服务器的IP地址,客户端将访问squid代理服务器

           2 如果squid反向代理服务器中缓存了该请求的资源,则将该请求的资源返回给客户端,否则反向代理服务器将向后台的WEB服务器请求资源,然后将应答资源返回给客户端,同时也将该资源缓存在本地,供下一个请求者使用


(1)修改配置文件实验过程:

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第9张图片

vim /etc/squid.conf

http_port 192.168.199.129:80 accel vhost vport   #监听本地的80端口,启用加速模式,开启虚拟主机和虚拟端口

cache_peer 192.168.199.128 parent 80 0 no-query originserver round-robin weight=1 name=web1   #指定节点服务器的真实IP,端口为80,不开启ICP端口,不进行查询,采用轮询机制,权重为1,别名为web1

cache_peer 192.168.199.130 parent 80 0 no-query originserver round-robin weight=1 name=web2

cache_peer_domain web1 web2 www.yun.com   #定义域名为www.yun.com


systemctl stop httpd.service    #需要关闭squid服务器的80端口,不然会出现冲突

service squid stop

service squid start

(2)设置两台Apache首页为不同界面便于区分

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第10张图片

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第11张图片


(3)修改代理服务器的端口,因为在配置文件中,我已经将端口改为80

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第12张图片


(4)在客户机上使用域名进行访问

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第13张图片

手工编译squid服务,详解squidACL访问控制,日志分析和反向代理(内含源码包)_第14张图片