手机版 欢迎访问it开发者社区(www.mfbz.cn)网站

当前位置: > 开发

Squid部署代理缓存服务

时间:2021/6/4 12:00:59|来源:|点击: 次

代理缓存服务

Squid是Linux系统中最为流行的一款高性能代理服务软件,通常用作Web网站的前置缓存服务,能够代替用户向网站服务器请求页面数据并进行缓存。简单来说,Squid服务程序会按照收到的用户请求向网站源服务器请求页面、图片等所需的数据,并将服务器返回的数据存储在运行Squid服务程序的服务器上。当有用户再请求相同的数据时,则可以直接将存储服务器本地的数据交付给用户,这样不仅减少了用户的等待时间,还缓解了网站服务器的负载压力。
Squid服务程序具有配置简单、效率高、功能丰富等特点,它能支持HTTP、FTP、SSL等多种协议的数据缓存,可以基于访问控制列表(ACL)和访问权限列表(ARL)执行内容过滤与权限管理功能,还可以基于多种条件禁止用户访问存在威胁或不适宜的网站资源,因此可以保护企业内网的安全,提升用户的网络体验,帮助节省网络带宽。
在使用Squid服务程序为用户提供缓存代理服务时,具有正向代理模式和反向代理模式之分。
所谓正向代理模式,是指让用户通过Squid服务程序获取网站页面等资源,以及基于访问控制列表(ACL)功能对用户访问网站行为进行限制,在具体的服务方式上又分为标准代理模式与透明代理模式。
标准正向代理模式是把网站数据缓存到服务器本地,提高数据资源被再次访问时的效率,但是用户在上网时必须在浏览器等软件中填写代理服务器的IP地址与端口号信息,否则默认不使用代理服务。
透明正向代理模式的作用与标准正向代理模式基本相同,区别是用户不需要手动指定代理服务器的IP地址与端口号,所以这种代理服务对于用户来讲是相对透明的。
反向代理模式是指让多台节点主机反向缓存网站数据,从而加快用户访问速度。可以使用Squid服务程序提供的反向代理模式来进行响应。而且,如果反向代理服务器中恰巧已经有了用户要访问的静态资源,则直接将缓存的这些静态资源发送给用户,这不仅可以加快用户的网站访问速度,还在一定程度上降低了网站服务器的负载压力。
正向代理和反向代理

正向代理模式一般用于企业局域网之中,让企业用户统一地通过Squid服务访问互联网资源,可以在一定程度上减少公网带宽的开销,还能对用户访问的网站内容进行监管限制;
反向代理模式一般是为大中型网站提供缓存服务的,它把网站中的静态资源保存在国内多个节点机房中,当有用户发起静态资源的访问请求时,可以就近为用户分配节点并传输资源。

配置Squid服务程序

基本设置:
Squid服务端: 双网卡,内网(仅主机)IP地址192.168.10.10,外网(桥接)DHCP自动获取IP地址,能上外网;
Squid客户端: 一张网卡(仅主机)IP地址192.168.10.20,客户端是Windows、Linux都行;
实验目的: 在服务端部署squid程序,让原本只能访问内网的客户端通过Squid服务器进行代理上网。
服务端安装Squid服务程序: yum install -y squid
Squid服务程序的配置文件: /etc/squid/squid.conf

常用的Squid服务程序配置参数以及作用

参数作用
http_port 3128监听的端口号
cache_mem 64M内存缓冲区的大小
cache_dir ufs /var/spool/squid 2000 16 256硬盘缓冲区的大小
cache_effective_user squid设置缓存的有效用户
cache_effective_group squid设置缓存的有效用户组
dns_nameservers IP地址一般不设置,而是用服务器默认的DNS地址
cache_access_log /var/log/squid/access.log访问日志文件的保存路径
cache_log /var/log/squid/cache.log缓存日志文件的保存路径
visible_hostname linuxprobe.com设置Squid服务器的名称

标准正向代理

Squid服务程序软件包在正确安装并启动后,默认就已经可以为用户提供标准正向代理模式服务了,而不再需要单独修改配置文件或者进行其他操作。
如果客户端是Linux系统,服务端还需要清空iptables防火墙

systemctl restart squid    #重启squid服务
systemctl enable squid     #把squid服务加入开机启动项
iptables -F                #清空iptables防火墙
service iptables save      #保存iptables当前策略状态

