第16章 使用Squid部署代理缓存服务

章节概述:

本章节从代理缓存服务的工作原理开始讲起,让读者能够清晰理解正向代理普通模式、透明模式)与反向代理的作用。

正确的使用Squid服务程序部署代理缓存服务可以有效提升访问静态资源的效率降低原服务器的负载

不仅如此,还为读者们添加了对指定IP地址网页关键词网址文件后缀的ACL访问限制功能的实验,真的很实用哦~

16.1 代理缓存服务

Squid服务程序是一款在类Unix系统中最为流行的高性能代理服务软件,通常会被当作网站的前置缓存服务,用于替代用户向网站服务器请求页面数据并进行缓存,通俗来讲,Squid服务程序会接收用户的请求,然后自动去下载指定数据(如网页)并存储在服务器内,当以后的用户再来请求相同数据时,则直接将刚刚储存在服务器本地的数据交给用户,减少了用户的等待时间。
Squid服务程序配置起来相对简单,效率高、支持如HTTP、FTP、SSL等多种协议的数据缓存,还支持基于ACL访问控制列表和ARL访问权限列表功能的内容过滤与权限管理功能,禁止用户访问存在威胁或不适宜的网站资源,保证内网安全的同时还整体的提高了客户机的访问速度,帮助节省网络带宽,尤其适合安装在内存大、硬盘转速快的服务器上。
squid图片
从作用上分为正向代理反向代理
正向代理让用户可以通过Squid服务程序获取网站页面等数据,具体工作形式又分为标准代理模式透明代理模式
标准正向代理模式:

将网站的数据缓存在服务器本地,提高数据资源被再次访问时的效率,但用户必需在上网时指定代理服务器的IP地址与端口号,否则将不使用Squid服务。

透明正向代理模式:

功能作用与标准正向代理模式完全相同,但用户不需要指定代理服务器的IP地址与端口号,所以这种代理服务对于用户来讲是完全透明的。

squid拓扑反向代理则是为了降低网站服务器负载而设计的,反向代理服务器负责回应用户对原始网站服务器的静态页面请求,即如果反向代理服务器中正巧有用户要访问的静态资源则直接将缓存的内容发送给用户,减少了对原始服务器的部分数据资源请求。
squid反向代理
所以对于正向代理一般用于企业的局域网内,让员工通过Squid服务程序来代理上网,不但能节省网络带宽资源还能限制访问的页面,而反向代理则大多搭建在网站架构中,用于缓存网站的静态数据(如图片、HTML静态网页、JS、CSS框架文件等)。

16.2 配置Squid服务程序

本小节将为大家演示如何部署Squid服务的正向代理与反向代理,首先我们需要再添加一块网卡设备(桥接模式):
添加一块网卡设备
按照下面的表单配置IP地址:

编辑
主机名称 操作系统 IP地址
服务端 红帽RHEL7操作系统 外网卡:桥接DHCP模式
内网卡:192.168.10.10
用户端 微软Windows7操作系统 192.168.10.20

测试是否能够访问互联网:

[root@linuxprobe Desktop]# ping www.linuxprobe.com
PING www.linuxprobe.com (162.159.211.33) 56(84) bytes of data.
64 bytes from 162.159.211.33: icmp_seq=1 ttl=45 time=166 ms
64 bytes from 162.159.211.33: icmp_seq=2 ttl=45 time=168 ms
64 bytes from 162.159.211.33: icmp_seq=3 ttl=45 time=167 ms
64 bytes from 162.159.211.33: icmp_seq=4 ttl=45 time=166 ms
^C
--- www.linuxprobe.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 166.361/167.039/168.109/0.836 ms

安装squid服务程序:

[root@linuxprobe ~]# yum install squid
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分安装过程………………
Installing:
 squid                        x86_64      7:3.3.8-11.el7       rhel7      2.6 M
Installing for dependencies:
 libecap                      x86_64      0.2.0-8.el7          rhel7       20 k
 perl-Compress-Raw-Bzip2      x86_64      2.061-3.el7          rhel7       32 k
 perl-Compress-Raw-Zlib       x86_64      1:2.061-4.el7        rhel7       57 k
 perl-DBI                     x86_64      1.627-4.el7          rhel7      802 k
 perl-Data-Dumper             x86_64      2.145-3.el7          rhel7       47 k
 perl-Digest                  noarch      1.17-245.el7         rhel7       23 k
 perl-Digest-MD5              x86_64      2.52-3.el7           rhel7       30 k
 perl-IO-Compress             noarch      2.061-2.el7          rhel7      260 k
 perl-Net-Daemon              noarch      0.48-5.el7           rhel7       51 k
 perl-PlRPC                   noarch      0.2020-14.el7        rhel7       36 k
………………省略部分安装过程………………
Complete!

先别着急配置哦!我们先来了解下squid服务程序的主要文件吧:

编辑
主服务程序 /usr/sbin/squid
配置文件目录 /etc/squid
主配置文件 /etc/squid/squid.conf
访问日志文件 /var/log/squid/access.log
缓存日志文件 /var/log/squid/cache.log

而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服务程序并加入到开机启动项:

[root@linuxprobe ~]# systemctl restart squid
[root@linuxprobe ~]# systemctl enable squid
ln -s '/usr/lib/systemd/system/squid.service' '/etc/systemd/system/multi-user.target.wants/squid.service'
16.2.1 标准正向代理

当Squid服务程序顺利启动后,默认即可使用标准正向代理模式啦,在Windows7系统中打开浏览器后依次点击:
浏览器设置
在网络选项中点击“连接”→“局域网设置”:
网络选项
填写Squid服务器的IP地址与端口号
填写Squid服务器的IP地址与端口号
尝试访问网站:
访问网站

