Squid缓存代理服务器

简介: Squid缓存代理服务器

一、Squid相关概述



Squid: Linux 系统中一款最常用的 开源的代理服务软件,提供 缓存代理功能


工作原理: 当客户机通过代理去访问各种服务时,代理服务器会先检查自己的缓存,缓存中有结果,直接返回,如果缓存中没有用户需要的信息时,代理服务器会转给Internet(互联网),获取用户需要的信息,保存到缓存中,并且返回给用户,用户再次访问相同信息时,会直接调取服务器中的缓存信息从而提高访问速度


web代理的工作机制: 缓存网页对象,减少重复请求,提高访问速度


代理缓存加速的对象: 文字、图像等静态的web元素


优势: 提高web访问速度,隐藏客户机的ip地址,还可以针对访问目标、时间等进行访问控制 (过滤机制)


代理的类型:


(1)传统代理: 需要在客户端去指定代理服务器 (一般用于Internet环境)

(2)透明代理: 不需要指定代理服务器的地址和端口 (一般用于局域网环境,无需额外设置即可实现上网,squid服务器充当网关)


20201223102957636.png


二、构建Squid代理服务器


(1)安装

******上传源码包,配置、编译并安装(时间较长)
[root@Squid ~]# ll
总用量 4728
-rw-------. 1 root root    1263 10月  8 17:22 anaconda-ks.cfg
-rw-r--r--  1 root root 4835525 12月 24 17:36 squid-3.5.23.tar.gz
[root@Squid ~]# tar zxvf squid-3.5.23.tar.gz 
[root@Squid squid-3.5.23]# ./configure  --prefix=/usr/local/squid --sysconfdir=/etc --enable-linux-netfilter --enable-async-io=240 --enable-default-err-langugae=Simplify_Chinese --disable-poll --enable-epoll --enable-gnuregex  && make && make install
******优化执行路径
[root@Squid squid-3.5.23]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
******创建Squid程序运行账户和组(不创建宿组目录,并且是程序用户无法登录系统)
[root@Squid squid-3.5.23]# useradd -M -s /sbin/nologin squid
******设置Squid服务目录下的属主和属组
[root@Squid squid-3.5.23]#  chown -R squid:squid /usr/local/squid/var/
******修改squid配置文件(/etc/squid.conf)
[root@Squid squid-3.5.23]# vim /etc/squid.conf
  1 #
  2 # Recommended minimum configuration:
  3 #
  4 cache_effective_user squid   (添加,指定squid 的程序用户,用来设置初始化、运行时缓存的账户)
  5 cache_effective_group squid   (添加,指定squid 的程序组,用来设置初始化、运行时缓存的组账户)
  6 # Example rule allowing access from your local networks.
  7 # Adapt to list your (internal) IP networks from where browsing
  8 # should be allowed
  。。。。。。

(2)squid的运行控制

******检查配置文件语法是否正确
[root@Squid squid-3.5.23]#  squid  -k  parse
******启动,停止Squid服务 (第一次启动时,会自动初始化缓存目录)
[root@Squid squid-3.5.23]# squid -z (初始化缓存目录)
[root@Squid squid-3.5.23]# squid    (启动squid服务)
[root@Squid squid-3.5.23]# netstat -anpt | grep squid  (监听端口,发现已经成功启动)
tcp6       0      0 :::3128                 :::*                    LISTEN      43547/(squid-1)     
******为了方便对squid 服务的启动、停止、重新加载更加方便,需要编写squid 服务脚本
(使用chkconfig 和 systemctl 工具进行管理)
[root@Squid squid-3.5.23]# vim /etc/init.d/squid  (编写脚本)
写入:
#!/bin/bash
# chkconfig: 35 90 25
# config: /etc/squid.conf
# pidfile: /usr/local/squid/var/run/squid.pid
# Description: Squid - Internet Object Cache.
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
        start)
                netstat -anpt|grep squid &> /dev/null
                if [ $? -eq 0 ];then
                        echo "squid服务已经开启"
                else
                        echo "squid服务正在开启"
                $CMD
        stop)
                $CMD -k kill &> /dev/null
                rm -f $PID &> /dev/null
                       echo "squid服务已经关闭"
        ;;
        status)
                 [ -f $PID ] &> /dev/null
                        if [ $? -eq 0 ];then
                                netstat -anpt |grep squid
                        else
                                echo "squid服务没有开启"
                        fi
        ;;
        restart)
                $0 stop &> /dev/null
                echo "stoping squid"
                $0 start &> /dev/null
                echo "squid已经重新启动"
        ;;
        reload)
                $CMD -k reconfigure
        ;;
        check)
                $CMD -k parse
        ;;
        *)
                echo "当前脚本 $0 后面只能写{start|stop|restart|reload|check|status}"
esac
                                                 46,1   