客户端(Linux)要做的: 打开浏览器(Firefox)。

Edit -> Preferences,Advanced -> Network -> Settings…,勾选“Manual proxy configuration:”,填写相关参数值HTTP Proxy:192.168.10.10 Port:3128。勾选“Use this proxy server for all protocols”。

Squid服务程序默认使用3128、3401与4827等端口号,可以把默认使用的端口号修改为其他值,以便起到一定的保护作用。注意需要把要更改的新端口加入到squid服务在SELinux域的允许列表中让SELinux放行。

添加网卡,将两个网卡改为桥接模式和仅主机模式
开启两个网卡的ip
yum install squid
vim /etc/squid/squid.conf                        #编辑squid主配置文件	
	http_port 8888                                   #修改默认端口号为8888
systemctl restart squid                          #重启squid服务
systemctl enable squid                           #把squid服务加入开机启动项
semanage port -l | grep squid_port_t             #过滤出与squid服务相关的端口允许列表
semanage port -a -t squid_port_t -p tcp 10000    #把新的端口号添加到Squid服务在SELinux域的允许列表中
semanage port -l | grep squid_port_t             #查看与squid服务相关的端口允许列表中是否已添加新端口
打开浏览器——设置——高级——使用代理服务器,IP地址写为linux的仅主机模式ip,端口号3128——window的DNS改为linux的仅主机模式ip,IP地址同网段

透明正向代理

透明正向代理只能设置在网关上。
透明正向代理模式让用户在没有感知的情况下使用代理服务,一方面不需要用户手动配置代理服务器的信息,进而降低了代理服务的使用门槛;另一方面也可以更隐秘地监督员工的上网行为。

如果服务器同时部署了DHCP服务,则squid透明代理配合dhcp服务可以让用户无须在浏览器或其他软件中配置代理服务器地址、端口号等信息,只要打开浏览器就能自动使用代理服务。
在实现透明正向代理前,客户机需要把浏览器的代理信息删除,回归到无法通过代理上网的状态。客户机网卡设置:IP地址:192.168.10.20,子网掩码:24,默认网关:192.168.10.10(squid服务端),DNS:8.8.8.8或114.114.114.114
要实现透明正向代理,需要SNAT技术完成数据转发,让让客户端主机将数据交给Squid代理服务器,再由后者转发到外网中。

实现透明正向代理有两种方法:

(简单)执行firewall-config弹出firewall设置窗口,把Runtime和Permanent下的Masquerading下的“Masquerade zone”勾选上。配置好客户机即刻通过浏览器上网;
(困难)采用纯命令行的iptables防火墙管理工具来部署。

采用纯命令行的iptables防火墙管理工具来配置squid透明正向代理方法详解:
要想让内网中的客户端主机能够访问外网,客户端主机首先要能获取到DNS地址解析服务的数据,才能在互联网中找到对应网站的IP地址。完成这一步配置后,客户机ping某外网网址,虽然ping不通,但应该能解获取DNS域名解析数据了(这一步的验证结果很重要);
编辑squid服务的主配置文件,开启透明正向代理模式。
完成SNAT数据转发功能。使用iptables防火墙管理命令把所有客户端主机对网站80端口的请求转发至Squid服务器本地的3128端口上。

iptables -F                                     #清空iptables防火墙
iptables -t nat -A POSTROUTING -p udp --dport 53 -o eno33554968 -j MASQUERADE    	#通过iptables命令实现DNS地址解析服务53端口的数据转发功能,enoXXXXXXXX是桥接网卡的名称
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf                                 #编辑/etc/sysctl.conf文件,允许Squid服务器转发IPv4数据包
sysctl -p                                                                        #让/etc/sysctl.conf文件中的转发参数立即生效
vim /etc/squid/squid.conf                       #编辑squid服务的主配置文件,开启透明正向代理模式
	http_port 3128 transparent                      #(59行)在主配置文件中服务器端口号后面追加上	transparent(透明的),即开启透明正向代理模式。
	cache_dir ufs /var/spool/squid 100 16 256       #(62行)设置缓存的保存路径(加快网站的二次响应)
