CentOS 7中Squid代理服务器的配置与实现

2020-07-04 02:35刘春景建强邵国强孙涛张丽华
现代信息科技 2020年3期

刘春 景建强 邵国强 孙涛 张丽华

摘  要:Squid代理服务器是下载速度快、缩短延时并缓存Internet数据的软件,可以通过正向代理、反向代理实现加快内部浏览互联网速度,提高网络的安全性。文章首先分析代理工作原理,提出正向代理、透明代理和反向代理三种类型的应用机制,然后详细阐述了ACL访问控制特性来灵活地控制用户访问时间、站点等,最后通过实验实现了Squid服务器的代理机制应用。

关键词:代理缓存服务器;正向代理;反向代理;ACL访问控制

中图分类号:TP316.81      文献标识码:A 文章编号:2096-4706(2020)03-0038-04

Abstract:Squid proxy server is a software with fast download speed,short delay time and cache Internet data,which can speed up the internal browsing speed and improve the network security through forward proxy and reverse proxy. This paper first analyzes the working principle of the agent,and puts forward three types of application mechanisms:forward agent,transparent agent and reverse agent. Then it elaborates the ACL access control characteristics to flexibly control user access time,site and other restrictions. Finally,it realizes the application of Squid servers agent mechanism through experiments.

Keywords:proxy cache server;forward proxy;reverse proxy;ACL access control

0  引  言

為推动高校积极开展面向互联网应用创新的科研与教学改革,教育部科技发展中心设立“新一代信息技术创新项目”。我校获批教育部科技发展中心高校产学研创新基金项目,进行基于Docker在Kubernetes中实现容器的高可用的研究,促进信息技术与教育深度融合,提升高校创新型应用成果的产业化,其中Squid服务器是应用于该项目的一个代理服务器,是高性能的代理缓存服务器。Squid缓存不仅可以节省宝贵的带宽资源,也可以大大降低服务器的I/O。从经济角度考虑,它是很多网站架构中不可或缺的角色。Squid服务器主要支持HTTP、FTP等应用协议,一般用来做前置的Web缓存,加快用户访问Web的速度;代理内网用户访问互联网资源;设置访问控制策略,控制用户的上网行为。

1  代理服务器机制

1.1  代理工作基本原理

Squid服务器是一个缓存Internet数据的软件,当一个客户机用户想要下载或访问一个Web站点时,可以直接向Squid服务器提出一个申请,由Squid服务器连接所申请的主页,把网页反馈给到客户机。存在两种情况,一是Squid服务器缓存中已经备份有客户机想访问的页面的数据,那么代理服务器会直接把这部分数据直接返回给用户,使用户没有延时的感觉;二是Squid服务器的缓存中若没有客户机用户需要访问的数据,Squid就向Internet上的远程服务器提出申请,等待远程的应答后,接受远程服务器相应的页面,Squid服务器把这些数据再返回给客户机用户,同时备份一份数据到缓存里。并且,Squid服务器可以根据自己的需要设置规则,过滤掉不需要的数据,保存必需的数据。

Squid服务器的缓存功能可以实现不同地点、不同状态的客户机访问或下载同一个远程服务器的页面时,可以直接把缓存中存在备份页面立即返回给这些客户机,一方面提高了访问速度,同时也避免了Squid服务器向同一个远程服务器不断重复提交相同页面的申请,减少了客户机等待服务器的反应时间,提高了用户的访问速度。

从安全角度来讲,用户无论是访问浏览网站还是企业网站,这些目的网站只是接受代理服务器的访问请求,不知道客户机用户真实的IP地址,从而保护了客户机的安全,保证用户的隐私和权益。

1.2  代理的基本类型

代理服务器常分为正向代理、透明代理、反向代理。

(1)正向代理服务器:代理服务器位于客户端和真实服务器之间。客户端主动寻找代理服务器,为了通过代理服务器访问自己本身无法直接访问的主机,客户端借由正向代理可以访问很多不同互联网服务器的资源。正向代理作为客户端的代理,将从互联网上获取的资源返回给一个或多个的客户端,服务端(如Web服务器)只知道代理的IP地址而不知道客户端的IP地址。

