【squid缓存服务器】

一、Squid的简介

通俗的概述:squid是一种用来缓存网页浏览器数据的软件。接受来自人们需要下载的目标(object)的请求并适当的处理这些请求。也就是说,如果一个人逛微博突然想把这个图片保存下来,那么本地客户端会请求squid为他取得这个页面。squid随之连接到远程服务器并向这个页面发出请求。然后,squid将远程服务器返回到客户端机器的数据,复制一份到squid服务器的本地。当内网下一次有人需要这个相同的图片时, squid可以直接从自己的本地磁盘中读到它,不再需要去公网访问远程服务器,而是直接本地缓存给它

定义:一个缓存服务器的守护进程

支持的代理协议:FTP、HTTP、SSL

如何存储?磁盘 > 分区 > 目录 > Object(缓存文件)

索引方式
Hash Tables    目录   每个 Digest 的索引信息
Digest Tables   索引   不同分区对应的 Object 大概说明

工作过程:
无缓存:①②③⑤⑥④
①客户机向www.atguigu,com请求资源(获取图片)
②squid向自己本地缓存中检索是否存在此图片缓存
③向squid返回没有检索到的结果
⑤由于没有检索到,因此由squid代理服务器去公网访问www.atguigu,com请求资源
⑥公网服务器返回图片资源给squid服务器,squid保存一份到本地
④再向内网客户机发送保存的图片缓存

有缓存:①②③④
①客户机向www.atguigu,com请求资源(获取图片)
②squid向自己本地缓存中检索是否存在此图片缓存
③将检索到的图片缓存发送给squid
④squid将检索到的图片缓存发送给内网客户机
在这里插入图片描述

二、Squid工作模式

传统模式

将本地客户端访问公网客户端的一些资源请求缓存在squid本地,当这个资源再次被本地客户端请求时,直接从squid服务器中获取,不再去访问公网客户端。
优点:提高了访问速度,减少了出口流量。
缺点:实施麻烦,需要每台客户端都指定固定IP+端口
在这里插入图片描述

透明模式

与传统模式功能相同,唯一不同的就是不再需要手工绑定IP+端口了,透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。对于linux操作系统来说,透明代理使用Iptables或者Ipchains实现。因此不需要对浏览器作任何设置。

优点:客户端不再需要手工绑定IP+端口了
缺点:需要在防火墙上的端口做重定向,配置较为复杂
在这里插入图片描述

反向代理模式

正向代理:代理客户端
反向代理:代理服务器
代替内网WEB服务器接收公网数据。如果公网客户端请求的资源,在代理服务器上存在缓存,直接返给公网客户端。
在这里插入图片描述

三、Squid软件介绍

软件包: squid-3.1.STABLE21-6.el6

系统服务: squid

主程序: /usr/sbin/squid

配置目录: /etc/squid

主配置文件: /etc/squid/squid.conf
http_port 3128 指定端口为3128
access_log /var/log/squid/access.log squid 指定日志存放路径 和 日志的用户是谁
cache_mem 64MB 指定squid进程能调用的最大内存资源
cache_dir ufs /var/spool/squid 100 16 256 缓存目录 使用的文件系统为ufs 指定缓存目录路径 缓存目录能够使用的最大的存储资源10 MB 一级目录的最大个数 二级目录的最大个数
visible_hostname proxy.benet.com 可见名称,自己的缓存服务器名称叫什么
dns_testnames www.google.com www.163.com 定期检测自己是否存活所需要测试请求的网站
maximum_object_size 4096 kb 最大缓存对象的大小,如果访问的资源比所设的值大,则客户端只能在线访问,squid不会缓存到本地。反之,则缓存到本地
reply_body_max_size 10MB 允许访问的最大文件大小,如果超过,客户端直接接收不到。
默认监听端口: TCP 3128

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

特别说明:Squid 在经过 3.0 版本后使用 C 语言进行重构,效率大大提升,Centos6 标配 Squid 3.0 以后版本

搭建Squid传统模式

在这里插入图片描述
环境准备:
client: 10.10.10.11(内网)
squid—server: 10.10.10.12(内网) 和 20.20.20.12(公网)
apache 20.20.20.13(公网)

内网客户端(10.10.10.11)

#客户端添加网关指向squid服务器
[root@localhost ~]$ echo "GATEWAY=10.10.10.12" >> /etc/sysconfig/network-scripts/ifcfg-ens33   #指定11的数据交给12
[root@localhost ~]$ systemctl restart network

网关服务器 (Squid 服务器10.10.10.12)
开启第二块网卡

root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom #挂载本地yum源
[root@localhost ~]$ systemctl stop NetworkManager # 关闭网卡守护进程


