第16章:使用 Squid 部署代理缓存服务
本章学习内容有:介绍代理服务的原理及其作用;介绍 Squid 服务程序的正向解析和反向解析;进一步理解代理服务,提升代理服务的控制能力。
一、认识 代理缓存服务
1、什么是 Squid 代理缓存服务?有什么用?
Squid 是 Linux 系统中最为流行的一款高性能代理服务软件,通常用作 Web 网站的前置缓存服务,能够代替用户向网站服务器请求页面数据并进行缓存。
简单来说,Squid 服务程序会按照收到的用户请求向网站源服务器请求页面、图片等所需的数据,并将服务器返回的数据存储在运行 Squid 服务程序的服务器上。当有用户再请求相同的数据时,则可以直接将存储服务器本地的数据交付给用户,这样不仅减少了用户的等待时间,还缓解了网站服务器的负载压力。
Squid 支持 HTTP、FTP、SSL等多种协议的数据缓存,可以基于访问控制列表(ACL)和访问权限列表(ARL)执行内容过滤与权限管理功能,还可以基于多种条件禁止用户访问存在威胁或不适宜的网站资源,因此可以保护企业内网的安全,提升用户的网络体验,帮助节省网络带宽。
Squid 服务程序为用户提供缓存代理服务时,具有正向代理模式和反向代理模式之分。
2、关于代理缓存服务的运营成本
由于缓存代理服务不但会消耗服务器较多的 CPU 计算性能、内存以及硬盘等硬件资源,同时还需要较大的网络带宽来保障数据的传输效率,由此会造成较大的网络带宽开销。因此国内很多 IDC 或 CDN 服务提供商会将缓存代理节点服务器放置在二三线城市以降低运营成本。
3、什么是正向代理模式?
正向代理模式,是指让用户通过 Squid 服务程序获取网站页面等资源,以及基于访问控制列表(ACL)功能对用户访问网站行为进行限制,在具体的服务方式上又分为标准代理模式与透明代理模式。
1)标准正向代理模式是把网站数据缓存到服务器本地,提高数据资源被再次访问时的效率,但是用户在上网时必须在浏览器等软件中填写代理服务器的 IP 地址与端口号信息,否则默认不使用代理服务。
2)透明正向代理模式的作用与标准正向代理模式基本相同,区别是用户不需要手动指定代理服务器的 IP 地址与端口号,所以这种代理服务对于用户来讲是相对透明的。
3)Squid 服务程序提供正向代理服务的拓扑图,如下:
图解1:局域网内的主机如果想要访问外网,则必须要通过 Squid 服务器提供的代理才行,这样当 Squid 服务器接收到用户的指令后会向外部发出请求,然后将接收到的数据交还给发出指令的那个用户,从而实现了用户的代理上网需求。
图解2:从拓扑图中不难看出,企业中的主机要想上网,就必须要经过公司的网关服务器,既然这是一条流量的必经之路,因此企业一般还会把 Squid 服务程序部署到网关服务器处,并通过稍后讲到的 ACL(访问控制列表)功能对企业内员工进行上网审计及限制。
4、什么是反向代理模式?
反向代理模式是指让多台节点主机反向缓存网站数据,从而加快用户访问速度。因为一般来讲,网站中会普遍加载大量的文字、图片等静态资源,而且它们相对来说都是比较稳定的数据信息,当用户发起网站页面中这些静态资源的访问请求时,我们可以使用 Squid 服务程序提供的反向代理模式来进行响应。而且,如果反向代理服务器中恰巧已经有了用户要访问的静态资源,则直接将缓存的这些静态资源发送给用户,这不仅可以加快用户的网站访问速度,还在一定程度上降低了网站服务器的负载压力。
Squid 服务程序提供反向代理服务的拓扑图,如下:
图解:当外网用户尝试访问某个网站时,实际请求是被 Squid 服务器所处理的。反向代理服务器会将缓存好的静态资源更快地交付给外网用户,从而加快了网站页面被用户访问的速度。并且由于网站页面数据中的静态资源请求已被 Squid 服务器处理,因此网站服务器负责动态数据查询就可以了,也进而降低了服务器机房中网站服务器的负载压力。
5、正向代理模式 与 反向代理模式 对比
总结来说,正向代理模式一般用于企业局域网之中,让企业用户统一地通过 Squid 服务访问互联网资源,这样不仅可以在一定程度上减少公网带宽的开销,而且还能对用户访问的网站内容进行监管限制,一旦内网用户访问的网站内容与禁止规则相匹配,就会自动屏蔽网站。
反向代理模式一般是为大中型网站提供缓存服务的,它把网站中的静态资源保存在国内多个节点机房中,当有用户发起静态资源的访问请求时,可以就近为用户分配节点并传输资源,因此在大中型网站中得到了普遍应用。
二、部署 Squid 代理缓存服务
1、实验前的准备工作
准备两台虚拟机,一台用作 Squid 服务器,另外一台用作 Squid 客户端(客户端可以是Windows,也可以是Linux)。为了使这两台机器能够相互通信,需要将这两台虚拟机都设置为仅主机模式(Hostonly)。
然后关闭其中一台虚拟机的电源,为其添加一块新的网卡后再开启电源(需要注意的是,这块新添加的网卡设备必须选择为桥接模式,否则这两台虚拟机都将无法访问外网)。
这两台虚拟机的配置参考下表:
经过上述配置,我们得到了一台既能访问内网、又能访问外网的虚拟机了,这台机器将被用作 Squid 服务器。可以使用 ping 命令来测试它是否已经具备了外网访问能力。
另一台机器只能访问内网,将被我们用作 Squid 客户端,通过 Squid 服务器进行代理,该客户端也可拥有了访问外网的能力。
2、安装 Squid 服务程序
当配置好 Yum 软件仓库并挂载好设备镜像后,就可以安装 Squid 服务程序了。Squid 服务程序在Linux系统中的服务名称为 squid。
yum install squid
3、查看 Squid 服务程序的配置文件
cat /etc/squid/squid.conf
该配置文件中的常用字段及其含义如下图示:
4、部署 Squid 标准正向代理
1)Squid 服务程序软件包在正确安装并启动后,默认就已经可以为用户提供标准正向代理模式服务了,而不再需要单独修改配置文件或者进行其他操作。
systemctl restart squid
systemctl enable squid
2)在Squid客户端(以Windows为例)测试Squid服务的标准正向代理。
打开任一浏览器,如IE浏览器,点击“工具”->"Internet选项",并如下配置参数:
![测试Squid服务的标准正向代理
设置完成后,原本不能访问外网的Squid客户端,现在已经可以使用IE浏览器访问外部网站了。
3)修改Squid服务的默认端口号
Squid 服务程序默认使用 3128、3401 与 4827 等端口号,因此可以把默认使用的端口号修改为其他值,以便起到一定的保护作用。
vim /etc/squid/squid.conf
systemctl restart squid
修改完成后,重启squid服务,并在squid客户端的浏览器中修改squid服务的连接参数,即可再次测试。测试后会发现,squid客户端访问外网资源时竟然被拒绝了,这是为什么呢?
这是因为squid默认的端口号列表中,并不包含 10000,虽然它允许我们修改,但是 SELinux出于安全的策略保护,SELinux 限制了 squid 服务使用 10000 这个端口。因此我们还需要手动地把我们自定义的端口号 10000 添加到 SELinux 域的允许列表中去。
这样再测试squid客户端,就能正常地使用 10000 端口号访问外部网站资源了。
5、使用 squid 服务的 ACL 访问控制
1)什么是 ACL 访问控制?
在日常工作中,企业员工一般是通过公司内部的网关服务器来访问互联网,当将 Squid服务程序部署为公司网络的网关服务器后,Squid 服务程序的访问控制列表(ACL)功能将发挥它的用武之地。ACL可以根据指定的策略条件来缓存数据或限制用户的访问。
比如很多公司会分时段地禁止员工逛淘宝、打网页游戏,这些禁止行为都可以通过 Squid 服务程序的 ACL 功能来实现。
2)关于 ACL 的策略规则
Squid 服务程序的 ACL 是由多个策略规则组成的,它可以根据指定的策略规则来允许或限制访问请求,而且策略规则的匹配顺序与防火墙策略规则一样都是由上至下;在一旦形成匹配之后,则立即执行相应操作并结束匹配过程。
为了避免 ACL 将所有流量全部禁止或全部放行,起不到预期的访问控制效果,运维人员通常会在 ACL 的最下面写上 deny all 或者 allow all 语句,以避免安全隐患。
3)实验1:只允许 IP 地址为 192.0168.10.20 的客户端使用服务器上 squid 服务所提供的代理服务,禁止其它所有主机的代理请求。
vim /etc/squid/squid.conf
systemctl restart squid
修改完成后,重启squid服务,即可在 squid 客户端进行测试了,如果客户端的 IP 不是 192.168.10.20 将被拒绝使用 squid 代理服务。
4)实验2:禁止所有客户端访问 url 中包含 linux 关键词的网站。
vim /etc/squid/squid.conf
systemctl restart squid
配置完成后,重启 squid 服务。在使用了 squid 代理服务的客户端中访问 https://www.linux.com/ 将被拒绝。
5)实验3:禁止所有客户端访问某个特定的网站。
vim /etc/squid/squid.conf
systemctl restart squid
配置完成后,重启 squid 服务。在使用了 squid 代理服务的客户端中访问百度,将被拒绝。
6)实验4:禁止员工在企业内网中下载带有某些后缀的文件。
vim /etc/squid/squid.conf
systemctl restart squid
配置完成后,重启 squid 服务。在使用了 squid 代理服务的客户端中访问 .rar 或 .avi 格式的文件并下载,将会被拒绝。
6、部署 Squid 透明正向代理
1)再次理解“透明正向代理”
正向代理服务一般是针对企业内部的所有员工设置的,鉴于每位员工所掌握的计算机知识不尽相同,如果您所在的公司不是 IT 行业的公司,想教会大家如何使用代理服务也不是一件容易的事情。再者,无论是什么行业的公司,公司领导都希望能采取某些措施限制员工在公司内的上网行为,这时就需要用到透明的正向代理模式了。
“透明”二字指的是让用户在没有感知的情况下使用代理服务,这样的好处是一方面不需要用户手动配置代理服务器的信息,进而降低了代理服务的使用门槛;另一方面也可以更隐秘地监督员工的上网行为。
在透明代理模式中,用户无须在浏览器或其他软件中配置代理服务器地址、端口号等信息,而是由 DHCP 服务器将网络配置信息分配给客户端主机。这样只要用户打开浏览器便会自动使用代理服务了。
2)配置 squid 服务
vim /etc/squid/squid.conf
squid -k parse
squid -z
systemctl restart squid
配置完成后,使用 squid -k parse
命令检查 squid 主配置文件是否有错误,以及使用 squid -z
命令对 Squid服务程序的透明代理技术进行初始化。
3)手动为客户端配置网络参数
既然要让用户在无需过多配置系统的情况下就能使用squid代理服务,作为运维人员就必须提前把客户端的网络配置信息和SNAT数据转发功能配置好。
客户端的网络参数配置如下图示:
4)实现 SNAT 数据转发功能
再使用 SNAT 技术完成数据转发,让客户端主机把数据交给 Squid 代理服务器,再由squid服务将其转发到外网中。
简单来说,SNAT 技术的目的就是让 Squid 服务器作为一个中间人,实现内网客户端主机与外部网络之间的数据传输。
SNAT 的实现原理其实很简单,就是使用 iptables 防火墙管理命令把所有客户端主机对网站 80 端口的请求转发至 Squid 服务器本地的 3128 端口上。SNAT 数据转发功能的具体配置参数如下图示:
上图中的命令,不仅只是开启了 SNAT 数据转发功能,而是通过把客户端主机访问外网 80 端口的请求转发到 Squid 服务器的 3128 端口号上,从而还是强制了客户端主机必须通过 Squid 服务程序来上网。
5)现在去到已经配置过网络参数的客户机上,尝试访问外网,就可能正常访问了,并且无须手动地在浏览器中配置 squid 服务的连接参数。
7、部署 Squid 反向代理
1)什么是网站的静态资源?
网站页面是由静态资源和动态资源一起组成的,其中静态资源包括网站架构 CSS 文件、大量的图片、视频等数据,这些数据相对于动态资源来说更加稳定,一般不会经常发生改变。
但是,随着建站技术的更新换代,外加人们不断提升的审美能力,这些静态资源占据的网站空间越来越多。如果能够把这些静态资源从网站页面中抽离出去,然后在全国各地部署静态资源的缓存节点,这样不仅可以提升用户访问网站的速度,而且网站源服务器也会因为这些缓存节点的存在而降低负载。
2)再次理解“反向代理”
反向代理是 Squid 服务程序的一种重要模式,其原理是把一部分原本向网站源服务器发起的用户请求交给 Squid 服务器缓存节点来处理。
但是这种技术的弊端也很明显,如果有心怀不轨之徒将自己的域名和服务器反向代理到某个知名的网站上面,从理论上来讲,当用户访问到这个域名时,也会看到与那个知名网站一样的内容。因此,当前许多网站都默认禁止了反向代理功能。
除了禁用网站的反向代理功能,开启了CDN(内容分发网络)服务也可以避免上述这种窃取行为。
3)配置 squid 服务
使用 Squid 服务程序来配置反向代理服务非常简单。
首先找到一个网站源服务器的 IP 地址,然后编辑 Squid 服务程序的主配置文件,把端口号 3128 修改为网站源服务器的地址和端口号,此时正向解析服务会被暂停(正向代理和反向代理服务不能同时存在)。
vim /etc/squid/squid.conf
systemctl restart squid
经过上述配置,使用了 squid 服务的客户端,就可以通过 squid 反向代理来访问指定的源网站了。
本章复习题
本章 END 2019-01-14