Squid 代理服务器应用

        Squid 是 Linux系统中最常用的一款开源代理服务软件(官方网站为http://www.squid-cache.org),可以很好地实现 HTTP 和 FTP,以及 DNS 查询、SSL 等应用的缓存代理,功能十分强大。

一、Squid 服务基础

本节将介绍缓存代理的工作机制、类型,以及 Squid 服务的安装和运行控制、主配置文件。

缓存代理概述

作为应用层的代理服务软件,Squid 主要提供缓存加速、应用层过滤控制的功能。

1.代理的工作机制

        当客户机通过代理来请求 Web 页面时,指定的代理服务器会先检查自己的缓存。如果缓存中已经有客户机需要的页面,则直接将缓存中的页面内容反馈给客户机。如果缓存中没有客户机要访问的页面,则由代理服务器向 Internet发送访问请求,获得返回的 Web 页面以后,将网页数据保存到缓存中并发送给客户机,如图所示。

        HTTP 代理的缓存加速对象主要是文字、图像等静态 Web 元素。使用缓存机制后,当客户机在不同的时候访问同一 Web 元素,或者不同的客户机访问相同的 Web 元素时,可以直接从代理服务器的缓存中获得结果。这样就大大减少了向 Internet 提交重复的 Web 请求的过程,提高了客户机的 Web 访问响应速度。
        由于客户机的 Web 访问请求实际上是由代理服务器来代替完成的,从而可以隐藏用户的真实 IP 地址,起到一定的保护作用。另一方面,代理服务器担任着类似“经纪人”的角色,可以针对要访问的目标、客户机的地址、访问的时间段等进行过滤控制。 

2.代理的基本类型

        根据实现方式不同,代理服务可分为传统代理和透明代理两种常见的代理服务。

  • 传统代理:也就是普通的代理服务,首先必须在客户机的浏览器、QQ 聊天工具、下载软件等程序中手动设置代理服务器的地址和端口,然后才能使用代理来访问网络。对于网页浏览器,访问网站时的域名解析请求也会发给指定的代理服务器。
  • 透明代理:提供与传统代理相同的功能和服务,其区别在于客户机不需要指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web 访问重定向,实际仍然交给代理服务器来处理。重定向的过程对客户机是“透明"的,用户甚至并不知道自己在使用代理服务,所以称为透明代理。使用透明代理时,网页浏览器访问网站时的域名解析请求将优先发给 DNS 服务器。

        实际应用中,传统代理多见于 Internet 环境,如为 QQ 程序使用代理可以隐藏本机真实IP 地址、为下载工具使用多个代理可以规避服务器的并发连接限制。而透明代理多见于局域网环境,如在 Linux 网关中启用透明代理后,局域网主机无须进行额外设置就可以享受更好的上网速度。

二、安装及运行控制

下面以 Squid 3.5.23 版为例,介绍其安装和运行控制。

1.编译安装 Squid

        配置 Squid 的编译选项时,将安装目录设为/usr/ocal/squid,其他具体选项根据实际需要来定,配置前可参考“./configure --help”给出的说明。

上述选项含义如下。

  • --prefix=/usr/local/squid:安装目录。
  • --sysconfdir=/etc:单独将配置文件修改到其他目录。
  • --enable-linux-netfilter:使用内核过滤。
  • --enable-async-io=值:异步1/0,提升存储性能,相当于“--enable-pthreads --enable-storeio= ufs,aufs --with -pthreads --with-aufs-thread=值”。
  • --enable-default-err-language=Simplify_Chinese:错误信息的显示语言。
  • --disable-poll 与-enable-epoll:关闭默认使用 poll 模式,开启 epol 模式提升性能。
  • --enable-gnuregex:使用 GNU 正则表达式。

安装完后,创建链接文件、创建用户和组。

2.Squid 的配置文件

        Squid 服务的配置文件位于/etc/squid.conf,充分了解配置行的作用将有助于管理员根据实际情况灵活配置代理服务。 

         默认情况下,配置文件中不包括 cache effective user 与 cache_efective_group 配置项,需要手动添加。

3.Squid 的运行控制

下面是 Squid 的运行控制步骤。

(1)检查配置文件语法是否正确

执行下面命令检查配置文件语法:

(2)启动、停止 Squid

        第一次启动 Squid 服务时,会自动初始化缓存目录。在没有可用的 Squid 服务脚本的情况下,也可以直接调用 Squid 程序来启动服务,这时需要先进行初始化。

确认 Squid 服务处于正常监听状态。

 (3)使用 Squid 服务脚本

        为了使 Squid 服务的启动、停止、重载等操作更加方便,可以编写 Squid 服务脚本,并使用 chkconfig 和 systemct 工具来进行管理。 

         这样一来,就可以通过 Squid 脚本来启动、停止、重启、重载 Squid 服务器了,方法是在执行/etcinit.d/squid 脚本时添加相应的 start、stop、restart 参数或通过 systemctl 命令控制 Squid 服务。

三、构建代理服务器

        本节主要从三个方面来学习 Squid 服务的构建和使用,分别为传统代理、透明代理和ACL访问控制。传统代理的实现最为简单,透明代理还需要结合默认路由、防火墙策略等一起来完成,ACL列表主要用来针对客户机的Web 访问过程进行过滤控制。

传统代理

        使用传统代理的特点在于客户机的相关程序(如IE浏览器、QQ 聊天软件)必须指定代理服务器的地址、端口等基本信息。下面通过一个简单的应用案例来学习传统代理的配置和使用方法。

基于 Internet 网络环境(图 一),案例的主要需求描述如下。

  • 在 Linux 主机 B上,构建 Squid 为客户机访问各种网站提供代理服务,但禁止通过代理下载超过 10MB 大小的文件。
  • 在客户机 C 上,指定主机 B作为 Web 访问代理,以隐藏自己的真实 IP 地址。
图一、 使用 Squid 传统代理

         针对上述实验环境,主机B作为代理服务器,必须正确构建 Squid 服务,并允许客户机使用代理。若要客户机通过代理以htp:/hwww.bdqn.com/的域名形式访问,则代理服务器本身必须能够正确解析该域名。主机C作为客户机,需要为浏览器等程序指定所使用的代理服务器地址、端口号等信息,主机A作为测试网站,需要启用 httpd 服务。
        关于 httpd 服务器、DNS 服务器的构建,请参考以前的课程,这里不再重复讲解。下面主要介绍 Squid 服务器的配置、客户机的代理设置,以及代理服务的验证方法。

1.Squid 服务器的配置

        配置 Squid 实现传统代理服务时,需要注意添加 htp access allow all 访问策略,以便允许任意客户机使用代理服务。除此以外,为了限制下载的文件大小,还需要设置reply_body_max_size 项,其他各种参数均可保持默认。

(1)修改 squid.conf配置文件。

(2)重载 squid 服务。

        修改 squid.conf配置文件以后,需要重新启动服务方可生效。执行“systemctl restartsquid"或“squid -k reconfigure”,都可以重新加载服务配置。

2.客户机的代理配置
在 Edge 浏览器中,单击如图一所示的框选的“...”位置,然后选择“设置”一“查看高级设置”一“打开代理设置”,打开“设置"窗口,在“手动设置代理”选项组中单击“使用代理服务器选项下面的开关项,并添加代理服务器地址与端口,单击“保存”按钮即可生效,如图二所示。 

图一、Egde 浏览器的代理设置(1)
图二、Egde 浏览器的代理设置(2)

         若要在 Linux 客户机的命令行界面中使用代理服务器(如 elinks 网页浏览器、wget 下载工具),必须通过环境变量来指定代理服务器的地址、端口等信息。

3.代理服务的验证方法

        在客户机 172.16.16.110 中通过浏览器访问目标网站 http://172.16.16.1721,然后观察Squid 代理服务器、Web 服务器的访问日志,以验证代理服务是否发挥作用。

(1)查看 Squid 访问日志的新增记录

        在 Squid 代理服务器中,通过跟踪 Squid 服务的访问日志文件,应该能够发现客户机172.16.16.110 访问网站服务器 172.16.16.172 的记录。 

(2)查看Web 访问日志的新增记录

        在被访问的 Web 服务器中,通过跟踪 httpd 服务的访问日志文件,应该能够发现来自代理服务器 172.16.16.22的访问记录。这说明当客户机使用代理以后,Web 服务器并不知道客户机的真实IP地址,因为实际上是由代理服务器替它在访问。 

        当从客户机再次访问同一 Web 页面时,Squid 访问日志中会增加新的记录,但 Web 访问日志中的记录不会有变化(除非页面变更或执行强制刷新等操作)。这说明当客户机重复访问同一静态页面时,实际上是由代理服务器通过缓存提供的。 

透明代理

        透明代理提供的服务功能与传统代理是一致的,但是其“透明”的实现依赖于默认路由和防火墙的重定向策略,因此更适用于为局域网主机服务,而不适合为 Internet 中的客户机提供服务。下面也通过一个简单的应用案例来学习透明代理的配置和使用。
        基于局域网主机通过 Linux 网关访问 Internet 的环境,如图一所示,案例的主要需求描述如下。

  • 在 Linux 网关上,构建 Squid 为客户机访问 Internet 提供代理服务。
  • 在所有的局域网客户机上,只需正确设置IP 地址、默认网关和 DNS,不需要手动指定代理服务器的地址、端口等信息。
图一、使用 Squid 透明代理

         针对上述实验环境,透明代理的关键在于 Linux 网关服务器,而对于客户机仅需正确设置网络地址、默认网关,而并不需要指定代理服务器(若指定了反而易出错)。
        关于客户机的 DNS 解析工作,最好通过正常的 DNS 服务器来提供,不建议抛给代理服务器来处理。下面主要介绍 Squid 服务的透明代理设置、防火墙策略设置,其他配置操作请参考前面的传统代理构建过程。

1.配置 Squid 支持透明代理

        Squid 服务的默认配置并不支持透明代理,因此需要调整相关设置。对于 2.6 以上版本的 Squid 服务,只要在 http port配置行加上一个“transparent”(透明)选项,就可以支持透明代理了。

2.设置 firewalld 的重定向策略

        透明代理中的 Squid 服务实际上是构建在 Linux 网关主机上的,因此只需正确设置防火墙策略,就可以将局域网主机访问 Internet 的数据包转交给 Squid 进行处理。这需要用到 firewalld 的 IP 伪装与端口转发策略,其作用是实现本机端口的重定向,将访问网站协议HTTP、HTTPS 的外发数据包转交给本机的 Squid 服务(3128 端口)。

                防火墙做端口转发操作,将访问本机 80、443 端口的请求转发到 3128 端口。

        由于 FTP 协议涉及多个端口、多个连接,虽然也可以通过 HTTP 代理进行访问,但使用透明代理不便实现,因此最佳做法仍然是采用传统代理的方式--手动指定代理服务器的地址、端口号。

3.验证透明代理的使用

        为了验证透明代理的效果,如果存在手动指定的代理服务器设置应在客户机中将其去除例如,在 Edge或其他浏览器的连接设置中不要勾选使用代理服务器:在 Linux 客户机的命令行界面中,可以通过 unset 命令清除 HTTP PROXY、HTTPS PROXY 等变量。无论是windows 客户机还是 linux 客户机,网关都应设为 Squid 代理服务器的地址。

     

        在客户机 192.168.4.110 中通过浏览器访问目标网站 htp://172.16.16.1721,然后观察Squid 代理服务器、Web 服务器的访问日志,以验证透明代理是否发挥作用。对代理服务操作的验证结果保存在 Squid 代理服务器中,从中能够发现客户机 192.168.4.110访问网站服务器 172.16.16.172的记录:在被访问的Web 服务器中,应该能够发现来自代理服务器172.16.16.1 的访问记录。 

四、 ACL访问控制

        Squid 提供了强大的代理控制机制,通过合理设置ACL(Access Control List,访问控制列表)并进行限制,可以针对源地址、目标地址、访问的URL路径、访问的时间等各种条件进行过滤。
        在配置文件 squid.conf中,ACL访问控制通过以下两个步骤来实现:其一,使用 acl配置项定义需要控制的条件;其二,通过 http access 配置项对已定义的列表做“允许”或“拒绝”访问的控制。

1.定义访问控制列表

        每行 acl 配置可以定义一条访问控制列表,格式如下所示。

        其中,列表名称”由管理员自行指定,用来识别控制条件,列表类型”必须使用 Squid 预定义的值,对应不同类别的控制条件:列表内容"是要控制的具体对象,不同类型的列表所对应的内容也不一样,可以有多个值(以空格分隔,为“或”的关系)。
        通过上述格式可以发现,定义访问控制列表时,关键在于选择“列表类型”并设置具体的条件对象。Squid 预定义的列表类型有很多种,常用的包括源地址、目标地址、访问时间、访问端口等,如表所示。 

        在定义访问控制列表时,应结合当前网络环境正确分析用户的访问需求,准确定义使用代理服务的控制条件。例如,针对不同的客户机地址、需要限制访问的目标网站、特定的时间段...…,分别定义列表。 

        当需要限制的同一类对象较多时,可以使用独立的文件来存放,在 acl配置行的列表内容处指定对应的文件位置即可。例如,若要针对目标地址建立黑名单文件,可以参考以下操作。 

2.设置访问权限

        定义好各种访问控制列表以后,需要使用 httpd access 配置项来进行控制。必须注意的是,http access 配置行必须放在对应的 ac 配置行之后。每行 http access 配置确定一条访问控制规则,格式如下所示。 

        在每条 http access 规则中,可以同时包含多个访问控制列表名,各个列表之间以空格分隔,为“与”的关系,表示必须满足所有访问控制列表对应的条件才会进行限制。需要使用取反条件时,可以在访问控制列表前添加“!”符号。 

        执行访问控制时,Squid 将按照各条规则的顺序依次进行检查,如果找到一条相匹配的规则就不再向后搜索(这点与iptables 的规则匹配类似)。因此,规则的顺序安排是非常重要的,以下两种默认情况值得大家注意。

  • 没有设置任何规则时:Squid 服务将拒绝客户端的请求。
  • 有规则但找不到相匹配的项:Squid将采用与最后一条规则相反的动作,即如果最后一条规则是 alow,就拒绝客户端的请求,否则允许该请求。

通常情况下,把最常用到的控制规则放在最前面,以减少Squid 的负载。在访问控制的总体策略上,建议采用“先拒绝后允许"或“先允许后拒绝”的方式,最后一条规则设为默认策略,设为“http access allow all”或者“http access deny all”。 

3.验证访问控制效果

        关于 Squid 服务的访问控制效果,无外乎两种情况:一种是能够正常访问,另一种是禁止访问。当客户机的代理访问请求被 Squid 服务拒绝时,在浏览器中会看到 ERROR 报错页面,具体内容会根据限制条件不同有些细小差别。

(1)测试访问权限限制

        对于使用 http access 规则拒绝访问的情况(如访问被禁止的网站或者在禁止的时间段访问),浏览器的报错页面中会出现“访问被拒绝”的提示,如图一所示。

(2)测试文件下载限制

        对于 1.2.1 节限制文件下载大小的情况(reply_body_max_size 配置项),当下载超过指定大小的 Web 对象时,浏览器的报错页面中会出现“请求或访问太大"的提示,如图二所示。

图一、拒绝使用 Squid 代理服务
图二、拒绝下载超过大小的文件

         用来下载测试的文件可以通过 dd 命令生成。例如,若限制的大小为 10MB,则可以在目标网站服务器中创建一个 15MB 的测试文件。

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

H-J-L

求打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值