00:00/00:00

本章节已编写及校对完毕,现有奖征集建议、若您发现本章中有错别字或补充欢迎联系刘遄老师QQ:5604241。

章节概述:

本章节刘遄老师将从讲解代理服务的原理及作用来引入Squid服务程序的功能介绍,带领读者们细致深入的学习Squid服务程序的正向解析和反向解析理论及配置方法。正向代理模式不仅能够实现让企业内部员工使用Squid代理服务器代理上网,还可以基于指定客户IP地址域名关键词网站网址下载文件后缀等元素来实现对用户的ACL访问控制列表限制功能。反向代理模式能够大幅提升用户访问网站的速度效率,进而还能帮助网站源服务器减轻负载压力。

总之,本章节刘遄老师会跟同学们一起来基于Squid服务程序来实现标准正向代理模式、透明正向代理模式、ACL访问控制列表功能及反向代理等实用功能,学习后您一定会对代理服务有了更加深入的理解和服务控制能力,对于生产环境工作会有很大的帮助。

16.1 代理缓存服务

Squid一款在Linux系统中最为流行的高性能代理服务软件,通常它会被用作是Web网站的前置缓存服务,能够替代用户向网站源服务器请求页面数据并进行缓存。简单来讲,Squid服务程序会按照接收到的用户请求来获取网页、图片等用户所需的数据并自动存储在服务器内,当后面的用户再来请求相同数据时,则可以直接把刚刚储存在服务器本地的数据交给用户,这样不仅大幅减少了用户的等待时间,进而还能减轻网站源服务器的负载压力。

Squid服务程序配置起来相对简单,效率高,功能丰富,它能支持如HTTP、FTP、SSL等多种协议的数据缓存,基于ACL访问控制列表和ARL访问权限列表功能的内容过滤与权限管理功能,基于多种条件来禁止用户访问存在威胁或不适宜的网站资源,在保证企业内网安全的同时还整体的提高了客户机的网页访问速度,帮助节省网络带宽。由于缓存代理服务不仅会消耗服务器较多的CPU计算性能、内存及硬盘空间等硬件资源,同时还需要较大的网络带宽来保证给用户传送数据的效率,每年的网络带宽开销就有可能超过数十万元,因此很多IDC或CDN服务供应商就会把缓存代理节点服务器放置在国内二三线城市来节约成本,Squid服务程序在为用户提供缓存代理服务时,可以从功能作用上分为正向代理反向代理

正向代理模式是让用户通过Squid服务程序获取到网站页面等资源,具体服务方式上又可以分为标准代理模式透明代理模式,标准正向代理模式是把网站数据缓存到服务器本地,提高数据资源被再次访问时的效率,但用户必需在上网时在浏览器等软件中填写代理服务器的IP地址与端口号信息,否则默认不使用代理服务,透明正向代理模式的功能作用与标准正向代理模式完全相同,区别是用户不需要手动指定代理服务器的IP地址与端口号,所以这种代理服务对于用户来讲是相对透明的工作模式,如图16-1所示。

squid拓扑

图16-1 Squid服务程序提供正向代理服务

日常中网站普遍的加载有大量图片、视频等静态资源内存,这些静态资源相对来说是比较稳定的数据信息,咱们可以使用Squid服务程序提供的反向代理模式来响应用户访问网站页面中静态资源的请求。而且如果反向代理服务器中恰巧已经有了用户要访问的静态资源则直接把缓存的内容发送给用户,这样不仅加快了用户的网站访问速度,而且还在一定程度上降低了网站服务器的负载压力,如图16-2所示:
squid反向代理

图16-2 Squid服务程序提供的反向代理模式