保存退出
[root@Squid squid-3.5.23]# chmod +x /etc/init.d/squid   (给脚本添加可执行权限)
[root@Squid squid-3.5.23]# chkconfig --add squid        (添加squid为系统服务,这个命令每次重新启动服务器后可能会失效,重新添加一下就好了)
******现在已经可以使用systemctl来管理squid服务了
[root@Squid ~]# systemctl start squid
[root@Squid ~]# netstat -anpt | grep squid
tcp6       0      0 :::3128                 :::*                    LISTEN      955/(squid-1)  

(一)构建Squid的传统代理


名称 扮演角色 ip地址
Squid 代理服务器 192.168.100.11
Web web服务器 192.168.100.12
win7 普通客户机 192.168.100.13


要求: 在Squid构建代理服务,来隐藏客户机的访问ip地址,禁止通过代理去下载超过10MB的文件


(1)Squid代理服务器的配置


******修改squid.conf配置文件(前提是已经安装了squid服务)
[root@Squid ~]# vim /etc/squid.conf 
。。。。。。
 52 # from where browsing should be allowed
 53 http_access allow localnet
 54 http_access allow localhost
 55 http_access allow all   (添加,允许任意客户机使用代理服务,在“http_access deny all”之前就行)
 56 
 57 # And finally deny all other access to this proxy
 58 http_access deny all
 59 reply_body_max_size 10 MB  (添加,允许下载的最大文件为10MB)
 60 # Squid normally listens to port 3128
 61 http_port 3128
 。。。。。。
 保存退出
 ******重启squid服务
 [root@Squid ~]# systemctl restart squid
至此传统代理的squid服务器配置完成

(2)Web服务器的配置

******安装httpd服务并且写入页面即可
[root@Web ~]# mount /dev/cdrom /media/cdrom/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@Web ~]# yum -y install httpd
。。。。。。
完毕!
[root@Web ~]# echo "123.com" > /var/www/html/index.html
[root@Web ~]# systemctl start httpd
[root@Web ~]# curl 127.0.0.1
123.com

(3)Win7的配置


  • 打开Win7的“运行”,输入“inetcpl.cpl”

20201224102717139.png

弹出一个“internet属性”的窗口,点击“连接”,点击“局域网设置”

20201224102807319.png


弹出“局域网(LAN)设置”的窗口,把“为LAN使用代理服务器(这些设置不用于拨号或VPN连接)”的选项勾选,填写地址为Suid代理服务器的地址,端口为3128 (默认端口就是3128,可以在/etc/squid.conf进行修改) ,点击“确定”

20201224102912904.png


打开浏览器访问Web服务器(192.168.100.12)

20201224103949544.png



(4)验证代理是否成功