(2)透明代理服务器:和传统代理一样,主要区别在于客户机不需要指定代理服务器的地址和端口号,多见于局域网环境,如在Linux网关中启用透明代理后,对控制用户访问网站行为的访问控制列表进行限制。

(3)反向代理服务器:以代理服务器来接收Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

由于Squid服务器安装简单、使用方便,所以已经被广泛使用。

2  Squid服务器的基础设定

2.1  安装Squid服务器

通常来说,安装Squid服务器有三种方法:第一种方法为从安装光盘中获取RPM包进行安装;第二种方法为从Squid的官方站点下载软件的源代码包,解压缩并解包,编译、链接生成可执行文件后进行安装;第三种方法为现在普遍采用的配置好yum源后,通过【yum】命令【yum install -y squid】来安装Squid服务器软件,常用的是第三种安装方法。

本机环境为CentOS 7.5,Squid服务器版本为3.5.20,首先查询是否安装过Squid服务器。

2.2  /etc/squid/squid.conf主配置文件说明

CentOS 7.x相比以前版本,主配置文件squid.conf非常简单,已经将里面一些的设定值去掉了,这样使用起来比较方便,但是如果想要进行其他的设定,就需要额外参考外部文件。同时系统提供了一个默认的配置文件squid.conf.default。

squid.conf文件的结构以及一些常用的选项:该文件由访问控制列表、参数设置和刷新模式三部分组成,在实际应用Squid服务器前,需要对该文件进行参数配置。

2.3  Squid服务器的访问控制列表

通过对Squid服务器的基本参数及访问控制的设置,能够提高该服务器的使用性能。默认的访问控制是拒绝所有客户机的请求代理,因此,要让客户机能够通过代理机制访问Web页面,首先需要在主配置文件squid.conf中添加访问控制规则,其中IP地址在访问控制元素中是使用最广泛的,可以是地址范围、子网等方式,例如可以设置目标服务器IP地址(即dst)来阻止客户机访问特定的Web页面站点,或通过设置终端用户的源地址(即src)限制哪些客户机可以访问Squid服务器。组成访问控制列表的元素除了IP地址外,还包括端口号、访问的时间、主机名及URL等条件。每个ACL参数定义的语法包括列表名称、列表类型及列表值。其中列表名称是每个ACL的名字,列表类型是指Squid服务器可识别的类型,Squid大约有25个不同的ACL类型,如src、dst、myip、dstdomain、srcmoain等。每个ACL由一个或多个包含逻辑或运算连接的列表值组成,通过对多列表值的匹配实现过滤功能。

通过对访问控制列表的HTTP_ACCESS参数项的设置“允许”与“拒绝”的访问权限,用来过滤进出访问Squid服务器的客户端。如决定哪些客户可以请求HTTP、哪些客户拒绝时可以使用HTTP_ACCESS规则。访问列表可以由多条规则构成,这些规则按照各自的顺序进行排列,当Squid服务器依次检测,一旦搜索到第一个匹配的规则时,就停止查找。如果每一个或某一类用户没有检测到与之相匹配的條件,那么Squid服务器则默认匹配当前规则列表中最后一个规则,若最后一条访问规则的条件是“拒绝”,就表示禁止该用户访问代理的请求,反之,则允许访问。为了代理服务器的安全,通常把最后的一条规则设置为“deny”或“allow”。

HTTP_ACCESS的参数在设置时,注意以下条件:

(1)尽管列表名称可以任意定义,但是要尽量定义便于理解、有实际意义的名称,方便管理维护,任何2个ACL不能使用相同的列表名称。不同的ACL元素分布在不同的行,通过Squid服务器组合在一个控制列表中。

(2)不同类型的列表值不同,以空格为分隔,多个列表值之间为“或”的关系,其中任何一个列表值检测匹配成功,就表示该ACL元素即被匹配;若需要限制的列表内容较多,可以通过独立的文件来存放,并在ACL的配置行中指明该文件的存放位置即可。