总结来说,正向代理模式一般会被用于企业局域网之中,让内网用户统一的通过Squid服务器访问互联网资源,不仅能够在一定程度上减少公网带宽开销,最主要的是还能做到网站内容的筛查限制,一旦内网用户访问的网站内容匹配到了禁止规则就会自动屏蔽网站,是非常不错的内容监管方案。而反向代理模式一般是为大中型网站提供缓存服务的,把网站中的静态资源保存在国内多个节点机房中,当有用户发起网站资源请求的时候可以就近为用户分配节点并传输资源,是一种在大型网站中十分普遍使用的技术。

16.2 配置Squid服务程序

配置Squid服务程序的步骤虽然十分简单,但需要仔细跟同学们交代一下实验背景,首先需要准备两台虚拟机,客户机不论是Linux系统还是Windows系统都可以,而这两台虚拟机为了能够互相通信则要都选择成仅主机模式(Hostonly),然后把其中任意一台虚拟机系统电源关闭,添加一块新的网卡后开启电源,如图16-3所示。需要注意这块新添加的网卡设备必须选择成桥接模式,否则这两台虚拟机都不能访问外网了,配置虚拟机内两台系统的网卡IP地址可参考下表:

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


添加一块网卡设备

图16-3 向虚拟机系统中添加一块新网卡设备

这样就有了一台既能够访问内网,又可以访问外网的虚拟机系统了,咱们一会就要把Squid服务程序部署在这台主机上面,然后让另外一台原本只能够访问内网的客户机代理上网,把内网主机中访问网站的请求都交由Squid服务器转发,用以保证让内网主机也能够访问外部网站,另外需要自行检查下服务器的网络是否已经配置妥当,可以尝试ping一下外网的域名试试:

[root@linuxprobe ~]# 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

当您配置好Yum软件仓库,挂载好设备镜像后就可以来安装squid服务程序了,咱们在书籍基础篇中大多数的程序都是通过Yum软件仓库来安装的,想必您肯定已经十分熟练了,所以刘遄老师就不在此处多赘述了。当然也不必担心自己过于依赖Yum软件仓库来管理软件程序包,书籍的第20章会单独给同学们仔细讲源码安装软件的,有兴趣的可以提前翻看一下~

[root@linuxprobe ~]# yum install squid
Loaded plugins: langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
rhel | 4.1 kB 00:00 
Resolving Dependencies
--> Running transaction check
---> Package squid.x86_64 7:3.3.8-11.el7 will be installed
--> Processing Dependency: perl(DBI) for package: 7:squid-3.3.8-11.el7.x86_64
--> Processing Dependency: perl(Data::Dumper) for package: 7:squid-3.3.8-11.el7.x86_64
--> Processing Dependency: perl(Digest::MD5) for package: 7:squid-3.3.8-11.el7.x86_64
--> Processing Dependency: libecap.so.2()(64bit) for package: 7:squid-3.3.8-11.el7.x86_64
--> Running transaction check
………………省略部分输出信息………………
Installed:
 squid.x86_64 7:3.3.8-11.el7 
Dependency Installed:
 libecap.x86_64 0:0.2.0-8.el7 
 perl-Compress-Raw-Bzip2.x86_64 0:2.061-3.el7 
 perl-Compress-Raw-Zlib.x86_64 1:2.061-4.el7 
 perl-DBI.x86_64 0:1.627-4.el7 
 perl-Data-Dumper.x86_64 0:2.145-3.el7 
 perl-Digest.noarch 0:1.17-245.el7 
 perl-Digest-MD5.x86_64 0:2.52-3.el7 
 perl-IO-Compress.noarch 0:2.061-2.el7 
 perl-Net-Daemon.noarch 0:0.48-5.el7 
 perl-PlRPC.noarch 0:0.2020-14.el7 
Complete!

与之前学习过的服务大致一样,Squid服务程序的配置文件也是被存放在/etc目录中以服务名称命名的一个目录中了,刘遄老师给同学们整理出了最常用的一些配置参数,大家只需先大致浏览一下即可:

参数 作用
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服务主机的名称。

16.3 正向代理
16.3.1 标准正向代理