Squid服务程序默认会占用3128、3401与4827端口,我们也可以将端口号修改为其他的哦, 编辑配置文件(修改第59行):

[root@linuxprobe ~]# vim /etc/squid/squid.conf
http_port 10000

使用setsebool命令来限制squid服务只能使用自定义的端口号:

[root@linuxprobe ~]# setsebool -P squid_connect_any 0

查看当前SElinux允许的服务端口:

[root@linuxprobe ~]#  semanage port -l | grep -w -i squid_port_t
squid_port_t                   tcp      3128, 3401, 4827
squid_port_t                   udp      3401, 4827

添加SELinux对10000端口的允许策略:

[root@linuxprobe ~]# semanage port -a -t squid_port_t -p tcp 10000
[root@linuxprobe ~]# semanage port -l | grep -w -i squid_port_t
squid_port_t                   tcp      10000, 3128, 3401, 4827
squid_port_t                   udp      3401, 4827

重启squid服务程序后即可生效:

[root@linuxprobe ~]# systemctl restart squid

出现问题?大胆提问!

因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

Linux技术交流请加A群:560843(),B群:340829(推荐),C群:463590(推荐),点此查看全国群

*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。

16.2.2 透明正向代理

如果要想实现透明正向代理,则必需将用户的网关IP指向Squid服务器,而此后便无需再修改浏览器选项:
配置网卡信息
尝试访问网站失败:
尝试访问网站失败
在命令提示符中ping下域名:

C:\Users\linuxprobe>ping www.linuxprobe.com
Ping 请求找不到主机 www.linuxprobe.com。请检查该名称,然后重试。

原来Squid服务程序是不支持DNS解析代理的,这个就需要配置SNAT啦。如果忘记SNAT技术了,没关系,回去再看下防火墙的章节吧,-o 参数后面写外网出口的网卡名称:

[root@linuxprobe ~]# iptables -t nat -A POSTROUTING -p udp --dport 53 -o eno33554968 -j MASQUERADE

开启Ipv4的转发策略:

[root@linuxprobe ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@linuxprobe ~]# sysctl -p
net.ipv4.ip_forward = 1

再次尝试Ping下网站域名:

C:\Users\linuxprobe>ping www.linuxprobe.com
正在 Ping www.linuxprobe.com [116.31.127.233] 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。
请求超时。
116.31.127.233 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),

不错哦~现在DNS已经能够正常工作啦,来配置透明正向代理吧,编辑配置文件:

[root@linuxprobe ~]# vim /etc/squid/squid.conf
//在第59行后面添加参数transparent
http_port 3128 transparent 

判断配置文件是否有错误(会有很多输出值):

[root@linuxprobe ~]# squid -k parse

重新启动squid服务程序:

[root@linuxprobe ~]# systemctl restart squid

将用户对80端口的请求转发至3128端口:

[root@linuxprobe ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128
[root@linuxprobe ~]# iptables -t nat -R PREROUTING 1 -i eno33554968 -p tcp --dport 80 -j REDIRECT --to-port 3128

快去客户机尝试访问网站吧:
再次尝试访问网站

16.2.2 反向代理

反向代理的作用是将网站中的静态资源本地化,也就是将一部分本应该由原始服务器处理的请求交给Squid缓存服务处理。

编辑Squid服务程序的配置文件(正向代理与反向代理不能同时使用,请还原您前面修改过的参数):

[root@linuxprobe ~]# vim /etc/squid/squid.conf
//第59行,修改格式为:http_port Squid服务器地址:监听端口号 vhost
http_port 192.168.10.10:80 vhost
//第60行,添加格式为:cache_peer 原网站服务器地址 parent 服务器端口号 0 originserver
cache_peer 106.184.1.125 parent 80 0 originserver

然后使用客户机去访问网站:
访问书籍网站
因为《Linux就该这么学》的网站框架使用了动态资源,所以现在看起来会有些乱乱的。

16.3 ACL访问控制

Squid服务的ACL访问控制是非常有用的功能,可以根据特定条件来进行数据缓存或限制用户的访问,ACL元素的定义语法为:

acl aclname acltype string
acl aclname acltype "file"

src定义来源地址(即用户的客户机IP地址):

acl aclname src ip-address/netmask
acl aclname src addr1-addr2/netmask

dst定义目标地址(即用户请求的网站IP地址):

acl aclname dst ip-address/netmask

port用于指定访问端口:

acl aclname port 80 1024
acl aclname port 0-1024

url_regex用于限制网址中的关键词:

acl aclname url_regex [-i] pattern

proto用于定义要代理的协议:

acl aclname proto HTTP FTP

method用于指定请求的方法:

acl aclname method GET POST

访问控制列表由多个规则条目组成的,根据指定的条件来允许或限制访问请求,匹配顺序会由上至下,一旦匹配则立即结束,通常会在控制列表的最下面写上“deny all”或者“allow all”来避免安全隐患。
仅允许192.168.10.20的主机使用本地Squid服务,拒绝其余主机:

acl client src 192.168.10.20
http_access allow client
http_access deny all

访问被拒绝
拒绝客户机使用代理服务器访问带有关键词“linux”的网站:

acl deny_keyword url_regex -i linux
http_access deny deny_keyword

访问又被拒绝
拒绝客户机使用代理服务器访问《Linux就该这么学》的网站:

acl deny_url url_regex http://www.linuxprobe.com
http_access deny deny_url

访问依然被拒绝
禁止客户机使用代理服务器下载以mp3与rar为后缀的文件:

acl badfile urlpath_regex -i \.mp3$ \.rar$
http_access deny badfile

访问还是被拒绝了

posted @ 2016-08-16 08:11  冯琪  阅读(932)  评论(0编辑  收藏  举报