Squid代理----基础理论+传统代理和透明代理搭建

文章目录

        • 前言:
        • 一、Squid概述
          • 1.1 Squid 缓存服务器
          • 1.2 Squid 概述
        • 二、Squid 主要功能
        • 三、Squid 工作流程
          • 3.1 Squid 简易工作流程图
            • 3.1.1 Squid 工作流程
        • 四、Squid三种代理服务器
          • 4.1 Squid 代理类型
          • 4.2 Squid 三种代理服务器原理
          • 4.3 三种代理应用场景
        • 五、Squide 传统代理部署(实验)
          • 5.1 实验环境
          • 5.2 部署Squid
            • 5.2.1 Squid安装
            • 5.2.1 修改Squid配置文件
        • 六、透明代理部署
          • 6.1 实验环境
          • 6.2 环境配置
            • 6.2.1 添加网卡并配置
            • 6.2.2 客户端配置
          • 6.3 Squid 服务器配置
          • 6.4 Web端设置
          • 6.5 访问测试
        • 总结

前言:

Squid是Web的缓存代理,支持HTTP,HTTPS,FTP等。通过缓存和重用经常请求的网页,它减少了带宽并缩短了响应时间。Squid具有广泛的访问控制,是一个出色的服务器加速器。它可以在大多数可用的操作系统(包括Windows)上运行,并且已获得GNU GPL的许可。

一、Squid概述

1.1 Squid 缓存服务器
  • Squid缓存服务器:即用来存储(内存及硬盘)用户访问的网页、图片、文件*等等信息的专用服务器,这种服务器不仅可以使用户最快的得到他们想要的信息,而且大大减少了网络传输的数据量,缓存服务器经常是代理服务器。对于用户是不可见。
1.2 Squid 概述
  • Squid是一款缓存internet数据的软件,它接收用户的下载申请,并自动处理所下载的数据。
  • 当一个用户象要访问一个url时,它向Squid发出一个申请,请求squid替它下载,然后Squid连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid将缓存的该页面立即传给用户,加速用户的访问。
  • Squid 可以代理HTTP, FTP, GOPHER, SSL 和 WAIS 协议,
  • Squid暂不能代理POP, NNTP等协议。

二、Squid 主要功能

  • ① 缓存网站内容,以达到为用户提供Web访问加速。
  • ② 对用户的Web访问进行过滤控制
  • ③ 热点缓存,只缓存访问热度到达设定级别的网站内容。
  • ④ 合并回源,多个相同的请求只回源一次。
  • ⑤ ACL访问控制,可针对源IP、目的地IP、域名、URL、访问时间、单一最大连接数限制访问行为。或通过外部程序验证访问者(proxy_auth)。
  • ⑥ 网页内容篡改,可根据需求篡改网站内容。
  • ⑦ 网站头部篡改,可根据需求篡改请求头部。
  • ⑧ 可针对不同的域名或url配置不同的缓存规则。

三、Squid 工作流程

3.1 Squid 简易工作流程图
3.1.1 Squid 工作流程
  • ① 当代理服务器中有客户端需求的数据时
    • 客户端向代理服务器发送数据请求
    • 代理服务器检查自己的数据缓存
    • 代理服务器在缓存中找到用户需要的数据,取出数据
    • 代理服务器将从缓存中取得的数据返回给客户端
  • ② 当代理服务器中没有客户端需求的数据时
    • 客户端向代理服务器发送数据请求
    • 代理服务器检查自己的数据缓存
    • 代理服务器向internet上的远端服务器发送数据请求
    • 远端服务器响应,返回相应的数据
    • 代理服务器取得元端服务器的数据,返回给客户端,并保留一份到自己的数据缓存中

四、Squid三种代理服务器

4.1 Squid 代理类型
  • Squid 有三种代理类型

    传统代理:也叫做正向代理,适用internet,需要明确指定服务端

    透明代理:客户机不需要指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向给代理服务器处理

    反向代理:反向代理也就是通常所说的WEB服务器加速,它是一种通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB缓冲服务器(即:WEB反向代理服务器)来降低实际的WEB服务器的负载