Squid服务程序软件包在正确安装并启动后默认就已经可以为用户提供标准正向代理模式服务了,而不需要单独再去修改配置文件或者其他操作,咱们可以立即在Windows7系统的客户端主机上面打开任意一款浏览器,然后点击Internet选项标签,如图16-4所示:

[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-4 点击浏览器中的Internet选项标签

用户要想使用Squid服务程序提供的标准正向代理模式服务就必须在浏览器中填写服务器的IP地址以及端口号信息,因此还需要依次点击连接标签后再点击局域网设置选项,如图16-5与图16-6所示填写服务器信息后保存退出配置向导。
网络选项

图16-5 点击连接标签中的局域网设置按钮

填写Squid服务器的IP地址与端口号

图16-6 正确填写代理服务器的IP地址与端口号信息

用户只需要在浏览器中简单的填写配置信息就可以开始享用Squid服务程序提供的代理服务了,此时作为一个网卡为仅主机模式(Hostonly)的虚拟机,开始也奇迹般的能够上网浏览了,这一切都是托代理服务器转发的功劳哦~如图16-7所示:

图16-7 正常浏览在线书籍学习站点

如此公开而没有密码验证的代理服务终归觉得不放心,万一有其他人也来“蹭网”代理服务怎么办呢?Squid服务程序默认的会占用3128、3401与4827等端口号,咱们可以把默认占用的端口号修改成其他值,这样应该能起到一定的保护作用吧~同学们都知道在Linux系统配置服务程序就是在修改该服务的配置文件,因此直接在/etc目录中找到和squid服务程序同名目录中的配置文件,把其中http_port参数后面原有3128修改为10000,这样即是把Squid服务程序的代理服务端口修改成了新值,当然最后不要忘记再重启下服务程序哦~:

[root@linuxprobe ~]# vim /etc/squid/squid.conf
………………省略部分输出信息………………
45 #
46 # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
47 #
48 
49 # Example rule allowing access from your local networks.
50 # Adapt localnet in the ACL section to list your (internal) IP networks
51 # from where browsing should be allowed
52 http_access allow localnet
53 http_access allow localhost
54 
55 # And finally deny all other access to this proxy
56 http_access deny all
57 
58 # Squid normally listens to port 3128
59 http_port 10000
60 
http_port 10000
………………省略部分输出信息………………
[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'

有没有突然觉得这一幕似曾相识?在前面的第10章10.5.3小节咱们学习过基于端口号来部署httpd服务程序的虚拟主机功能,当时在编辑完配置文件后重启服务程序时被直接提示报错了,虽然现在重启服务程序并没有直接报错,但其实客户并不能使用代理服务呢。SElinux安全子系统认为Squid服务程序使用3128端口号是理所应当的,默认策略规则中也是允许的,但现在却在尝试使用新的10000端口号,这是原本并不属于Squid服务程序应该使用的系统资源,因此需要手动把新的端口号添加到squid服务程序在SElinux域的允许列表中即可:

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

出现问题?大胆提问!

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

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

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

16.3.2 ACL访问控制

在日常工作中企业员工只有通过公司内部网关服务器才能登陆到互联网中,那么当把Squid服务程序部署成为了公司企业的网关服务器后ACL访问控制列表功能也是非常实用的了,它可以根据指定的策略条件来进行对数据缓存或限制用户的访问操作,而大多数的情况这种限制策略都会十分奏效,很多公司分时段不让员工逛淘宝、打网页游戏都可以通过Squid服务程序的ACL访问控制列表功能实现。如果读者中有想以后做企业的同学,牢记本小节所教的内容,以后可以禁止某几个招聘网站或竞争对手的网站,绝对能够有效降低员工的跳槽几率呢~

ACL访问控制列表功能是由多个规则策略条目组成的,Squid服务程序可以根据指定的条件来允许或限制访问请求,匹配顺序会像防火墙策略一样由上至下,一旦匹配到符合条件的数据则立即执行相应操作并结束匹配过程。为了避免ACL访问控制列表功能把所有流量都禁止或全部流量都允许,也就起不到访问控制的预想效果了,因此运维工程师们通常会在控制列表的最下面部分写上deny all或者allow all来避免安全隐患。为了让同学们更好的理解Squid服务程序提供的ACL访问控制列表功能有多么的强大,刘遄老师接下来通过四个小实验来给大家操作演示,并进行详细的描述。

第1个实验:只允许来IP地址为192.168.10.20的客户主机使用服务器本地Squid服务程序提供的代理服务,禁止其余所有的主机代理请求。配置文件依然是Squid服务程序的主配置文件,但需要留心下配置参数的书写位置,因为如果太靠前的话,有些Squid服务程序自身的语句都没有加载完,就会导致策略不生效的,当然也不用太靠后,大约在26-32行左右就可以,这样分开书写的话会非常便于今后的修改。

[root@linuxprobe ~]# vim /etc/squid/squid.conf
 1 #
 2 # Recommended minimum configuration:
 3 #
 4 
 5 # Example rule allowing access from your local networks.
 6 # Adapt to list your (internal) IP networks from where browsing
 7 # should be allowed
 8 acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
 9 acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
 10 acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
 11 acl localnet src fc00::/7 # RFC 4193 local private network range
 12 acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) mac hines
 13 
 14 acl SSL_ports port 443
 15 acl Safe_ports port 80 # http
 16 acl Safe_ports port 21 # ftp
 17 acl Safe_ports port 443 # https
 18 acl Safe_ports port 70 # gopher
 19 acl Safe_ports port 210 # wais
 20 acl Safe_ports port 1025-65535 # unregistered ports
 21 acl Safe_ports port 280 # http-mgmt
 22 acl Safe_ports port 488 # gss-http
 23 acl Safe_ports port 591 # filemaker
 24 acl Safe_ports port 777 # multiling http
 25 acl CONNECT method CONNECT
 26 acl client src 192.168.10.20
 27 #
 28 # Recommended minimum Access Permission configuration:
 29 #
 30 # Deny requests to certain unsafe ports
 31 http_access allow client
 32 http_access deny all
 33 http_access deny !Safe_ports
 34
[root@linuxprobe ~]# systemctl restart squid

上面配置参数的含义其实很容易理解,首先定义了一个叫做client的别名,这其实很类似于在第13章13.6小节学习的DNS分离解析技术,那时分别定义了两个叫做china与american的别名变量,这样当再碰到这个别名时也就意味着对应的IP地址了。保存配置文件后重启Squid服务程序,这时客户端主机由于IP地址不符合咱们的允许策略而被禁止使用代理服务了,如图16-8所示:

访问被拒绝

图16-8 使用代理服务浏览网页失败

第2个实验:禁止所有客户主机访问网址中包含linux关键词的网站请求,这种ACL访问控制列表功能模式是比较粗矿、暴力的,任何用户访问的网址中只要带有了某个关键词就会被立即禁止,而不影响其他网站的访问请求。

[root@linuxprobe ~]# vim /etc/squid/squid.conf
 1 #
 2 # Recommended minimum configuration:
 3 #
 4 
 5 # Example rule allowing access from your local networks.
 6 # Adapt to list your (internal) IP networks from where browsing
 7 # should be allowed
 8 acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
 9 acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
 10 acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
 11 acl localnet src fc00::/7 # RFC 4193 local private network range
 12 acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) mac hines
 13 
 14 acl SSL_ports port 443
 15 acl Safe_ports port 80 # http
 16 acl Safe_ports port 21 # ftp
 17 acl Safe_ports port 443 # https
 18 acl Safe_ports port 70 # gopher
 19 acl Safe_ports port 210 # wais
 20 acl Safe_ports port 1025-65535 # unregistered ports
 21 acl Safe_ports port 280 # http-mgmt
 22 acl Safe_ports port 488 # gss-http
 23 acl Safe_ports port 591 # filemaker
 24 acl Safe_ports port 777 # multiling http
 25 acl CONNECT method CONNECT
 26 acl deny_keyword url_regex -i linux
 27 #
 28 # Recommended minimum Access Permission configuration:
 29 #
 30 # Deny requests to certain unsafe ports
 31 http_access deny deny_keyword
 33 http_access deny !Safe_ports
 34
