《Linux就该这么学》培训笔记_ch16_使用Squid部署代理缓存服务
《Linux就该这么学》培训笔记_ch16_使用Squid部署代理缓存服务
文章最后会post上书本的笔记照片。
代理缓存服务
Squid是Linux系统中最为流行的一款高性能代理服务软件,通常用作Web网站的前置缓存服务,能够代替用户向网站服务器请求页面数据并进行缓存。Squid服务程序会按照收到的用户请求向网站源服务器请求页面、图片等所需的数据,并将服务器返回的数据存储在运行Squid服务程序的服务器上。当有用户再请求相同的数据时,则可以直接将存储服务器本地的数据交付给用户,这样不仅减少了用户的等待时间,还缓解了网站服务器的负载压力。
在使用Squid服务程序为用户提供缓存代理服务时,具有正向代理模式和反向代理模式之分。
正向代理模式:让用户通过Squid服务程序获取网站页面等资源,以及基于访问控制列表(ACL)功能对用户访问网站行为进行限制,在具体的服务方式上又分为标准代理模式与透明代理模式:
- 标准正向代理模式:把网站数据缓存到服务器本地,提高数据资源被再次访问时的效率,但是用户在上网时必须在浏览器等软件中填写代理服务器的IP地址与端口号信息,否则默认不使用代理服务。
- 透明正向代理模式:作用与标准正向代理模式基本相同,区别是用户不需要手动指定代理服务器的IP地址与端口号,透明正向代理对于用户来讲是相对透明的。
使用Squid服务程序提供正向代理服务的拓扑图:
局域网内的主机如果想要访问外网,则必须要通过Squid服务器提供的代理才行,当Squid服务器接收到用户的指令后会向外部发出请求,然后将接收到的数据交还给发出指令的那个用户,从而实现了用户的代理上网需求。
企业中的主机要想上网,就必须要经过公司的网关服务器,既然这是一条流量的必经之路,因此企业一般还会把Squid服务程序部署到公司服务器位置,并通过ACL(访问控制列表)功能对企业内员工进行上网审计及限制。
反向代理模式:让多台节点主机反向缓存网站数据,从而加快用户访问速度。
一般来讲,网站中会普遍加载大量的文字、图片等静态资源,而且它们相对来说都是比较稳定的数据信息,当用户发起网站页面中这些静态资源的访问请求时,可以使用Squid服务程序提供的反向代理模式来进行响应。如果反向代理服务器中恰巧已经有了用户要访问的静态资源,则直接将缓存的这些静态资源发送给用户,不仅可以加快用户的网站访问速度,还在一定程度上降低了网站服务器的负载压力。
使用Squid服务程序提供反向代理服务的拓扑图:
当外网用户尝试访问某个网站时,实际请求是被Squid服务器所处理的。反向代理服务器会将缓存好的静态资源更快地交付给外网用户,从而加快了网站页面被用户访问的速度。由于网站页面数据中的静态资源请求已被Squid服务器处理,因此网站服务器负责动态数据查询就可以了,也进而降低了服务器机房中网站服务器的负载压力。
关于正向代理和反向代理的总结:
- 正向代理模式一般用于企业局域网之中,让企业用户统一地通过Squid服务访问互联网资源,可以在一定程度上减少公网带宽的开销,还能对用户访问的网站内容进行监管限制;
- 反向代理模式一般是为大中型网站提供缓存服务的,它把网站中的静态资源保存在国内多个节点机房中,当有用户发起静态资源的访问请求时,可以就近为用户分配节点并传输资源。
配置Squid服务程序
实验基本设置:
- Squid服务端:双网卡,内网(仅主机)IP地址192.168.10.10,外网(桥接)DHCP自动获取IP地址,能上外网;
- Squid客户端:一张网卡(仅主机)IP地址192.168.10.20,客户端是Windows还是Linux都行;
- 实验目的:在服务端部署squid程序,让原本只能访问内网的客户端通过Squid服务器进行代理上网。
服务端安装Squid服务程序:yum install -y squid。
Squid服务程序的配置文件:/etc/squid/squid.conf。
常用的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服务程序后,默认就可以提供标准正向代理服务。立即重启squid服务并加入开机启动项即可(如果客户端是Linux系统,服务端还需要清空iptables防火墙)。
systemctl restart squid #重启squid服务
systemctl enable squid #把squid服务加入开机启动项
iptables -F #清空iptables防火墙
service iptables save #保存iptables当前策略状态
客户端(Linux)要做的:打开浏览器(Firefox)。
Edit -> Preferences,Advanced -> Network -> Settings...,勾选“Manual proxy configuration:”,填写相关参数值HTTP Proxy:192.168.10.10 Port:3128。勾选“Use this proxy server for all protocols”。
Squid服务程序默认使用3128、3401与4827等端口号,可以把默认使用的端口号修改为其他值,以便起到一定的保护作用。注意需要把要更改的新端口加入到squid服务在SELinux域的允许列表中让SELinux放行。
vim /etc/squid/squid.conf #编辑squid主配置文件 ... 59 http_port 10000 #修改默认端口号为10000 ... systemctl restart squid #重启squid服务 systemctl enable squid #把squid服务加入开机启动项 semanage port -l | grep squid_port_t #过滤出与squid服务相关的端口允许列表 semanage port -a -t squid_port_t -p tcp 10000 #把新的端口号添加到Squid服务在SELinux域的允许列表中 semanage port -l | grep squid_port_t #查看与squid服务相关的端口允许列表中是否已添加新端口
透明正向代理
透明正向代理只能设置在网关上。
透明正向代理模式让用户在没有感知的情况下使用代理服务,一方面不需要用户手动配置代理服务器的信息,进而降低了代理服务的使用门槛;另一方面也可以更隐秘地监督员工的上网行为。
如果服务器同时部署了DHCP服务,则squid透明代理配合dhcp服务可以让用户无须在浏览器或其他软件中配置代理服务器地址、端口号等信息,只要打开浏览器就能自动使用代理服务。
在实现透明正向代理前,客户机需要把浏览器的代理信息删除,回归到无法通过代理上网的状态。客户机网卡设置:IP地址:192.168.10.20,子网掩码:24,默认网关:192.168.10.10(squid服务端),DNS:8.8.8.8。
要实现透明正向代理,需要SNAT技术完成数据转发,让让客户端主机将数据交给Squid代理服务器,再由后者转发到外网中。
实现透明正向代理有两种方法:
- (简单)执行firewall-config弹出firewall设置窗口,把Runtime和Permanent下的Masquerading下的“Masquerade zone”勾选上。配置好客户机即刻通过浏览器上网;
- (困难)采用纯命令行的iptables防火墙管理工具来部署。
采用纯命令行的iptables防火墙管理工具来配置squid透明正向代理方法详解:
- 要想让内网中的客户端主机能够访问外网,客户端主机首先要能获取到DNS地址解析服务的数据,才能在互联网中找到对应网站的IP地址。完成这一步配置后,客户机ping某外网网址,虽然ping不通,但应该能解获取DNS域名解析数据了(这一步的验证结果很重要);
- 编辑squid服务的主配置文件,开启透明正向代理模式。
- 完成SNAT数据转发功能。使用iptables防火墙管理命令把所有客户端主机对网站80端口的请求转发至Squid服务器本地的3128端口上。
iptables -F #1.清空iptables防火墙 iptables -t nat -A POSTROUTING -p udp --dport 53 -o eno33554968 -j MASQUERADE #通过iptables命令实现DNS地址解析服务53端口的数据转发功能,enoXXXXXXXX是桥接网卡的名称 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf #编辑/etc/sysctl.conf文件,允许Squid服务器转发IPv4数据包 sysctl -p #让/etc/sysctl.conf文件中的转发参数立即生效 vim /etc/squid/squid.conf #2.编辑squid服务的主配置文件,开启透明正向代理模式 ... 59 http_port 3128 transparent #在主配置文件中服务器端口号后面追加上transparent(透明的),即开启透明正向代理模式。 ... 62 cache_dir ufs /var/spool/squid 100 16 256 #设置缓存的保存路径(加快网站的二次响应) ... systemctl stop squid #先关闭squid服务(对Squid服务程序的透明代理技术进行初始化需要) squid -k parse #检查主配置文件是否有错误 squid -z #(生成16个缓存目录)对Squid服务程序的透明代理技术进行初始化 systemctl restart squid #重启squid服务 iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128 #3.把所有客户端主机对网站80端口的请求转发至Squid服务器本地的3128端口上 iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eno33554968 -j SNAT --to 192.168.1.102 #地址伪装,10段的地址统统伪装成192.168.1.102,这是桥接网卡地址(如果不做这一步,则当网站回送响应时会找不到客户机的私网地址而导致丢包) service iptables save #保存当前iptables防火墙策略状态
ACL访问控制
squid3.3.8服务无法限制https的网站。
当将Squid服务程序部署为网络的网关服务器后,Squid服务程序的访问控制列表(ACL)功能将可以根据指定的策略条件来缓存数据或限制用户的访问。
Squid服务程序的ACL是由多个策略规则组成的,它可以根据指定的策略规则来允许或限制访问请求,而且策略规则的匹配顺序与防火墙策略规则一样都是由上至下;在一旦形成匹配之后,则立即执行相应操作并结束匹配过程。为了避免ACL将所有流量全部禁止或全部放行,起不到预期的访问控制效果,运维人员通常会在ACL的最下面写上deny all或者allow all语句,以避免安全隐患。
对于ACL变量,是不能批量定义和引用的(比如想禁止多个网址,则只能逐个网址定义,然后逐个引用拒绝操作)。
实现squid服务的ACL访问控制依然是编辑其主配置文件/etc/squid/squid.conf。
ex1:只允许IP地址为192.168.10.20的客户端使用服务器上的Squid服务程序提供的代理服务,禁止其余所有的主机代理请求。
vim /etc/squid/squid.conf
...
26 acl client src 192.168.10.20 #定义了一个名为client的别名,client = 192.168.10.20
...
31 http_access allow client #允许client,即192.168.10.20使用代理服务
32 http_access deny all #禁止所有主机请求
33 http_access deny !Safe_ports #禁止不在Safe_ports列表中的端口号的请求
...
systemctl restart squid #重启squid服务
把客户机IP地址改成192.168.10.20以外的值,发现无法上网。
ex2:禁止所有客户端访问网址中包含sincerity关键词的网站。
vim /etc/squid/squid.conf ... 26 acl deny_keyword url_regex -i sincerity #url_regex -i代表匹配网址中关键字,没有-i参数则指的是匹配整个网址 ... 31 http_access deny deny_keyword ... systemctl restart squid #重启squid服务
例如www.sincerity.com网址中包含sincerity关键字的网站无法访问,仅限于非https网站(squid3.3.8无法限制https的网站)。
ex3:禁止所有客户端访问某个特定的网站。
vim /etc/squid/squid.conf ... 26 acl deny_url url_regex www.bklgold.com #禁止访问www.bklgold.com ... 31 http_access deny deny_url ... systemctl restart squid
www.bklgold.com也是目前稀少的仍旧使用http的网站,经过上述设置,自然不能再访问了。
ex4:禁止下载带有某些后缀的文件。
vim /etc/squid/squid.conf ... 26 acl badfile urlpath_regex -i \.mp3$ \.rar$ #禁止下载后缀为mp3和rar的文件 ... 31 http_access deny badfile ... systemctl restart squid
设置后,不管网址的文件是否存在,例如http://www.linuxprobe.com/book.rar,只要匹配到了规定的后缀,均会被拒绝访问(https的依然无法限制)。其次,如果是使用迅雷等P2P下载软件来下载资源的话,就只能使用专业级的应用防火墙来禁止。
反向代理
反向代理是Squid服务程序的一种重要模式,其原理是把一部分原本向网站源服务器发起的用户请求(图片、视频等静态资源的请求)交给Squid服务器缓存节点来处理。一来提升用户访问网站的速度,二来减少网站源服务器的负载压力。
但是,如果有心怀不轨之徒将自己的域名和服务器反向代理到某个知名的网站上面,从理论上来讲,当用户访问到这个域名时,也会看到与那个知名网站一样的内容(部分钓鱼网站就是基于此原理)。因此,当前许多网站都默认禁止了反向代理功能。开启了CDN(内容分发网络)服务的网站也可以避免这种窃取行为。
找出无开启CDN的网站的方法:
ping网站域名,经过DNS解析后可得到IP地址,直接在浏览器上输入该ip地址访问该网站,如果能看到与输入域名访问时一样的内容,说明该网站大概率没有开启CDN,反之若输入IP访问不了,则该网站大概率无法进行反向代理。
已知一网站www.sincerity.com无开启CDN,其IP地址:139.159.253.44。可进行反向代理实验。
服务端:还原,重新安装squid。把端口号3128修改为网站源服务器的地址和端口号,此时正向解析服务会被暂停(正向代理服务不能与反向代理服务同时使用)。
yum install -y squid vim /etc/squid/squid.conf ... 59 http_port 192.168.1.105:80 vhost #192.168.1.105是服务端能上外网的网卡的IP地址 60 cache_peer 139.159.253.44 parent 80 0 originserver #139.159.253.44是网站源服务器IP地址 ... systemctl restart squid
在服务端访问自己ip地址,却会出现与网站www.sincerity.com一模一样的效果。
书本笔记