4.2 Squid 三种代理服务器原理
  • ① 传统代理缓冲服务器

  • 前提条件

    • 必须在每一个内部主机的浏览器上明确指名代理服务器的IP地址和端口号
  • 工作流程

    • ① 客户端上网时,每次都把请求发送给代理服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据。
    • ② 如果在本地缓冲区有目标文件,则直接将文件传给用户即可。
    • ③ 如果没有的话则先取回文件,先在本地保存一份缓冲,然后将文件发送给客户端浏览器。
  • ② 透明代理缓冲服务器

  • 与传统代理服务器区别

    • 透明代理缓冲服务器和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口),对于linux操作系统来说,透明代理使用Iptables或者Ipchains实现。因此不需要对浏览器作任何设置。
  • 工作流程

    • 透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。
  • ③ 反向代理缓冲服务器

  • 以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从内部服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外表现为一个服务器。

    • 作用

      ① 可以降低原始WEB服务器的负载。

      ② 反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。

      ③ 它位于WEB服务器和Internet之间,阻止了WEB服务器和Internet的直接通信。

  • 工作流程

    • 如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。
    • 如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发给用户。
4.3 三种代理应用场景
  • 正向代理(本地网关)

    • ① 正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。
    • ② 正向代理还可以使用缓存特性减少网络使用率。
    • ③ 正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。
  • 透明代理(cdn,架设于网络运营商主干机房)

    • ① 提高各个地区访问者的访问速度。
    • ② 减少源站压力。
    • ③ 减少网络运营商的网间结算费用。
    • ④ 节省网络运营商带宽资源。
  • 反向代理(网站前端)

    • ① 降低源站服务器的负载。
    • ② 隐藏源站真实ip。
  • squid主要组成部分

    服务名:squid

    主程序:/usr/sbin/squid

    配置目录:/etc/squid

    主配置文件:/etc/squid/squid.conf

    监听tcp端口号:3128

    默认访问日志文件:/var/log/squid/access.log

五、Squide 传统代理部署(实验)

5.1 实验环境
  • 两台centos虚拟机、一台win10虚拟机

    • 一台作为Squid服务器,IP地址为: 192.168.226.128,NAT模式

      主要软件:squid-3.5.27.tar.gz

    • 一台作为web服务器,IP地址为:192.168.226.132,NAT模式

      主要软件:Apache

    • win10作为Client测试机,NAT模式

      主要软件:谷歌浏览器

5.2 部署Squid
5.2.1 Squid安装
[root@squid ~]# mount.cifs //192.168.226.1/LAMP-C7 /mnt
Password for root@//192.168.226.1/LAMP-C7:
[root@squid ~]# cd /mnt
[root@squid ~]# tar zxvf squid-3.4.6.tar.gz -C /opt
.....省略部分内容
[root@squid ~]# cd /opt/squid-3.4.6
[root@squid squid-3.4.6]# yum install gcc gcc-c++ -y
[root@squid squid-3.4.6]# ./configure \
--prefix=/usr/local/squid \					#安装路径
--sysconfdir=/etc \						#配置文件目录
--enable-arp-acl \						#支持acl访问控制列表
--enable-linux-netfilter \					#内核过滤
--enable-linux-tproxy \						#支持透明模式
--enable-async-io=100 \						#io优化
--enable-err-language="Simplify_Chinese" \			#支持简体中文报错提示
--enable-underscore \						#在url中支持下划线
--enable-poll \							#poll 关闭默认适用poll模式,开启epoll模式提升性能
--enable-gnuregex						#支持正则表达

[root@squid squid-3.4.6]# make && make install
......省略部分内容
  • 创建软链接
[root@squid squid-3.4.6]# ln -s /usr/local/squid/sbin/* /usr/local/sbin
  • 创建程序用户、设置目录属主属组