[root@linuxprobe ~]# systemctl restart squid

刘遄老师建议大家在进行实验之前一定要先把前面实验代码清理删除干净,这样可以减少多个实验之间互相产生冲突的现象,这次就直接定义了一个叫做deny_keyword的别名,然后把所有网址带有linux关键词的网站请求统统拒绝掉,如图16-9所示:

访问又被拒绝

图16-9 使用代理服务浏览带有linux关键词的网站失败

第3个实验:如果是直接禁用了某个网址关键词,那肯定会有一大批网站被误封,这样在工作中就有可能影响了同事们正常的工作,因此咱们是可以直接禁止某个特定的网址的,按照下面参数配置并重启Squid服务程序后如图16-10所示。:

[root@linuxprobe ~]# vim /etc/squid/squid.conf
 1 #
 2 # Recommended minimum configuration:
 3 #
 4 
 5 # Example rule allowing access from your local networks.
 6 # Adapt to list your (internal) IP networks from where browsing
 7 # should be allowed
 8 acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
 9 acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
 10 acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
 11 acl localnet src fc00::/7 # RFC 4193 local private network range
 12 acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) mac hines
 13 
 14 acl SSL_ports port 443
 15 acl Safe_ports port 80 # http
 16 acl Safe_ports port 21 # ftp
 17 acl Safe_ports port 443 # https
 18 acl Safe_ports port 70 # gopher
 19 acl Safe_ports port 210 # wais
 20 acl Safe_ports port 1025-65535 # unregistered ports
 21 acl Safe_ports port 280 # http-mgmt
 22 acl Safe_ports port 488 # gss-http
 23 acl Safe_ports port 591 # filemaker
 24 acl Safe_ports port 777 # multiling http
 25 acl CONNECT method CONNECT
 26 acl deny_url url_regex http://www.linuxcool.com
 27 #
 28 # Recommended minimum Access Permission configuration:
 29 #
 30 # Deny requests to certain unsafe ports
 31 http_access deny deny_url
 33 http_access deny !Safe_ports
 34
