squid代理(反向传统透明)+ACL控制+日志分析

Posted TaKe___Easy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了squid代理(反向传统透明)+ACL控制+日志分析相关的知识,希望对你有一定的参考价值。

一、缓存代理概述

1.1 Web代理的工作机制

  • 缓存网页对象,减少重复请求
  • 代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址
  • 将获得的网页数据(静态Web元素)保存到缓存中并发送给客户机,以便下次请求相同的数据时快速相应

在这里插入图片描述

1.2 代理的基本类型

  • 传统代理:适用于lnternet,需明确指定服务端
  • 透明代理:客户机不需指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向给代理服务器处理
  • 反向代理:如果Squid反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的Web服务器请求资源,然后将请求的应答返回给客户端,同时也将应答缓存(静态)在本地,以供下一个请求者使用

1.3 使用代理的好处

  • 提高Web访问速度
  • 隐藏客户机的真实IP地址

二、Squid服务搭建

2.1 搭建环境

  • squid:192.168.131.10
  • apache:192.168.131.11
  • 客户端(Win10):192.168.131.5

2.2 安装squid服务

[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service 
[root@localhost ~]# yum -y install gcc gcc-c++ make
[root@localhost opt]# cd /opt/
[root@localhost opt]# ls
rh  squid-3.5.28.tar.gz
[root@localhost opt]# tar zxvf squid-3.5.28.tar.gz
[root@localhost opt]# cd squid-3.5.28/
[root@localhost squid-3.5.28]# ./configure --prefix=/usr/local/squid \\       【指定安装目录路径】
> --sysconfdir=/etc \\                                                        【指定配置文件路径】
> --enable-arp-acl \\                                                         【MAC地址管控,防止客户端使用IP欺骗】
> --enable-linux-netfilter \\                                                 【使用内核过滤】
> --enable-linux-tproxy \\                                                    【支持透明模式】
> --enable-async-io=100 \\                                                    【异步IO,提升存储性能】
> --enable-err-language="Simplify_Chinese" \\                                 【错误信息的显示语言】
> --enable-underscore \\                                                      【允许URL中又下划线】
> --enable-poll \\                                                            【使用poll模式】
> --enable-gnuregex                                                          【使用GUN正则表达式】

./configure --prefix=/usr/local/squid \\
--sysconfdir=/etc \\
--enable-arp-acl \\
--enable-linux-netfilter \\
--enable-linux-tproxy \\
--enable-async-io=100 \\
--enable-err-language="Simplify_Chinese" \\
--enable-underscore \\
--enable-poll \\
--enable-gnuregex
[root@localhost squid-3.5.28]# make -j2 && make install

【创建程序用户squid,保证系统安全性】
[root@localhost squid-3.5.28]# useradd -M -s /sbin/nologin squid
【创建软链接到路径环境变量便于系统识别squid】
[root@localhost squid-3.5.28]# ln -s /usr/local/squid/sbin/ * /usr/local/bin/
【为/usr/local/squid/var/目录递归指定属主属组】
[root@localhost squid-3.5.28]# chown -R squid.squid /usr/local/squid/var/


【该配置文件的运行机制是自上而下。即匹配之后,自此行之下不再进行匹配】
[root@localhost bin]# vim /etc/squid.conf 

【55行以上是访问权限允许的配置,以下是权限拒绝的操作,如果不需要配置权限拒绝的话,可以直接注释配置“允许所有访问”】
 55 # And finally deny all other access to this proxy
 
【因为机制是自上而下,所以需在deny之前。允许放通所有,即允许所有客户机使用代理服务】
 56 http_access allow all
 57 http_access deny all
 61 cache_effective_user squid                     【添加指定程序用户,用来设置初始化,运行时缓存的账号,不添加启动不成功】
 62 cache_effective_group squid                    【添加指定账户基本组】



[root@localhost bin]# squid -k parse               【检测配置文件语法是否正确】
[root@localhost bin]# squid -z                     【初始化缓存目录】
[root@localhost bin]# squid                        【启动服务】
[root@localhost bin]# netstat -napt | grep squid
tcp6       0      0 :::3128                 :::*                    LISTEN      57070/(squid-1)   


[root@localhost bin]# cd /etc/init.d/
[root@localhost init.d]# vim squid               【编写squid服务脚本】
#!/bin/bash
#chkconfig: 2345 90 252345是默认自启动级别,如果是-代表任何级别都不自启动】
                                                【90是启动优先级;25是停止优先级;优先级范围是0-100,数字越大,优先级越低】
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"

case "$1" in
   start)
     netstat -natp | 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 -natp | 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