[root@squid squid-3.4.6]# useradd -M -s /sbin/nologin squid
[root@squid squid-3.4.6]# chown -R squid.squid /usr/local/squid/var
5.2.1 修改Squid配置文件
[root@squid squid-3.4.6]# vim /etc/squid.conf
#56行 添加允许所有
http_access allow all
#http_access deny all


#61行 添加:指定程序用户
#62行 添加:指定账号用户
cache_effective_user squid
cache_effective_group squid

#68行为容灾文件目录
coredump_dir /usr/local/squid/var/cache/squid
-----》wq

#检查语法    
[root@squid squid-3.4.6]# squid -k parse
.....省略部分内容
    
#初始化缓存
[root@squid squid-3.4.6]# squid -z
  • 开启服务、检查状态
[root@squid squid-3.4.6]# squid
2020/03/22 21:53:35 kid1| Set Current Directory to /usr/local/squid/var/cache/squid
2020/03/22 21:53:35 kid1| Creating missing swap directories
2020/03/22 21:53:35 kid1| No cache_dir stores are configured.
[root@squid squid-3.4.6]# netstat -natp | grep 3128
tcp6       0      0 :::3128                 :::*                    LISTEN      4387/(squid-1)   
  • 将服务添加到service管理
[root@squid squid-3.4.6]# cd /etc/init.d/
[root@squid init.d]# vim squid
#!/bin/bash
#chkconfig: 2345 90 25
PID="/usr/local/squid/var/run/squid.pid"	#PID文件squid运行进程号
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			#关闭squid
                rm -rf $PID &> /dev/null			#删除PID运行文件
                ;;
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|reload|status|check|restart}"
                ;;
esac
---------》wq

#增加执行权限
[root@squid init.d]# chmod +x squid
# 添加到service列表
[root@squid init.d]# chkconfig --add squid
#在init 3 和init 5的模式开机自启动
[root@squid init.d]# chkconfig --level 35 squid on
  • 配置传统代理服务
[root@squid init.d]# vim /etc/squid.conf
#63-65行 添加功能
cache_mem 64 MB						#自定义缓存空间大小,容量最好为4的倍数
reply_body_max_size 10 MB			#允许下载最大文件大小,以字节为单位,默认设置0表示不进行限制
maximum_object_size 4096 KM			#允许保存到缓存空间的最大对象的大小,以KB为单位,超过限制不会缓存,直接转到web端
------》wq
  • 防火墙规则