[root@linuxprobe ~]# systemctl restart squid

图16-10 使用代理服务浏览特定的网址失败

第4个实验:禁止企业内部下载某些后缀的文件,这其实是一件长期让运维人员头疼的事情,因为在企业内网中总是会有些人会偷偷下载东西,要么就是游戏,要么就是回家看的电影,导致其他同事网速特别慢,还有可能影响生产环境的正常运转。这样的话咱们可以禁止所有用户访问rar或mp3等后缀文件的请求,这样能防住不少电脑小白,让他们知难而退,但如果对方是在用迅雷等P2P下载软件的话就只能用专业级WAF应用防护防火墙系统才能禁止了,如图16-11所示:

[root@linuxprobe ~]# vim /etc/squid/squid.conf
 1 #
 2 # Recommended minimum configuration:
 3 #
 4 
 5 # Example rule allowing access from your local networks.
 6 # Adapt to list your (internal) IP networks from where browsing
 7 # should be allowed
 8 acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
 9 acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
 10 acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
 11 acl localnet src fc00::/7 # RFC 4193 local private network range
 12 acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) mac hines
 13 
 14 acl SSL_ports port 443
 15 acl Safe_ports port 80 # http
 16 acl Safe_ports port 21 # ftp
 17 acl Safe_ports port 443 # https
 18 acl Safe_ports port 70 # gopher
 19 acl Safe_ports port 210 # wais
 20 acl Safe_ports port 1025-65535 # unregistered ports
 21 acl Safe_ports port 280 # http-mgmt
 22 acl Safe_ports port 488 # gss-http
 23 acl Safe_ports port 591 # filemaker
 24 acl Safe_ports port 777 # multiling http
 25 acl CONNECT method CONNECT
 26 acl badfile urlpath_regex -i \.mp3$ \.rar$
 27 #
 28 # Recommended minimum Access Permission configuration:
 29 #
 30 # Deny requests to certain unsafe ports
 31 http_access deny badfile
 33 http_access deny !Safe_ports
 34