systemctl stop squid                            #先关闭squid服务(对Squid服务程序的透明代理技术进行初始化需要)
squid -k parse                                  #检查主配置文件是否有错误
squid -z                                        #(生成16个缓存目录)对Squid服务程序的透明代理技术进行初始化
systemctl restart squid                         #重启squid服务
iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128            	#把所有客户端主机对网站80端口的请求转发至Squid服务器本地的3128端口上
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eno33554968 -j SNAT --to 192.168.1.102  		  #地址伪装,10段的地址统统伪装成192.168.1.102,这是桥接网卡地址(如果不做这一步,则当网站回送响应时会找不到客户机的私网地址而导致丢包)
service iptables save                           #保存当前iptables防火墙策略状态

反向代理

反向代理是Squid服务程序的一种重要模式,其原理是把一部分原本向网站源服务器发起的用户请求交给Squid服务器缓存节点来处理。但是这种技术的弊端也很明显,如果有心怀不轨之徒将自己的域名和服务器反向代理到某个知名的网站上面,从理论上来讲,当用户访问到这个域名时,也会看到与那个知名网站一样的内容(有些诈骗网站就是这样骗取用户信任的)。因此,当前许多网站都默认禁止了反向代理功能。开启了CDN(内容分发网络)服务的网站也可以避免这种窃取行为。如果访问开启了防护功能的网站,一般会看到如图所示的报错信息。

已知一网站www.apsonic-moto.com无开启CDN,其IP地址:139.159.253.44。可进行反向代理实验。

服务端:还原,重新安装squid。把端口号3128修改为网站源服务器的地址和端口号,此时正向解析服务会被暂停(正向代理服务不能与反向代理服务同时使用)。
yum install -y squid
vim /etc/squid/squid.conf
	http_port 192.168.1.105:80 vhost                      #192.168.1.105是服务端能上外网的网卡的IP地址
	cache_peer 139.159.253.44 parent 80 0 originserver     #60.191.254.29是网站源服务器IP地址
systemctl restart squid
在服务端访问自己ip地址,会出现与网站www.apsonic-moto.com一样内容

ACL访问控制

Squid服务程序的ACL是由多个策略规则组成的,它可以根据指定的策略规则来允许或限制访问请求,而且策略规则的匹配顺序与防火墙策略规则一样都是由上至下;在一旦形成匹配之后,则立即执行相应操作并结束匹配过程。为了避免ACL将所有流量全部禁止或全部放行,起不到预期的访问控制效果,运维人员通常会在ACL的最下面写上deny all或者allow all语句,以避免安全隐患。

实验1:只允许IP地址为192.168.10.20的客户端使用服务器上的Squid服务程序提供的代理服务,禁止其余所有的主机代理请求

vim /etc/squid/squid.conf
	acl client src 192.168.10.20    #(25行后)定义了一个名为client的别名,client = 192.168.10.20
	http_access allow client        #(30行后)允许client,即192.168.10.20使用代理服务
	http_access deny all            #禁止所有主机请求
	http_access deny !Safe_ports    #禁止不在Safe_ports列表中的端口号的请求
systemctl restart squid         #重启squid服务
客户机IP地址改成192.168.10.20以外的值,无法上网。

实验2:禁止所有客户端访问网址中包含linux关键词的网站

vim /etc/squid/squid.conf
	acl deny_keyword url_regex -i linux   #url_regex -i代表匹配网址中关键字,没有-i参数则指的是匹配整个网址
	http_access deny deny_keyword              
systemctl restart squid               #重启squid服务
例如http://www.linuxdown.net/网址中包含linux关键字的网站无法访问,仅限于非https网站(squid3.3.8无法限制https的网站)。

实验3:禁止所有客户端访问某个特定的网站

vim /etc/squid/squid.conf
	acl deny_url url_regex www.linuxdown.net      #禁止访问www.linuxdown.net
	http_access deny deny_url
systemctl restart squid

实验4:禁止员工在企业网内部下载带有某些后缀的文件

vim /etc/squid/squid.conf
	acl badfile urlpath_regex -i \.mp3$ \.rar$    #禁止下载后缀为mp3和rar的文件
	http_access deny badfile
systemctl restart squid

设置后,不管网址的文件是否存在,例如http://www.linuxprobe.com/book.rar,只要匹配到了规定的后缀,均会被拒绝访问(https的依然无法限制)。其次,如果是使用迅雷等P2P下载软件来下载资源的话,就只能使用专业级的应用防火墙来禁止。

Copyright © 2002-2019 某某自媒体运营 版权所有