#清空防火墙表内容
[root@squid init.d]# iptables -F
#查看防火墙表内容
[root@squid init.d]# iptables -L
[root@squid init.d]# setenforce 0
#新增规则,允许3128端口通过
[root@squid init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
#重载服务
[root@squid init.d]# service squid reload

firewalld 介绍可查看之前的博客:Linux基础:Firewalld防火墙基础

  • 安装http服务
[root@web ~]# yum install httpd
[root@web ~]# systemctl stop firewalld.service 
[root@web ~]# setenforce 0
[root@web ~]# systemctl start httpd.service 
  • 测试web页面

    默认的谷歌浏览器

Squid代理----基础理论+传统代理和透明代理搭建_第1张图片

  • 设置Squid代理

    ① 清理客户端缓存

    ② 手动设置代理

    ③ 再次访问web端

    ④ 查看web端httpd访问日志(查看访问源地址)

  • 清理客户端缓存

Squid代理----基础理论+传统代理和透明代理搭建_第2张图片

  • 手动设置代理

Squid代理----基础理论+传统代理和透明代理搭建_第3张图片
Squid代理----基础理论+传统代理和透明代理搭建_第4张图片

Squid代理----基础理论+传统代理和透明代理搭建_第5张图片

  • 再次访问Web端

Squid代理----基础理论+传统代理和透明代理搭建_第6张图片

  • 查看web端httpd访问日志
[root@web ~]# cat /var/log/httpd/access_log 
192.168.226.128 - - [23/Mar/2020:14:50:21 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://192.168.226.132/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
......省略部分内容
#可见访问源地址为Squid服务器的IP地址
  • 以上为传统代理设置

六、透明代理部署

6.1 实验环境
  • ① 以传统代理的环境为基础
  • ② 在Squid服务器上添加一块网卡(仅主机模式)IP为:192.168.200.1
  • ③ Web服务器不用做修改
  • ④ Client客户端将网卡修改为仅主机模式,IP地址修改为192.168.200.10,同时关闭服务器代理
6.2 环境配置
6.2.1 添加网卡并配置

Squid代理----基础理论+传统代理和透明代理搭建_第7张图片

[root@squid init.d]# cd /etc/sysconfig/network-scripts/
[root@squid network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
[root@squid network-scripts]# vi ifcfg-ens36
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens36"
DEVICE="ens36"
ONBOOT="yes"
IPADDR=192.168.200.1
NETMASK=255.255.255.0
------>wq
[root@squid network-scripts]# systemctl restart network
#查看网卡设置
[root@squid network-scripts]# ifconfig
6.2.2 客户端配置
  • ①关闭代理服务

  • ② 修改网卡为仅主机模式

Squid代理----基础理论+传统代理和透明代理搭建_第8张图片

  • ③ 手动设置IP地址
    Squid代理----基础理论+传统代理和透明代理搭建_第9张图片
6.3 Squid 服务器配置
  • 修改配置文件
[root@squid network-scripts]# vi /etc/sysctl.conf 
#行尾添加以下内容开启路由转发功能
net.ipv4.ip_forward = 1
----》wq
#加载生效
[root@squid network-scripts]# sysctl -p
net.ipv4.ip_forward = 1
  • 修改Squid主配置文件(配置透明代理)
[root@squid network-scripts]# vim /etc/squid.conf
#60行 修改,添加ens36(仅主机)的地址,开启透明模式
http_port 192.168.200.1:3128 transparent
-----》wq
[root@squid network-scripts]# service squid stop
[root@squid network-scripts]# service squid start
squid is running

#设置防火墙规则
#清空规则表
[root@squid network-scripts]# iptables -F
#清空nat表内容
[root@squid network-scripts]# iptables -t nat -F
#定义规则入口(ens36网卡),http协议80端口重定向到3128端口   
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.200.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
#定义规则入口ens36网卡,hhttpd协议443端口重定向到3128端口
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.200.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
#新增规则,允许3128端口
[root@squid network-scripts]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
6.4 Web端设置
  • 添加一条静态路由、下一条指向Squid 服务器的ens33网卡
#配置前,无法ping通ens36
[root@web ~]# ping 192.168.200.1
PING 192.168.200.1 (192.168.200.1) 56(84) bytes of data.
^C

#配置静态路由
[root@web ~]#  route add -net 192.168.200.0/25 gw 192.168.226.128

#再次ping ens36,可以ping通
[root@web ~]# ping 192.168.200.1
PING 192.168.200.1 (192.168.200.1) 56(84) bytes of data.
64 bytes from 192.168.200.1: icmp_seq=1 ttl=64 time=0.398 ms
64 bytes from 192.168.200.1: icmp_seq=2 ttl=64 time=0.450 ms
6.5 访问测试
  • 使用client客户端访问Web端地址

  • 在Web端查看日志

[root@web ~]# cat /var/log/httpd/access_log 
#在来访日志中可见源地址为Squid的ens33IP地址
  • 小结

    透明模式中,不需要在Client开启Squid代理服务,客户端访问Web端也会显示Squid代理IP,这就是Squid透明模式的作用

总结

本篇博客介绍了Squid代理的基础理论,介绍了传统模式、透明模式的部署,后续将继续介绍反向代理模式部署、配置ACL访问控制与sarg日志

你可能感兴趣的:(Web集群)