缓存代理概述

作为应用层的代理服务软件,Squid 主要提供缓存加速和应用层过滤控制功能。

1.代理的工作机制

        当客户机通过代理来请求 Web 页面时,指定的代理的服务器会首先检查自己的缓存,如果缓存中已经有客户机需要访问的页面,则直接将缓存中的页面内容反馈给客户机;如果缓存中没有客户机需要访问的页面,则有代理服务器向 Internet 发送访问请求,当获得返回的Web 页面以后,将网页数据保存到缓存中并发送给客户机。

2.代理的基本类型

     (1)传统代理:必须在客户机的浏览器、下载软件等程序中手动设置代理服务器的地址和端口,然后才能使用代理服务器来访问代理服务器。

     (2)透明代理:提供与传统代理相同的功能和服务,器区别在于客户机不需要指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向。

Squid 安装包

链接:https://pan.baidu.com/s/17qg-G8L19Ch2YCSKo-3H4A 密码:8hul

一 .安装及运行控制

1.编译安装Squid

[root@squid ~]# yum install gcc gcc-c++ make –y                           //安装编译环境

[root@squid ~]#tar zxvf  squid-3.5.23.tar.gz -C /opt/                      //解压 squid 软件包

[root@squid Y2C7]# cd /opt/squid-3.5.23/
[root@squid squid-3.5.23]# ./configure --prefix=/usr/local/squid \                          //安装目录   
> --sysconfdir=/etc \                                                                    //   单独将配置文件修改到其他目录
> --enable-arp-acl \                           //在规则中设置为直接通过客户端MAC进行管理,防止客户端使用IP欺骗
> --enable-linux-netfilter \                                                          //使用内核过滤
> --enable-linux-tproxy \                                                             //支持透明模式
> --enable-async-io=100 \                                                           //提升存储性能
> --enable-err-language="Simplify_Chinese" \                        //错误信息显示语言
> --enable-underscore \                                                               //允许URL中有下划线
> --enable-poll \                                                                             //使用Poll()模式,提升性能
> --enable-gnuregex                                                                      //使用GNU正则表达式

2.安装完成后,创建链接文件、创建用户和组。

[root@squid squid-3.5.23]# make && make install                  (此过程时间会很长)

[root@squid squid-3.5.23]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
[root@squid squid-3.5.23]# useradd -M -s /sbin/nologin squid
[root@squid squid-3.5.23]# chown -R squid:squid /usr/local/squid/var/

3.修改Squid 的配置文件

[root@squid squid-3.5.23]# vim /etc/squid.conf

# And finally deny all other access to this proxy
http_access allow all
http_access deny all

# Squid normally listens to port 3128
http_port 3128                          //指定默认端口为3128
cache_effective_user squid           //指定 squid的程序用户,用来设置初始化,运行时的缓存
cache_effective_group squid          //指定账户的基本组

4.Squid 的运行控制

(1)检查配置文件的语法是否正确

[root@squid squid-3.5.23]# squid -k parse

(2)启动、停止 Squid

[root@squid squid-3.5.23]# squid –z                                //初始化缓存目录
[root@squid squid-3.5.23]# 2018/09/19 14:23:40 kid1| Set Current Directory to /usr/local/squid/var/cache/squid
2018/09/19 14:23:40 kid1| Creating missing swap directories
2018/09/19 14:23:40 kid1| No cache_dir stores are configured.

[root@squid squid-3.5.23]# squid                                    //启动服务
[root@squid squid-3.5.23]# netstat -ntap | grep squid                          //查看squid 的默认端口3128是否开启
tcp6       0      0 :::3128                 :::*                    LISTEN      48596/(squid-1)
  

(3)使用Squid服务脚本。为了使squid 服务的启动、停止、重载等操作更加方便,可以编写Squid 的服务脚本,并使用 chkconfig 和 service 工具进行管理

[root@squid squid-3.5.23]# cd /etc/init.d/
[root@squid init.d]# vim squid

#!/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 -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 -antp | gerp 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|restart|check|reload|status}"
           ;;
esac

(4)给启动脚本执行权限

[root@squid init.d]# chmod +x squid
[root@squid init.d]# chkconfig --add squid                       //将 squid 添加为系统服务
[root@squid init.d]# chkconfig --level 35 squid on           //开机自启动

二 .搭建Web 服务器

安装http服务

[root@localhost ~]# hostnamectl set-hostname web
[root@localhost ~]# bash
[root@web ~]# systemctl stop firewalld.service                //关闭防火墙
[root@web ~]# setenforce 0
[root@web ~]# yum install httpd –y                                       //安装 http服务

启动 httpd 服务

[root@web ~]# systemctl start httpd.service                     //启动http 服务


三 .构建传统代理服务器

   传统代理 :使用传统代理的特点在于,客户机的相关程序(如IE浏览器)必须指定代理服务器的地址、端口等信息。如图所示

Squid 传统代理 和 透明代理 (内附软件包)_第1张图片

1 .Squid服务器的配置

(1)修改 squid.conf 配置文件

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

# Squid normally listens to port 3128
http_port 3128
cache_mem 64 MB    //指定缓存功能所使用的内存空间大小,便于保持问较频繁地WEB对象