[root@localhost init.d]# chmod +x /etc/init.d/squid     【给予该服务启动脚本可执行权限】
[root@localhost init.d]# chkconfig --add squid          【将该服务加入chkconfig管理】
[root@localhost init.d]# chkconfig --level 35 squid on  【可以在字符界面(3)和视图界面(5)中自启动】
[root@localhost init.d]# chkconfig --list squid         【查看能在几个运行级别中自启动】

注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。 

      要列出 systemd 服务,请执行 'systemctl list-unit-files'。
      查看在具体 target 启用的服务请执行
      'systemctl list-dependencies [target]'。
【2345是脚本中默认的自启动级别】
squid          	0:1:2:3:4:5:6:

2.3 传统代理

【在squid配置文件的63行插入以下3行】
[root@localhost init.d]# vim /etc/squid.conf

【指定缓存功能所使用的内存空间大小,便于保持访问教频繁的Web对象,容量最好为4的倍数,单位为MB。建议设为物理内存的四分之一】
 63 cache_mem 64 MB             

【允许用户下载的最大文件大小,以字节为单位。默认设置0表示不进行限制】
 64 reply_body_max_size 10 MB

【允许保存到缓存空间的最大对象大小,以KB为单位,超过大小限制的文件将不被缓存,而是直接转发给用户】
 65 maximum_object_size 4096 KB
  • 重启服务并查看
[root@localhost init.d]# service squid restart
正在关闭 squid...
正在启动 squid....
[root@localhost init.d]# netstat -natp | grep squid 
tcp6       0      0 :::3128                 :::*                    LISTEN      97458/(squid-1)  
  • 生产环境中还需要修改防火墙规则