[root@linuxprobe ~]# systemctl restart squid

图16-10 使用代理服务下载网站文件失败

16.3.3 透明正向代理

正向代理服务一般是面向于企业内部所有成员的,但每个企业成员对电脑的熟悉程度也不全相同,尤其您所在的公司不是IT行业,那想教会同事们使用代理服务还真是一件很麻烦的事情呢,有些时候公司领导也会为了使用ACL访问控制列表功能限制员工在公司内上网的行为,强制要求所有人通过代理服务上网,这时就必须要用透明的正向代理模式了。透明代理技术中的透明指的是让用户在没有感知的情况下就使用了代理服务,这样一方面是不需要用户去手动配置代理服务器的信息,进而降低了代理服务的使用门槛,另一方面也是为了更好的监督员工上网的行为,要想上网就必须通过Squid服务程序代理才行。

透明代理技术是一种普遍不会被用户感知到的代理模式,用户无需在浏览器或其他软件中配置代理服务器地址、端口号等信息,而是直接由DHCP服务器把网卡配置信息分发给客户主机,其中把网关地址指向到Squid服务器即可。这样不论用户是在本地使用浏览器打开网站,还是在QQ上面聊天就都会默认通过代理服务了,手动配置的客户端主机网卡参数可如图16-11所示:
配置网卡信息

图16-11 配置Windows客户端网卡参数信息

为了避免实验之间互相影响,更好体验到透明代理技术的实现效果,咱们需要把客户端浏览器的代理信息去除,然后再刷新页面就会看到访问任何网站都失败了,如图16-12所示,当然有些时候会因为Windows系统的缓存原因导致依然能看到网页内容,这时同学们换个网址再打开就会看到访问失败效果了。
尝试访问网站失败

图16-12 停止使用代理服务后访问网站失败

既然要让用户不去配置代理服务器的信息就能使用代理服务,那咱们作为技术的运营商也就必须提前把网络及数据转发功能配置好,需要使用第8章8.3.2小节学习的SNAT源地址转换协议来完成数据的转发,让客户端主机可以把数据交给Squid代理服务器并转发至外网中。简单来说,就是让Squid服务器作为一个中间人,实现内网客户端主机与外部互联网之间数据转发交换,是一个功能丰富的“传话者”,由于还未部署实现SNAT源地址转换协议功能,因此当前内网客户端主机是肯定不能访问外网的:

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

大家已经在第8章节中学习过了iptables与firewalld防火墙理论及规则策略配置方法,同学们可以任选一款来完成接下来的实验,刘遄老师觉得firewalld防火墙实在太简单了,自己琢磨下就可以搞定,因此决定接下来用纯命令行的iptables防火墙管理工具演示部署方法。想要内网客户端主机能够访问外网,首先就是要能获取到DNS地址解析服务的数据,这样才能在互联网中找到对应网站的IP地址,通过iptables命令实现对DNS地址解析服务53端口的转发功能,并且允许服务器本地对Ipv4数据包的转发功能,sysctl -p命令作用是让转发参数立即生效:

[root@linuxprobe ~]# iptables -F
[root@linuxprobe ~]# iptables -t nat -A POSTROUTING -p udp --dport 53 -o eno33554968 -j MASQUERADE
[root@linuxprobe ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@linuxprobe ~]# sysctl -p 
net.ipv4.ip_forward = 1

换回到客户端主机上面再来ping一下外网某个网址,就会发现虽然不能够连通网站,但此时已经能够获取到了外网DNS服务的域名解析数据,这个步骤十分的重要,为接下来的DNS源地址转换协议打下了扎扎实实的基础。

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和SNAT转发数据相比,Squid服务程序的透明代理模式配置过程就显得十分简单了,只需要在主配置文件中服务器端口号的后面追加上中透明(transparent)的英语单词,然后把约62行的#(井号)注释符去除设置缓存的保存路径就可以了。保存退出配置文件后再分别使用squid -k parse来检查下配置文件是否有错误,以及使用squid -z命令来对Squid服务程序的透明代理技术进行初始化。

[root@linuxprobe ~]# vim /etc/squid/squid.conf
………………省略部分输出信息………………
58 # Squid normally listens to port 3128
59 http_port 3128 transparent
60
61 # Uncomment and adjust the following to add a disk cache directory.
62 cache_dir ufs /var/spool/squid 100 16 256
63 
………………省略部分输出信息………………
[root@linuxprobe ~]# squid -k parse
2017/04/13 06:40:44| Startup: Initializing Authentication Schemes ...
2017/04/13 06:40:44| Startup: Initialized Authentication Scheme 'basic'
2017/04/13 06:40:44| Startup: Initialized Authentication Scheme 'digest'
2017/04/13 06:40:44| Startup: Initialized Authentication Scheme 'negotiate'
2017/04/13 06:40:44| Startup: Initialized Authentication Scheme 'ntlm'
2017/04/13 06:40:44| Startup: Initialized Authentication.
………………省略部分输出信息………………
[root@linuxprobe ~]# squid -z
2017/04/13 06:41:26 kid1| Creating missing swap directories
2017/04/13 06:41:26 kid1| /var/spool/squid exists
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/00
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/01
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/02
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/03
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/04
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/05
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/06
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/07
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/08
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/09
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/0A
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/0B
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/0C
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/0D
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/0E
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/0F
[root@linuxprobe ~]# systemctl restart squid

配置妥当并重启Squid服务程序没有报错信息后,咱们就可以继续来完成SNAT源地址数据转发功能了,原理其实很简单,就是使用iptables防火墙管理命令把所有客户端主机对网站80端口的请求转发至Squid服务器本地的3128端口上来做转发,具体配置参数如下,这时客户端主机再刷新下浏览器就又能看到网站内容啦,如图16-13所示:

[root@linuxprobe ~]# iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
[root@linuxprobe ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eno33554968 -j SNAT --to 您的桥接网卡IP地址
[root@linuxprobe ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]

再次尝试访问网站

图16-13 客户端使用Squid服务程序提供的透明代理技术

现在肯定有同学在想——如果开启了SNAT源地址转换协议,那么数据不就是直接被转发到外网了吗?是否还依然在使用Squid服务程序提供的代理服务呢?其实只要仔细的看下iptables防火墙命令就会发现,刘遄老师刚刚并不是单纯的开启了SNAT源地址转换功能,而是通过把客户机访问外网80端口的请求转发至了本地服务器的3128端口号上面,从而还是强制用户必须通过Squid服务程序才能上网,为了验证这个说法,咱们可以编辑Squid服务程序的配置文件,单独禁止掉书籍在线学习网站(http://www.linuxprobe.com/),然后刷新客户端网页即可看到又被禁止了,如图16-14所示:

图16-14 使用代理服务浏览特定的网址失败

16.4 反向代理

网站页面是由静态资源和动态资源一起组成的网络资源,其中静态资源包括有网站架构CSS文件、大量的图片、视频等数据,这些数据相对比于动态资源来说更加的稳定,是一般是不会经常发生改变的数据,而且随着建站技术的更新换代,人们的审美也在不断提升,因此图片内容越来越占据了网站中大面积的空间。如果能够把静态资源从网站页面中抽离出去,然后在全国各地部署静态资源数据的缓存节点,这样不仅能够大幅提升用户访问网站页面的速度,而且当由缓存服务器节点响应处理静态资源请求时,网站源服务器的负载压力问题也会得到明显的改善。

反向代理是Squid服务程序的重要工作模式之一,原理是把一部分用户原本应该向网站源服务器发起的请求交由给Squid缓存服务器节点来处理。但这种技术的弊端也很明显,如果有一个坏心肠的人把自己的域名和服务器反向代理到某个知名的网站上面,这样理论上来讲当用户访问到了这个骇客自己的域名时,也会看到和那个知名网站一摸一样的内容,有些诈骗网站就是这样骗取网民信任的,因此当前许多的网站都已经默认禁止了反向代理,或者开启了CDN内容分发网络的网站也是可以避免这种内容窃取行为的。如果网站开启了防护功能的话一般会看到如图16-15所示的报错信息,刘遄老师在此为了实验需要临时关闭了《Linux就该这么学》书籍在线学习网站的CDN服务及防护插件,请同学们也尽量选择用自己的网站或博客进行实验操作,避免影响到其他网站的正常运转,给别人造成麻烦。

图16-15 访问网站提示报错信息

使用Squid服务程序来配置反向代理服务是非常简单的,首先找到一个网站源服务器的IP地址,然后编辑Squid服务程序的主配置文件,把3128端口号修改成服务器地址和端口号,此时正向解析服务会被暂停,不能同时与反向代理一起使用,然后按照下面参数的格式写入要反向代理的网站源服务器IP地址信息,保存退出后重启Squid服务程序即可,正常网站反代后的效果如图16-16所示:

[root@linuxprobe ~]# vim /etc/squid/squid.conf
………………省略部分输出信息………………
57 
58 # Squid normally listens to port 3128
59 http_port 您的桥接网卡IP地址:80 vhost
60 cache_peer 网站源服务器IP地址 parent 80 0 originserver
61 
………………省略部分输出信息………………
[root@linuxprobe ~]# systemctl restart squid

图16-16 使用反向代理模式访问网站

出现问题?大胆提问!

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

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

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

本章节的复习作业(答案就在问题的下一行哦,用鼠标选中即可看到的~)

1:简述Squid服务程序提供的正向代理服务的主要作用。

答案:实现代理上网、隐藏用户真实访问信息以及对用户访问网站行为的ACL访问控制列表功能限制。

2:简述Squid服务程序提供的反向代理服务的主要作用。

答案:加快用户访问网站的速度,降低网站源服务器的负载压力。

3:Squid服务程序能够提供的代理模式包括有?

答案:正向代理模式与反向代理模式,其中正向代理模式中又分为标准正向代理模式与透明正向代理模式。

4:标准正向代理模式与透明正向代理模式的区别是什么?

答案:区别在于用户是否需要配置代理服务器的信息,若使用透明代理技术则用户一般是感知不到代理服务的存在,是一种对用户相比较“透明”的代理服务提供方式。

5:使用Squid服务程序提供的标准正向代理模式时,需要在浏览器中配置哪些信息?

答案:需要填写Squid服务器的IP地址及端口号信息。

6:若需要通过ACL访问控制列表功能限制用户不能使用代理服务访问指定网站,参数应该如何书写?

答案:若要禁止的网站为本书《Linux就该这么学》的在线学习网站,则可使用参数“acl deny_url url_regex http://www.linuxprobe.com”和“http_access deny deny_url”来禁止用户访问网站行为。

7:若要用户使用透明正向代理模式,则需要用DHCP服务器为用户网卡分配信息?

答案:需要为用户分配IP地址、子网掩码、网关地址以及外部DNS服务器地址。