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)"
至此透明代理构建成功!!!!


目录
相关文章
|
10月前
|
缓存 运维 网络协议
Linux巩固篇016-Linux Squid 部署代理缓存服务
纸上得来终觉浅,绝知此事要躬行
410 0
Linux巩固篇016-Linux Squid 部署代理缓存服务
|
存储 缓存 小程序
【微信小程序】CSS模块化、使用缓存在本地模拟服务器数据库
哈喽大家好,本期是微信小程序专栏第十五期。本期主要内容是使用缓存在本地模拟服务器数据库。主要包括了解应用程序的生命周期、Storage缓存初始化、设置缓存和清理缓存等。
130 0
|
存储 缓存 NoSQL
同一服务器上有多个 WordPress 网站如何配置 Memcached 缓存?
如果在同一台服务器上,部署了多个 Wordpress 项目,如果在每台服务器上都启用 Memcached ,那么将会出现网站白屏、数据串站的问题,本文我们来介绍如何处理这种问题。
314 0
|
存储 缓存 安全
Web缓存服务——Squid代理服务器应用(下)
正向代理:代替客户端向服务端发送请求。 反向代理:代理服务端,将请求转发给多个服务端。
180 0
|
缓存 网络安全 Apache
Web缓存服务——Squid代理服务器应用(中)
正向代理:代替客户端向服务端发送请求。 反向代理:代理服务端,将请求转发给多个服务端。
184 0
|
7天前
|
存储 缓存 NoSQL
【Go语言专栏】Go语言中的Redis操作与缓存应用
【4月更文挑战第30天】本文探讨了在Go语言中使用Redis进行操作和缓存应用的方法。文章介绍了Redis作为高性能键值存储系统,用于提升应用性能。推荐使用`go-redis/redis`库,示例代码展示了连接、设置、获取和删除键值对的基本操作。文章还详细阐述了缓存应用的步骤及常见缓存策略,包括缓存穿透、缓存击穿和缓存雪崩的解决方案。利用Redis和合适策略可有效优化应用性能。
|
10天前
|
存储 缓存 NoSQL
Redis多级缓存指南:从前端到后端全方位优化!
本文探讨了现代互联网应用中,多级缓存的重要性,特别是Redis在缓存中间件的角色。多级缓存能提升数据访问速度、系统稳定性和可扩展性,减少数据库压力,并允许灵活的缓存策略。浏览器本地内存缓存和磁盘缓存分别优化了短期数据和静态资源的存储,而服务端本地内存缓存和网络内存缓存(如Redis)则提供了高速访问和分布式系统的解决方案。服务器本地磁盘缓存因I/O性能瓶颈和复杂管理而不推荐用于缓存,强调了内存和网络缓存的优越性。
29 1
|
1天前
|
存储 消息中间件 缓存
Redis缓存技术详解
【5月更文挑战第6天】Redis是一款高性能内存数据结构存储系统,常用于缓存、消息队列、分布式锁等场景。其特点包括速度快(全内存存储)、丰富数据类型、持久化、发布/订阅、主从复制和分布式锁。优化策略包括选择合适数据类型、设置过期时间、使用Pipeline、开启持久化、监控调优及使用集群。通过这些手段,Redis能为系统提供高效稳定的服务。
|
2天前
|
缓存 监控 NoSQL
Redis缓存雪崩及应对策略
缓存雪崩是分布式系统中一个常见但危险的问题,可以通过合理的缓存策略和系统设计来降低发生的概率。采用多层次的缓存架构、缓存预热、合理的缓存失效时间等措施,都可以有效应对缓存雪崩,提高系统的稳定性和性能。在实际应用中,及时发现并解决潜在的缓存雪崩问题,是保障系统可用性的关键一环。
30 14
|
5天前
|
缓存 NoSQL Java
优化Redis缓存:解决性能瓶颈和容量限制
优化Redis缓存:解决性能瓶颈和容量限制
16 0