******在squid服务器上查看日志
[root@Squid sbin]# tail -3 /usr/local/squid/var/logs/access.log  (发现都是192.168.100.13也就是win7在访问)
1608806412.148  28960 192.168.100.13 TAG_NONE/503 0 CONNECT urs.microsoft.com:443 - HIER_NONE/- -
1608806412.148  28960 192.168.100.13 TAG_NONE/503 0 CONNECT urs.microsoft.com:443 - HIER_NONE/- -
1608806412.148  34477 192.168.100.13 TAG_NONE/503 0 CONNECT urs.microsoft.com:443 - HIER_NONE/- -
******在web服务器上访问日志
[root@Web ~]# tail /var/log/httpd/access_log  (发现都是192.168.100.11,也就是squid代理服务器在访问)
127.0.0.1 - - [24/Dec/2020:18:25:29 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
192.168.100.11 - - [24/Dec/2020:18:36:20 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
192.168.100.11 - - [24/Dec/2020:18:39:36 +0800] "GET / HTTP/1.1" 200 8 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
192.168.100.11 - - [24/Dec/2020:18:39:37 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
至此,squid传统代理搭建成功!!!!隐藏了win7的地址

(二)透明代理


名称 扮演角色 ip地址
Squid 代理服务器 192.168.100.11/200.0.0.1
Web web服务器 200.0.0.2
Win7 普通客户端 192.168.100.13


要求: 实现透明代理,squid代理服务器充当客户端的网关,隐藏客户端访问web的地址

(这里的squid服务器要添加网卡VM2,web服务器换成VM2网卡并修改地址)


(1)Squid代理服务器的配置


(在上面传统代理的基础上配置)

******添加一块新的网卡VM2,并且配置ip地址
[root@Squid ~]# cd /etc/sysconfig/network-scripts/
[root@Squid network-scripts]# cp ifcfg-ens33 ifcfg-ens37 
(要先ip a,看一下添加的网卡名叫什么,然后把原来的网卡名复制一份到新的网卡名)
[root@Squid network-scripts]# vim ifcfg-ens37  (编写的网卡)
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=ens33
UUID=9d46d645-9072-4138-9eca-f2f2709d4cba
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.11
PREFIX=24
IPV6_PRIVACY=no
修改为:
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=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=200.0.0.1
PREFIX=24
IPV6_PRIVACY=no
保存退出
[root@Squid network-scripts]# systemctl restart network (重启网卡)
[root@Squid network-scripts]# ip a  (再次查看,发现成功添加地址)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:d8:4c:da brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.11/24 brd 192.168.100.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::abff:f1ab:2782:8087/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:d8:4c:e4 brd ff:ff:ff:ff:ff:ff
    inet 200.0.0.1/24 brd 200.0.0.255 scope global noprefixroute ens37
       valid_lft forever preferred_lft forever
    inet6 fe80::a8fc:44a7:d5f6:8e44/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@Squid network-scripts]# cd
******编写Squid主配置文件
[root@Squid ~]# vim /etc/squid.conf 
。。。。。。
 57 http_access deny all
 58 
 59 reply_body_max_size 10 MB
 60 # Squid normally listens to port 3128
 61 http_port 192.168.100.11:3128  transparent
 62  63 # Uncomment and adjust the following to add a disk cache direc    tory.
。。。。。。
保存退出
[root@Squid ~]# systemctl restart squid (重启squid服务)
******在squid服务器上开启路由转发功能  (因为squid服务器要当作win7的网关)
[root@Squid ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
[root@Squid ~]# sysctl -p
net.ipv4.ip_forward = 1
******开启防火墙并设置重定向策略
[root@Squid ~]# systemctl start firewalld
[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 -I INPUT -p tcp --dport 3128 -j ACCEPT

(2)Web服务器配置

[root@Web ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
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=ens33
UUID=ce896eb0-2544-440a-a54d-f8633b2e9496
DEVICE=ens33
ONBOOT=yes
IPADDR=200.0.0.2
PREFIX=24
IPV6_PRIVACY=no
[root@Web ~]# systemctl restart network (重启网卡)
[root@Web ~]# ip a   (查看地址发现已经成功更改)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:46:da:b9 brd ff:ff:ff:ff:ff:ff
    inet 200.0.0.2/24 brd 200.0.0.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::ea8f:4112:94bb:75f7/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

(3)Win7的配置


  • 配置网关为Squid服务器(192.168.100.11)


20201224152932968.png

打开运行输入“inetcpl.cpl”

20201224153013629.png

“连接”——“局域网设置”

20201224153033441.png

把“代理服务器”的选项勾掉,点击确认即可


20201224153110809.png

20201224153136652.png

使用浏览器访问web服务器(200.0.0.2)


20201224153421313.png


(4)验证透明代理


******Squid服务器验证(发现有win7主机的访问记录)
[root@Squid ~]# tail -3 /usr/local/squid/var/logs/access.log 
1608806412.148  34477 192.168.100.13 TAG_NONE/503 0 CONNECT urs.microsoft.com:443 - HIER_NONE/- -
1608824055.115    335 192.168.100.13 TCP_MISS/200 328 GET http://200.0.0.2/ - ORIGINAL_DST/200.0.0.2 text/html
1608824055.157      0 192.168.100.13 TCP_MISS/404 450 GET http://200.0.0.2/favicon.ico - ORIGINAL_DST/200.0.0.2 text/html
******web服务器验证 (发现都是squid服务器的第二块网卡的200.0.0.1在访问)
[root@Web ~]# tail -3 /var/log/httpd/access_log 
200.0.0.1 - - [24/Dec/2020:23:33:44 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
200.0.0.1 - - [24/Dec/2020:23:34:13 +0800] "GET / HTTP/1.1" 200 8 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
200.0.0.1 - - [24/Dec/2020:23:34:13 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
至此透明代理构建成功!!!!


目录
相关文章
|
1月前
|
缓存 监控 定位技术
|
4月前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
443 1
|
2月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
61 3
|
5月前
|
缓存 应用服务中间件 Apache
缓存代理服务器的实现机制和技术选型
缓存代理服务器是一种特殊的代理服务器,其主要功能是缓存从目标服务器(通常是Web服务器)获取的数据,并在客户端再次请求相同数据时直接提供缓存的数据。通过缓存代理服务器可以加快访问速度并减轻目标服务器的负载。
|
3月前
|
XML 存储 缓存
Squid 缓存服务器配置
Squid 缓存服务器配置
135 0
|
4月前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
|
4天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
118 85
|
2月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
80 6
|
1天前
|
缓存 监控 NoSQL
Redis经典问题:缓存穿透
本文详细探讨了分布式系统和缓存应用中的经典问题——缓存穿透。缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致大量请求直接落到数据库上,可能引发数据库崩溃或性能下降。文章介绍了几种有效的解决方案,包括接口层增加校验、缓存空值、使用布隆过滤器、优化数据库查询以及加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统的影响,提升系统的稳定性和性能。
|
1月前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题