(3)Squid服务器有许多列表规则,访问列表的规则按照由上而下的顺序,Squid找到匹配的规则就不再继续搜索,因此将最常用、最具体匹配的访问规则放在列表前面,这就意味着延时最少,使用效率最高;若没有设置任何访问规则,Squid服务器将默认拒绝终端用户的访问请求。

(4)没有设置任何规则时,Squid服务将拒绝客户端的请求。这也就是为什么配置文件中默认存在三个网段的ACL规则,若想拒绝默认存在的3个网段中的某个网段,还需将其注释掉,再进行限制,以免发生冲突,造成访问规则不生效。

(5)由于将ACL主机名转换到IP的过程会延缓Squid的启动过程,一般在ACL中规则设置时,src、dst及myip中避免使用主机名,而是使用IP地址。

3  Squid服务器的代理实现

3.1  正向代理实现

正向代理中Squid服务器后面是客户端,客户端上网要通过Squid代理服务器登录外网,主要用在企业的办公环境中,员工访问公网需要通过Squid代理服务器来实现,这样可以节省网络带宽资源。而反向代理用来搭建网站静态项(图片、html、流媒体、js、css等)的缓存服务器,它用于网站架构中。实验采用CentOS 7.6版本的3台虚拟机,分别代表内Web服务器端、Squid服务代理端,内网客户端。Squid服务器端能够访问外网,内网客户端指定网关和HTTP代理,实现使内网客户端通过Squid服务正向代理访问外网及缓存的目标。

具体配置参数如下,Squid服务器的主机名squid.dqsy.com,双网卡模式为仅主机模式与NAT模式,Squid服务器的IP地址为192.168.32.111/仅主机模式。内网用户客户端主机名为client.dqsy.com,网络模式采用仅主机模式,其IP为192.168.32.110。实现Squid服务器能够访问外网,内网用户只能与Squid服务器ping通,但是不能访问外网。

3.1.1  搭建Squid服务器、内网客户端环境

(1)部署Squid服务器,实现双网卡模式:

Windows系统下打开网络连接,可以看到有两个与VMware有关的虚拟网卡,虚拟机在NAT网络模式下,主要依靠VMnet8网卡跟宿主机通信,所以必须保证启用了这块网卡,并设置IP、子网掩码及网关等。首先使用VMware的菜单【编辑】-【虚拟网络编辑器】设置网络连接模式为仅主机模式与NAT模式,接着选中Squid服务器所对应虚拟机的【设置】-【虚拟机设置】添加网络适配器为双网络连接模式。

(2)关闭防火墙,建立主机名:

使用【systemctl stop firewalld】或【systemctl disable fire-walld】命令关闭防火墙,禁用SElinux。

【hostnamectl set-hostname squid.dqsy.com】建立主机名。

(3)查看Squid服务器的IP,设置双网卡地址:

【cd /etc/sysconfig/network-scripts/】进入网卡配置文件所在目录。

【vim ifcfg-ens33】设置仅主机模式的静态IP。

【cp -a ifcfg-ens33 ifcfg-ens37】命令复制原网卡配置文件,新文件为ifcfg-ens37为NAT模式网卡配置文件名。

【vim ifcfg-ens37】命令直接修改网卡的配置文件来配置静态IP,DNS域名服务器可以指定8.8.8.8,也可以指定114.114.114.114进行测试。

【systemctl stop NetworkManager】关闭网络管理器Network-Manager。

【rm -rf /etc/udev/rules.d/70-persistent-ipoib.rules】删除70- persistent-net.rules文件。

配置完成,reboot命令重启机器后,需要通过命令【sys-temctl restart network】重启网络服务。在网卡的IP地址对应的配置文件中,如果配置的是外网的网卡对应的配置文件,那么,GATEWAY必须要填写,如果配置的是内网的网卡对应的配置文件,那么,GATEWAY必须为空,或者注释掉此项。使用安装好的firefox浏览器访问外网即可查询。

(4)内网客户机设置网络连接模式及静态IP:

选中Squid服务器所对应虚拟机的【设置】-【虚拟机设置】设置虚拟机的网络适配器网络连接模式为仅主机模式。使用【systemctl stop firewalld】或【systemctl disable firewalld】命令关闭防火墙,禁用SElinux。

【hostnamectl set-hostname client.dqsy.com】建立主机名。

【vim /etc/sysconfig/network-scripts/ifcfg-ens33】命令直接修改网卡的配置文件来配置静态IP。

【systemctl stop Network Manager】关闭网络管理器Netwok-Manager。

配置完成后,需要通过命令【systemctl restart network】重启网络服务。

3.1.2  配置Squid服务器

(1)安装Squid服务:

首先查询Squid软件是否安装,如果没有,可以通过yum源安装。

【rpm -qa squid】检查Squid软件是否安装。

【yum install -y squid】如果没有安装,则通过此命令安装。

【cp -p /etc/squid/squid.conf /etc/squid/squid.conf.bak】在修改配置文件前,一定要备份配置文件。

(2)编辑/etc/squid/squid.conf配置文件:

【vim /etc/squid/squid.conf】在参数配置部分添加规则visible_hostname squid.dqsy.com。

【systemctl start squid】启动Squid服务。

【systemctl enable squid】设置Squid服务开机自动启动。

【lsof -i:3128】查看3128端口。

(3)开启路由转发:

【echo “1”>/proc/sys/net/ipv4/ip_forward】临时开启路由转发。或【vim /etc/sysctl.conf】加入一行net.ipv4.ip_forward=1,保存退出后,使用【sysctl-p】命令刷新,永久开启路由转发。

3.1.3  實现正向代理

(1)内网客户机配置网关:

【vim /etc/sysconfig/network-scripts/ifcfg-ens33】添加一行“GATEWAY=192.168.20.121”指向Squid服务器的仅主机模式的IP。

【systemctl restart network】重启网络服务。

(2)配置代理服务器的IP和代理端口:

选中Firefox浏览器右上角open menu--preferences--advanced--network--settings--手动填写代理服务器的IP和代理端口,此处填写就应该填写192.168.20.121,端口3128,然后保存退出后就能访问外网了。

3.2  反向代理实现

反向代理和正向代理恰恰相反,是客户端访问缓存服务器,缓存服务器反向代理给后端的真实服务器。这样的好处就是大大减小后端服务器的访问压力,当缓存服务器中有数据时,直接返回数据。没有数据,则向后端存储服务器进行索取数据,缓存在自己身上,以便下次访问。实验采用3台虚拟机,第一台机器域名为user.squid.com,模拟用户,IP/网络连接模式为:40.40.40.10/NAT模式;第二台机器域名为server.squid.com,模拟Squid缓存服务器,IP/网络连接模式为:40.40.40.11/NAT模式,192.168.32.11/仅主机模式;第三台机器域名为web.squid.com,模拟后端真实服务器,IP/网络连接模式为:192.168.32.10/仅主机模式。具体实现如下:

3.2.1  web.squid.com端进行主机网卡设置、生效

(1)首先修改主机名以便查看:

【hostnamect】set-hostname web.squid.com

(2)重启机器让主机名生效。

(3)配置仅主机网卡:

vim /etc/sysconfig/network-scripts/ifcfg-ens33ens33

重启网卡让IP生效

systemctl restart network

(4)挂载光盘:

【root@Web ~】# mount/dev/sr0/mnt/

mount:/dev/sr0 写保护,将以只读方式挂载

(5)编写本地yum源文件,指定rpm包的挂载目录:

【root@Web ~】#cd/etc/yum.repos.d/

【root@Web yum.repos.d】# mkdir repo_bak

【root@Web yum.repos.d】# mv * repo_bak/

【root@Web yum.repos.d】# vim local.repo

【local】

name=local #起个名字

baseurl=file:///mnt #指定rpm包的挂载目录

enabled=1 #开启此源

gpgcheck=0 #不进行效验(因为是本地光盘浪费时间且没必要)

