linux-运维进阶-21 Squid部署代理缓存服务
概念解析
Squid
Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。
Squid是一种用来缓冲Internet数据的软件。它是这样实现其功能的,接受来自人们需要下载的目标(object)的请求并适当地处理这些请求。也就是说,如果一个人想下载一web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器(比如:http://squid.nlanr.net)并向这个页面发出请求。然后,Squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时,Squid可以简单地从磁盘中读到它,那样数据迅即就会传输到客户机上。当前的Squid可以处理HTTP,FTP,GOPHER,SSL和WAIS等协议。但它不能处理如POP,NNTP,RealAudio以及其它类型的东西。
squid分类
按照代理类型的不同,可以将Squid代理分为正向代理和反向代理。
正向代理:根据实现方式的不同,又可以分为普通代理和透明代理。
1)普通代理:需要客户机在浏览器中指定代理服务器的地址、端口;
2)透明代理:适用于企业的网关主机(共享接入Internet)中,客户机不需要指定代理服务器地址、端口等信息,代理服务器需要设置防火墙策略将客户机的Web访问数据转交给代理服务程序处理;
反向代理:是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。
Squid是一个缓存Internet 数据的软件,其接收用户的下载申请,并自动处理所下载的数据。当一个用户想要下载一个主页时,可以向Squid 发出一个申请,要Squid 代替其进行下载,然后Squid 连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid 把保存的备份立即传给用户,使用户觉得速度相当快。Squid 可以代理HTTP、FTP、GOPHER、SSL和WAIS等协议并且Squid 可以自动地进行处理,可以根据自己的需要设置Squid,使之过滤掉不想要的东西。
Squid代理服务器工作在TCP/IP的应用层:
实验准备工作
实验原理
我们需要两台虚拟机,一台是win10操作系统作为客户端,另一台我们新安装一个Centos 7的虚拟机Server。配置好虚拟机Server后,将Server作为客户端win10的代理服务器,从而让win10能够上网。为了大家能完全理解虚拟机通信原理,我这里将整体上的网络结构拓扑图画出来,如下图:
在之前的文章中,我们讲解过网络适配器三种模式的工作原理,本次实验设置如下:
设置
1.虚拟机Server
2.虚拟机WIN10
3.VMware Workstation Pro设置
点击图中更改设置即可更改,这里放出的图是改好后的图。
通信原理
结合下图,我们的Server网卡1和WIN10 的网卡均是仅主机模式的,所以对应的,他们的ip自然是由VMnet1的虚拟DHCP服务器来分配。我们的Server网卡2是桥接模式的,相当于用一个交换机连着我们电脑的真实电脑,所以我们现在用着的物理机的ip和Server网卡2的ip均由我们的家用路由器分配。我们去到别人家里,连上别人家wifi,就会得到一个ip地址,仔细看的话就会发现家用路由器分配给我们的都是192.168.1.X的ip,在这里也是这个道理。
对了,有一次我将虚拟机网卡设置为桥接模式之后,开机查看ip发现ip竟然不是192.168.1.X了,而是一个奇怪的ip。我当时想了很久也没发现问题,难道是电脑抽风了?后来才想起来,我家断网了,我临时连着的是手机热点,真是很尴尬。
如下图,由于虚拟机WIN10是仅主机模式的,所以它要访问NET外网,其数据就必须从Server那里经过。
查看本机ip(虚拟机win10)
1 | C:\Users\zhong>ipconfig |
查看Server的ip
1 | [root@localhost ~]# ip add |
由上面两张图我们得知了虚拟机WIN10的ip是192.168.23.53
虚拟机Server的ip分别是192.168.23.52和192.168.1.106
为了实验更加清晰明了,我们把分配好的ip加到拓扑图里,新的拓扑图如下:
保存快照
实验到这里,基本准备已经准备好,记住一定要给上述虚拟机Server关机保存快照,这个快照的名字就叫做“快照1”,待会我们做透明代理实验的时候恢复成这个快照再做。虚拟机WIN10就可以不用弄快照了,反正是测试用的,配置少得可怜。
配置Squid服务程序
检查虚拟机WIN10是否可以和Server通信,这里要注意的是,不同网段不能ping通,同一网段可以ping通,如下图:
检查Server是否可以连接外网和ping通虚拟机WIN10(ping需要手动用ctrl+c打断)
1 | [root@localhost ~]# ping baidu.com |
安装squid程序,并查看配置文件
1 | [root@localhost ~]# yum install squid -y |
参数 | 作用 |
---|---|
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服务器的名称 |
正向代理
开启ip forward(路由转发)
1 | [root@localhost ~]# echo "net.ipv4.ip_forward = 1" >>/usr/lib/sysctl.d/50-default.conf |
放行所有http访问
1 | [root@localhost ~]# vim /etc/squid/squid.conf |
安装openssl
1 | [root@localhost ~]# yum -y install openssl |
关闭防火墙
1 | [root@localhost ~]# systemctl stop firewalld.service |
squid加上DNS,重启squid服务
1 | [root@localhost ~]# echo "dns_nameservers 114.114.114.114 114.114.115.115" >> /etc/squid/squid.conf |
一开始,我们的虚拟机WIN10客户端是无法上网的,所以要设置代理。
虚拟机WIN10设置客户端代理,如下图:
如上图,原本处在仅主机模式的虚拟机WIN10是无法上网的,现在设置了代理就可以访问外网了。
ACL访问控制
只允许某个客户端进行代理
修改配置文件
1 | [root@localhost ~]# vim /etc/squid/squid.conf |
可以看到咱们的虚拟机WIN10仍然可以上外网,这是由于acl client src 192.168.23.53放行了它的ip所致:
为了对比效果,我又装了一台虚拟机WIN10Test用来测试,给它与之前那台虚拟机WIN10同等的待遇,给它的ie浏览器也配置了一样的代理,现在看看它能否上外网:
看看它的ip:
将他的ip也加入放行队列:
1 | [root@localhost ~]# vim /etc/squid/squid.conf |
可以看到,这台新加的虚拟机也可以访问外网了
现在开了三台虚拟机,电脑非常卡,可以把这台新的虚拟机关掉了,接下来我们继续回到正题,继续做代理实验。
特别注意:
本次实验特别坑的地方是,不把Server上的防火墙关掉,客户端就无法访问外网!而且,如果实验中途把Server关机了,重新启动后又得再次关闭防火墙!网上大多数的教程都没有说这一步,导致非常多初次做实验的同学们都被坑死在这里。
过滤敏感字
修改配置文件(还原上次实验的更改后再做,还原的相关命令也在下面)
1 | [root@localhost ~]# vi /etc/squid/squid.conf |
效果如下:
如下图,可以正常访问外网,但是无法访问带有敏感字的网站。
禁止访问特定网站
修改配置文件(可以接着上述实验的更改继续再做,相当于叠加过滤)
注意,我们平时访问qq官网,是https的网址:https://www.qq.com,但是由于咱们的Server现在针对的是http协议进行过滤的,就连配置文件里也全都是“http_access”的字段,所以我们测试用的是http://www.qq.com。
1 | [root@localhost ~]# vi /etc/squid/squid.conf |
效果如下:
可以正常访问外网,但是无法访问http://www.qq.com
效果对比:
1 | [root@localhost ~]# vi /etc/squid/squid.conf |
现在回到刚刚的测试页面,刷新一下,可以看到它自动的从http://www.qq.com跳转到了https://www.qq.com,成功访问了qq官网。
禁止下载特定格式文件
修改配置文件((可以接着上述实验的更改继续再做,相当于叠加过滤)
1 | [root@localhost ~]# vi /etc/squid/squid.conf |
如下图,我们这里用下载nodejs软件历史版本的网站https://nodejs.org/dist/v0.6.2/来测试,分别点开三个文件对比测试:
node-v0.6.2.msi
node.exe
node-v0.6.2.tar.gz
理论上,我们禁止下载了msi和exe后缀格式的文件,那么tar.gz是没有禁止的,实际测试效果如下:
可以看到,实际测试效果和理论上是一样的。
透明正向代理
正向代理服务一般是针对企业内部的所有员工设置的,鉴于每位员工所掌握的计算机知识不尽相同,如果您所在的公司不是IT行业的公司,想教会大家如何使用代理服务也不是一件容易的事情。再者,无论是什么行业的公司,公司领导都希望能采取某些措施限制员工在公司内的上网行为,这时就需要用到透明的正向代理模式了。
“透明”二字指的是让用户在没有感知的情况下使用代理服务,这样的好处是一方面不需要用户手动配置代理服务器的信息,进而降低了代理服务的使用门槛;另一方面也可以更隐秘地监督员工的上网行为。
在透明代理模式中,用户无须在浏览器或其他软件中配置代理服务器地址、端口号等信息,而是由DHCP服务器将网络配置信息分配给客户端主机。这样只要用户打开浏览器便会自动使用代理服务了。
准备工作:
删除之前实验配置的客户端浏览器代理配置,如下图:
现在又无法访问外网了,如下图:
接下来我们要用透明正向代理让它恢复访问网络的能力。
使用firewalld配置透明正向代理
这里有很多坑,网上的大多教程不是缺东就是少西,另外在配置的时候要用的明明是ens37和ens33而网上的教程却都是误人子弟的eth0和eth1,为了试验更加清晰明了,这里也不特意还原之前实验的状态了,我们从头开始,把接下来的实验单独拿出来作为另外一个实验!
恢复快照
之前我们保存了快照叫做“快照1”的那个,现在咱们把Server恢复快照到那个地方,则相当于准备工作已经安排妥当,接下来实验从头开始,只不过这次咱们做的是透明代理。
安装squid程序
1 | [root@localhost ~]# yum install squid -y |
禁用selinux
1 | [root@localhost ~]setenforce 0 #临时关闭selinux |
开启ip forward(路由转发)
1 | [root@localhost ~]# echo "net.ipv4.ip_forward = 1" >>/usr/lib/sysctl.d/50-default.conf |
配置squid配置文件,放行所有http访问,transparent是透明的意思
1 | [root@localhost ~]# vim /etc/squid/squid.conf |
使用firewalld配置SNAT,然后添加squid服务
1 | //外网网卡添加到外网zone |
这里注意,如下,有时候手误会少敲一个d,结果命令就可能没敲进去。
1 | [root@localhost ~]# systemctl restart firewall |
检查客户端可以正常上网
使用iptables配置透明正向代理
注意:iptables和firewalld是冲突的,同时只能使用一个防火墙,所以要还原上次实验的更改后再做
放行DNS查询端口,配置IPv4地址转发
使用iptables防火墙管理命令把所有客户端主机对网站80端口的请求转发至Squid服务器本地的3128端口上
1 | [root@localhost ~]# systemctl stop firewalld.service |
注意:不要写错网卡和ip,上述ens37为外网网卡,192.168.1.105为外网ip,192.168.23.0/24是内网ip。
现在检查:
反向代理
网站页面是由静态资源和动态资源一起组成的,其中静态资源包括网站架构CSS文件、大量的图片、视频等数据,这些数据相对于动态资源来说更加稳定,一般不会经常发生改变。但是,随着建站技术的更新换代,外加人们不断提升的审美能力,这些静态资源占据的网站空间越来越多。如果能够把这些静态资源从网站页面中抽离出去,然后在全国各地部署静态资源的缓存节点,这样不仅可以提升用户访问网站的速度,而且网站源服务器也会因为这些缓存节点的存在而降低负载。
反向代理是Squid服务程序的一种重要模式,其原理是把一部分原本向网站源服务器发起的用户请求交给Squid服务器缓存节点来处理。但是这种技术的弊端也很明显,如果有心怀不轨之徒将自己的域名和服务器反向代理到某个知名的网站上面,从理论上来讲,当用户访问到这个域名时,也会看到与那个知名网站一样的内容(有些诈骗网站就是这样骗取用户信任的)。因此,当前许多网站都默认禁止了反向代理功能。开启了CDN(内容分发网络)服务的网站也可以避免这种窃取行为。
修改配置文件
注意,我的虚拟机Server重启后,作为桥接模式的外网网卡ip有所变化是很正常的,因为它的ip本就是由我家的家用路由器分配的,现在它变成了192.168.1.107,我们就用这个ip来配置。
58.250.26.38是一个网站的ip,这个随意,拿来测试的而已,找个能用的就行。
1 | [root@localhost ~]# ip add |
客户端访问
我们输入Server外网网卡的ip:192.168.1.107,如下图,可以看到它自动跳转到了目标网站。
实验到此结束
课外拓展
仅主机模式下,linux无法ping通windows的解决办法
我们重新弄两台虚拟机,实验准备和上面那个实验一样。Server网卡一为仅主机模式,网卡二为桥接模式。虚拟机WIN10的网卡为仅主机模式。
1.虚拟机Server
2.虚拟机WIN10
3.VMware Workstation Pro设置
点击图中更改设置即可更改,这里放出的图是改好后的图。
拓扑图就是和原来一样的拓扑图。
开机,查看各个设备的ip:
1.Server
ens33:192.168.23.52
ens37:192.168.1.107
2.虚拟机WIN10
ens33:192.168.23.53
3.物理机WIN10(就是宿主机,我们现在用着的真实电脑)
VMnet1:192.168.23.1
VMnet8:192.168.141.1
物理网卡:192.169.1.108
桥接模式与物理网卡相互桥接,故网段均为192.168.1.0/24
仅主机模式对应VMnet1,故网段均为192.168.23.0/24
我们这里没用到VMnet8,也没有NAT模式的虚拟机网卡,就先不管它了。
现象:
按照原理上讲,同一网段的ip是可以互相ping同的。然而在这里,我们可以发现,windows可以ping通linux,但是linux却是无法ping通windows的,如下图:
1.物理机windows去ping虚拟机Server可以ping通
2.虚拟机Server却无法ping通物理机windows(ping无响应,只能手动ctrl+c打断)
3.虚拟机WIN10可以ping通Server:
4.Server却不能ping通虚拟机WIN10:
解决办法:
先在虚拟机WIN10上做如下设置:
然后Server就可以ping通虚拟机WIN10了:
现在在物理机windows上做如下设置:
现在虚拟机Server也可以ping通物理机windows了:
实验完毕
实验做完了记得要把自己物理机的启用网络发现关闭掉。