reply_body_max_size 10 MB      //允许用户下载的最大文件大小
maximum_object_size 4096 KB  //允许保存到缓存空间的最大对象大小,

                                                             //超过大小限制的文件将不被缓存,而是直接发给用户

cache_effective_user squid
cache_effective_group squid

(2)重启squid 服务

[root@squid init.d]# service squid stop
[root@squid init.d]# service squid start
grep: $: No such file or directory
正在启动 squid...
[root@squid init.d]# netstat -ntap |grep squid
tcp6       0      0 :::3128                 :::*                    LISTEN      82846/(squid-1)
    

(3)在防火墙上添加允许策略

[root@squid init.d]# iptables –F                  //先清空防火墙规则
[root@squid init.d]# setenforce 0
[root@squid init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT               //允许转发

2 .客户机代理配置

(1)在客户机上在暂时不设置代理功能,使用客户机访问web 服务器,

Squid 传统代理 和 透明代理 (内附软件包)_第2张图片

查看Web 访问日志的新增记录。在被访问的的web 服务器中,通过追踪 httpd 服务的访问日志文件。

[root@web logs]# cd /var/log/httpd/
[root@web httpd]# ls
access_log  error_log                         //访问日志和错误日志
[root@web httpd]#
[root@web httpd]# vim access_log
             //查看访问日志

2

由此可以看出,在客户端没有指定代理服务器是,就是通过客户端直接访问 Web 服务器。

(2)客户机的代理配置,在IE浏览器设置代理。选择  工具---》Internet选项--》 连接--》 局域网设置。如下图所示

指定代理服务器的 IP 地址及默认端口 3128

Squid 传统代理 和 透明代理 (内附软件包)_第3张图片

访问Web服务器,查看访问日志(先清空缓存)

Squid 传统代理 和 透明代理 (内附软件包)_第4张图片

       查看 Web 访问日志的新增记录,能够发现来自代理服务器 192.168.91.130 的访问记录。这说明当客户机使用代理后, Web 服务并不知道客户机的真实 IP 地址,因为实际上是由代理服务器在替它访问

Squid 传统代理 和 透明代理 (内附软件包)_第5张图片


四.透明代理

        透明代理提供的服务功能与传统代理是一致的,但是其“透明”的实现依赖于默认路由和防火墙的重定向策略,因此更适应于局域网主机服务,而不适合为Internet 中的客户提供服务。

        基于局域网主机通过Linux网关访问Internet 的环境。在Linux网卡上,构建Squid 为客户机访问Internet提供代理服务;在所有局域网客户机上,只需要正确设置IP地址、默认网关,不需要手动指定代理服务器的地址、端口等信息。如图所示

Squid 传统代理 和 透明代理 (内附软件包)_第6张图片

 squid 代理服务器双网卡    内网 ens-33  :192.168.100.1   外网 ens-36   :12.0.0.1

Web 服务器 :12.0.0.12

客户端           :192.168.100.30

        为了验证透明代理的效果,如果存在手动指定的代理服务器设置,应在客户机中将其去除。例如,在IE 浏览器的连接设置中不要勾选使用代理服务器;在Linux 客户机中,可以通过命令 unset HTTP_PROXY HTTPS_PROXY

(1)配置 Squid 支持透明代理

[root@squid ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@squid ~]# vim /etc/squid.conf

# Squid normally listens to port 3128
http_port 192.168.100.1:3128 transparent                         //这个IP 地址提供透明代理服务

(2)重新启动 squid 服务

[root@squid ~]# service squid restart
正在关闭 squid...
正在启动 squid...
[root@squid ~]# netstat -ntap | grep squid
tcp        0      0 192.168.100.1:3128      0.0.0.0:*               LISTEN      84473/(squid-1)
    

(3)设置 iptables de 重定向策略

          透明代理中的 Squid 服务实际上是构建在 Linux 网关主机上,因此只需要正确设置防火墙策略,就可以将局域网主机访问 Internet 的数据包交给 Squid 进行处理。这需要用到 iptables 的 REDIRECT (重定向)策略,其作用是实现本机端口的重新定向,将访问网站协议 HTTP 、HTTPS 的外发数据包转交给本机的 Squid 服务 (3128 端口)

        防火墙做重定向操作,将访问本机 80、443 端口的请求重定向到 3128 端口。

[root@squid ~]# iptables -F
[root@squid ~]# iptables -t nat -F
[root@squid ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@squid ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
[root@squid ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT           //允许转发

(4)在客户端访问web 服务器

Squid 传统代理 和 透明代理 (内附软件包)_第7张图片

(5)查看访问日志

[root@web ~]# cd /var/log/httpd/
[root@web httpd]# ls
access_log  error_log
[root@web httpd]# vim access_log

Squid 传统代理 和 透明代理 (内附软件包)_第8张图片


总结:

     (1)使用传统代理,需要手动指定代理服务器的地址、端口等信息

     (2)使用透明代理时,需要结合客户机的默认路由、网关的 REDIRECT 策略来实现,因此不适用于 Internet 环境。

     (3)构建透明代理服务时, http_port 行需要添加 transparent 监听选项,另外还需要设置防火墙的 REDIRECT 策略