(6)更新缓存:

【root@Web yum.repos.d】# yum makecache

元数据缓存已建立

(7)安装Apache服务:

apr.x86_64 0:1.4.8-3.el7

apr-util.x86_64 0:1.5.2-6.el7

HTTPd-tools.x86_64 0:2.4.6-67.el7.centos

完毕!

(8)向网站中写入数据并启动服务进行测试访问:

【root@Web ~】# echo "This is Web page">/var/www/html/index.html

【root@Web ~】# systemctl start HTTPd

【root@Web ~】# curl localhost

This is Web page

3.2.2  server.squid.com端部署

(1)修改主机名:

hostnamectl set-hostname server.squid.com

(2)重启机器并添加两块网卡。

(3)配置第一块仅主机模式网卡:

Vim /etc/sysconfig/network-scripts/ifcfg-ens33

(4)重启网卡使IP生效:

systemctl restart network

(5)安装Squid服务:

【root@server ~】# yum install -y squid

(6)修改配置文件:

【root@server ~】# vim /etc/squid/squid.conf

56 HTTP_ACCESS allow all #允许所有访问

59 HTTP_port 40.40.40.11:80 vhost vport #支持主机名或者端口访问

60 visible_hostname server.squid.com #设置主机名信息

61 cache_peer 192.168.32.10 parent 80 0 originserver #指定后端real server并指定其端口0代表一台Squid服务器

(7)启动Squid服务:

【root@server ~】# systemctl start squid

(8)User端进行测试:

【root@user ~】# curl 40.40.40.11

This is Web page

实验结果表明反向代理用于服务器端,用户(域名:user.squid.com)访问Squid缓存服务器(域名:server.squid.com)的80端口,緩存服务器根据配置去请求后端的Web服务器(域名:web.squid.com),然后把返回的数据备份到本地同时回复给用户,当其他用户再次请求相同的Web资源时,会直接把缓存的信息直接发送给该用户,缩短延时。

4  结  论

Squid服务器是Linux系统中最常用的开源的代理服务软件,支持HTTP、GOPHER、FTP、SSL协议代理,通过缓存加速的方式为用户提供访问Web页面。客户机无法访问Web页面时,可以如找一个跳板一样,通过正向代理服务器实现访问外部资源。而代理服务器会先检查缓存,若缓存中存在需要访问的Web页面,则直接将页面返回给用户,若缓存中不存在用户要访问的信息,代理服务器向访问Web网站进行申请,获得回复后把页面缓存到代理服务器中同时再把该内容回馈给用户,当其他用户再次访问时直接发送给这些用户,从而提高用户的访问命中率。反向代理对外是透明的,客户机不需要设置任何参数就可以直接访问Web页面。

Squid服务器运用访问列表控制实现应用层过滤控制功能,通过设置Squid的ACL元素及访问规则,可以允许或拒绝某一用户或某类用户对Web页面的访问,限制企业用户的上网行为,实现对访问的安全控制。

参考文献:

[1] 粟毅.Linux系统下Web网站服务器反向代理设计与实现 [J].信息与电脑(理论版),2018(18):75-77.

[2] 康志辉.基于反向代理的资源服务器重定向技术研究 [J].西安文理学院学报(自然科学版),2017,20(1):88-91.

[3] 孙莉娜.RHEL5中Squid代理服务器的配置与实现 [J].网络安全技术与应用,2014(4):50+53.

[4] 薛建,王信堂,曲守宁.使用LVS和Squid构建代理服务器集群系统 [J].计算机系统应用,2012,21(11):29-33.

[5] 李莉,杨柯,赵磊.基于Linux的Squid代理系统的研究和实现 [J].信息安全与通信保密,2012(10):72-74.

作者简介:刘春(1970.03-),女,汉族,山东齐河人,网络工程系主任,教授,硕士研究生,工学硕士,主要研究方向:云计算、网络工程、软件工程;通讯作者:景建强(1998.10-),男,汉族,吉林长春人,本科,主要研究方向:容器云、网络工程。