[root@localhost init.d]# iptables -F
[root@localhost init.d]# setenforce 0
[root@localhost init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
[root@localhost init.d]# service squid reload
[root@localhost init.d]# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:squid

2.4 httpd配置

[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service 
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# netstat -natp | grep 80
tcp6       0      0 :::80                   :::*                    LISTEN      44106/httpd  

2.5 开启代理并观察日志

在这里插入图片描述
在这里插入图片描述

2.6 透明代理服务器构建

  • Squid-Server :ens33:192.168.13110 、 ens36:192.168.100.10
  • Web : 192.168.100.100
  • 客户端 :192.168.131.100

在这里插入图片描述
在这里插入图片描述

  • 配置双网卡
[root@localhost init.d]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens36
[root@localhost init.d]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.131.10
NETMASK=255.255.255.0
#GATEWAY=192.168.131.2                     【将网关和DNS注释掉,此时本机相当于网关服务器】
#DNS1=192.168.131.2
[root@localhost init.d]# vim /etc/sysconfig/network-scripts/ifcfg-ens36
NAME=ens36                                 【名称ens36】
#UUID=8b83f99f-7a65-42d7-9510-5b214a8a20de 【因为是直接复制ens33,所以这里的UUID需注释】
DEVICE=ens36                               【设备ens36】
ONBOOT=yes
IPADDR=192.168.100.10                      【ens36IP地址】
NETMASK=255.255.255.0
#GATEWAY=192.168.100.2                     【网关注释】
#DNS1=192.168.100.2                        【DNS注释】

[root@localhost init.d]# systemctl restart network
[root@localhost init.d]# ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.131.10  netmask 255.255.255.0  broadcast 192.168.131.255
        inet6 fe80::a642:fac7:7adb:8efb  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:49:74:c2  txqueuelen 1000  (Ethernet)
        RX packets 25556  bytes 14832869 (14.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 22490  bytes 14555560 (13.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.10  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::ee9:986a:f26c:46e5  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:49:74:cc  txqueuelen 1000  (Ethernet)
        RX packets 369  bytes 43266 (42.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 51  bytes 7436 (7.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


[root@localhost /]# vim /etc/sysctl.conf     【在此配置文件最后一行添加,开启路由转发】
net.ipv4.ip_forward=1
[root@localhost /]# sysctl -p                【加载内核配置文件】
net.ipv4.ip_forward = 1

【添加静态路由。gw:指定下一跳路由器的 IP 地址】
[root@localhost /]# route add -net 192.168.100.0/24 gw 192.168.131.10

【将配置文件的第60行进行修改,添加提供内网服务的ip地址并开启透明模式的支持】
[root@localhost /]# vim /etc/squid.conf
 60 http_port 192.168.131.10:3128 transparent
[root@localhost /]# service squid reload     【重载服务】


[root@localhost /]# iptables -F
[root@localhost /]# iptables -t nat -F
【添加防火墙规则(将100网段:80(HTTP)/443(HTTPS)端口的流量重定向到3128端口)】
[root@localhost /]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.131.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@localhost /]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.131.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
【如果重启的话需要再配置以下规则】
[root@localhost /]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
  • Web服务器
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.100.100
NETMASK=255.255.255.0
GATEWAY=192.168.100.2
[root@localhost ~]# systemctl restart network
[root@localhost ~]# ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.100  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::d6b9:3f4f:af20:4b7e  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a2:07:46  txqueuelen 1000  (Ethernet)
        RX packets 56  bytes 6858 (6.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 93  bytes 10530 (10.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service 
[root@localhost ~]# mount /dev/cdrom /mnt/
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl restart httpd.service 

2.7 Windows关闭代理测试

在这里插入图片描述

三、ACL访问控制

  • 在配置文件squid.conf中,ACL访问控制通过以下两个步骤来实现
    • 1.使用acl配置项定义需要控制的条件
    • 2.通过http_access配置项对已定义的列表做“允许”或“拒绝”访问的控制
  • 每行ACL配置可以定义一条访问控制列表,格式如下
    • 格式:acl 列表名称 列表类型 列表内容
    • 列表名称:名称是自定义,相当于给ACL起个名字(类似于Shell脚本变量名)
    • 列表类型:必须使用squid预定义的值,对应不同类别的控制条件
    • 列表内容:是要控制的具体对象,不同类型的列表所对应的内容也不一样,可以有多个值(以空格分隔,相当于“或”的关系)

3.1 方式一

  • ACL控制分析
acl localhost src 192.168.131.10/32 			    【基于源地址为】
acl MYLAN src 192.168.131.0/24 			            【基于客户机网段】
acl destionhost dst 192.168.131.20/32				【基于目标地址为】
acl MC20 maxconn 30									【基于最大并发连接】 
acl PORT port 33									【基于目标端口】
acl DMBLOCK dstdomain .qq.com						【基于目标域,匹配域内所有站点】

【url正则表达式的结构,基于指定的协议进行过滤^rtsp(协议)的控制】
acl BURL url_regex -i ^rtsp:// ^emule://			【以 rtsp://、emule:// 开头的 URL,-i表示忽略大小写】

【基于访问文件的末尾(格式)】
acl PURL urlpath_regex -i \\.mp3$ \\.mp4$ \\.rmvb$		【以.mp3、.mp4、.rmvb 结尾的URL路径】

【基于访问时间控制】
acl WORKTIME time MTWHF 0:30-7:30					【时间为周一至周五 0:30~7:30,“MTWHF”为每个星期的英文首字母】
【以上控制是否允许则取决于以下的allow/deny】
[root@localhost /]# vim /etc/squid.conf
  8 acl host     src 192.168.131.100/24    【IP地址为192.168.131.100.10/24的主机】
 32 http_access deny host                     【拒绝目标主机访问】
  • Win10进行访问测试
    在这里插入图片描述

3.2 方式二

  • squid:192.168.131.10
  • Web1:192.168.131.13
  • Web2:192.168.131.14
[root@localhost /]# vim /dest.list       【启用对象列表管理】
192.168.131.13                           【目标IP】


【调用指定文件中的列表内容】
【如果调用的列表是文件形式,则需要先把文件定义给列表】
【acl 将文件定义的列表(名) dst(目标地址) 定义目标地址的文件路径(绝对路径)】
[root@localhost /]# vim /etc/squid.conf   
  8 acl destionhost dst "/dest.list"     
 32 http_access deny destionhost         【拒绝列表】
【如果是拒绝列表,则需要放在http_access allow all前面(上一行)】

[root@localhost /]# service squid restart
  • Web1和Web2
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service 
[root@localhost ~]# yum install -y httpd
[root@localhost ~]# systemctl start httpd.service 
[root@localhost ~]# vim /以上是关于squid代理(反向传统透明)+ACL控制+日志分析的主要内容,如果未能解决你的问题,请参考以下文章

Squid 代理服务器的应用(传统代理透明代理ACL控制列表sarg日志分析反向代理)

squid缓存服务器 ACL访问控制 传统代理 透明代理 squid日志分析 反向代理

部署Squid 代理服务器(内含传统透明代理服务器的配置ACL访问控制日志分析反向代理)

squid代理服务器(传统代理透明代理反向代理ACL日志分析)

Squid透明代理+ACL访问控制+日志分析

Squid代理服务器(传统,反向,透明和ACL的使用)