[root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-ens34
DEVICE=ens34
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=20.20.20.12
NETMASK=255.255.255.0
[root@localhost ~]$ service network restart
[root@localhost ~]$ vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1 #开启路由转发,0改为1
[root@localhost ~]$ sysctl -p

安装squid服务

[root@localhost ~]$ yum -y install squid #安装 squid 服务 
[root@localhost ~]$ vim /etc/squid/squid.conf 
http_port 3128 
[root@localhost ~]$ service squid start
或者
[root@localhost ~]$ systemctl start squid

外网 apache 服务器 (20.20.20.13)

[root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33
TYPE=Ethernet
UUID=b1f0c82e-6315-4827-91f7-8a5f8fa0b929
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=20.20.20.13
NETMASK=255.255.255.0
[root@localhost ~]$ systemctl restart network
[root@localhost ~]$ systemctl restart httpd
[root@localhost ~]$ echo "this is server1" >> /var/www/html/index.html

测试:
①如果直接输入20.20.20.13,肯定是访问失败的
在这里插入图片描述
②由于是传统模式,需要人工将squid服务器IP+端口输入浏览器
在这里插入图片描述
③再去访问20.20.20.13,则访问成功!!
在这里插入图片描述
④为了验证缓存服务器的存在,去外网apache服务器那里将httpd关闭

[root@localhost html]# systemctl stop httpd
[root@localhost html]# netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      676/rpcbind         
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1409/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1026/sshd           
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1025/cupsd          
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1257/master         
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN      23856/sshd: root@pt 
tcp        0      0 20.20.20.13:22          20.20.20.140:1248       ESTABLISHED 23856/sshd: root@pt 
tcp6       0      0 :::111                  :::*                    LISTEN      676/rpcbind         
tcp6       0      0 :::22                   :::*                    LISTEN      1026/sshd           
tcp6       0      0 ::1:631                 :::*                    LISTEN      1025/cupsd          
tcp6       0      0 ::1:25                  :::*                    LISTEN      1257/master         
tcp6       0      0 ::1:6011                :::*                    LISTEN      23856/sshd: root@pt 
tcp6       0      0 20.20.20.13:80          20.20.20.12:35290       TIME_WAIT   -                   

⑤此时再去10.10.10.11上通过浏览器访问20.20.20.13,发现还是可以访问
在这里插入图片描述
因此证明缓存存在!!!

搭建Squid透明模式

![在这里插入图片描述](https://img-blog.csdnimg.cn/e955b36e22c14cb0bab466e10519769f.png
Client设置(10.10.10.11)
设置网关10.10.10.12,将Client的需要转发的数据全部传给10.10.10.12

#客户端添加网关指向squid服务器
[root@localhost ~]$ echo "GATEWAY=10.10.10.12" >> /etc/sysconfig/network-scripts/ifcfg-ens33
[root@localhost ~]$ systemctl restart network

Squid服务器设置(10.10.10.12、20.20.20.12)
配置第二块网卡(20.20.20.12)

[root@localhost ~]$ service NetworkManager stop # 关闭网卡守护进程
[root@localhost network-scripts]$ cp -a ifcfg-ens33  ifcfg-ens34  
[root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-ens34
DEVICE=ens34
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=20.20.20.12
NETMASK=255.255.255.0
[root@localhost ~]$ systemctl restart network

修改内核参数,开启路由转发功能(/etc/sysctl.conf)

[root@localhost ~]$ vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1 #开启路由转发,0改为1
[root@localhost ~]$ sysctl -p  #重新加载配置文件,立即生效

安装squid服务

[root@localhost ~]$ yum -y install squid #安装 squid 服务 
[root@localhost ~]$ vim /etc/squid/squid.conf 
http_port 10.10.10.12:3128 transparent # transparent ip为网关内网IP,不能写范围10.10.10.0这种
visible_hostname www.test.com #指定主机名称

#相比于传统代理,这里有变动
[root@localhost ~]$ systemctl reload squid.service #重新加载配置文件,这里不需要重启,原因是squid用的是ufs文件系统,重启会退格,导致重启时间长,建议reload。

[root@localhost ~]$ service iptables start && chkconfig iptables on
[root@localhost ~]$ iptables -F && iptables -L
[root@localhost ~]$ iptables -t nat -A PREROUTING -i ens33 -s 10.10.10.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 3128 # 添加路由规则
#往nat表上添加一条信息,当入站网卡是ens33(内网网卡),内网网段是,协议是tcp,目标端口是80的话,做一个端口重定向,重定向到3128

[root@localhost ~]$ iptables -t nat -L  #查看NAT表项
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   tcp  --  10.10.10.0/24        anywhere            tcp dpt:http redir ports 3128 
[root@localhost ~]$ service iptables save  #保存NAT

apache服务器设置(20.20.20.13)

[root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=20.20.20.13
NETMASK=255.255.255.0
[root@localhost ~]$ systemctl restart network
[root@localhost ~]$ systemctl start httpd
[root@localhost ~]$ echo "this is server2" >> /var/www/html/index.html

#创建一个文件
[root@localhost ~]$ cd /var/www/html
[root@localhost ~]$ dd if=/dev/zero of=1.txt bs=1M count=256
#在squid服务器配置文件中加入,限制可访问的最大文件大小为500MB
[root@localhost ~]$ vim /etc/squid/squid.conf 
reply_body_max_size 500 MB
[root@localhost ~]$ systemctl reload squid

测试:
客户端输入20.20.20.13,能正常访问
客户端输入20.20.20.13/1.txt下载,会报错

搭建Squid反向代理模式

在这里插入图片描述
环境准备:
apache1 10.10.10.11(内网)
apache1 10.10.10.12(内网)
squid: 10.10.10.13(内网) 和 20.20.20.13(公网)
server: 20.20.20.14(公网)

内网服务器(10.10.10.11、10.10.10.12)
两台apache服务器相同操作

[root@localhost ~]$ systemctl start httpd  && systemctl enable httpd 
[root@localhost ~]$ echo "this is server1" >> /var/www/html/index.html
#echo "this is server2" >> /var/www/html/index.html  10.10.10.12
#添加网关指向squid服务器
[root@localhost ~]$ echo "GATEWAY=10.10.10.13" >> /etc/sysconfig/network-scripts/ifcfg-ens33
[root@localhost ~]$ systemctl restart network

Squid 服务器(10.10.10.13、20.20.20.13)

配置第二块网卡(20.20.20.13)
```bash
[root@localhost ~]$ service NetworkManager stop # 关闭网卡守护进程
[root@localhost network-scripts]$ cp -a ifcfg-ens33  ifcfg-ens34  
[root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-ens34
DEVICE=ens34
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=20.20.20.13
NETMASK=255.255.255.0
[root@localhost ~]$ systemctl restart network

修改内核参数,开启路由转发功能(/etc/sysctl.conf)

[root@localhost ~]$ vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1 #开启路由转发,0改为1
[root@localhost ~]$ sysctl -p  #重新加载配置文件,立即生效

安装squid服务

[root@localhost ~]$ yum -y install squid 安装 squid 服务 
[root@localhost ~]$ vim /etc/squid/squid.conf 
http_port 20.20.20.13:80 vhost  #vhost反向代理的意思
#公网ip,# squid监听的端口,客户访问网站的端口,也可以只写端口,vhost不写也可以
visible_hostname www.test.com 
#cache_peer 192.168.1.2(内网中网页服务器 IP) parent 80 0 (网络中是否还有其他代理) originserver round-robin (节点以轮询的方式)
cache_peer 10.10.10.11 parent 80 0 originserver round-robin
cache_peer 10.10.10.12 parent 80 0 originserver round-robin
[root@localhost ~]$ systemctl reload squid

公网客户端(20.20.20.14)

[root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=20.20.20.14
NETMASK=255.255.255.0
GATEWAY=20.20.20.13

测试:客户端输入20.20.20.13会报错,不能访问,这是因为acl的设置,之前的可以访问,是因为刚好在10网段刚好在放行列表
在这里插入图片描述
因此,需要在/etc/squid/squid.conf里设置acl

[root@localhost ~]$ vim /etc/squid/squid.conf
#放行列表,添加20的网段
acl localnet src 20.20.20.0/24  # RFC1918 possible internal network
acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
[root@localhost ~]$ systemctl reload squid

四、Squid ACL 介绍

①书写ACL的格式:

acl  列表名称   列表类型    列表内容
acl  localnet      src     20.20.20.0/24
列表名称:由管理员自行指定,用来识别控制条件
列表类型:必须使用Squid预定义的值,对应不同类别的控制条件
	src: 源地址(即客户机IP地址)
    dst: 目标地址(即服务器IP地址)
	port: 目标端口
	srcdomain: 源名称(即客户机名称)
	dstdomain: 目标名称(即服务器名称)
	time: 一天中的时刻和一周内的一天
	url_regex: URL规则表达式匹配
	urlpath_regex: URL-path规则表达式匹配,略去协议和主机名
	proxy_auth: 通过外部程序进行用户验证
	maxconn: 单一IP的最大连接数
列表内容:具体控制的对象,不同的类型对应的内容也不一样,可以有多个值,用空格分隔

②ACL写好之后,还需要应用才能生效,否则ACL没用。

http_access allow 或 deny 列表名称

在这里插入图片描述
③如果 http_access deny all 未定义/被注释掉,并且自己定义了一个acl 范围,默认使用最后一条规则的反向操作,即下图:最后一个规则是http_access allow localhost,其实意义是deny的。
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值