squid代理负载与缓存服务

Squid 是一款高性能的开源代理服务器和缓存服务器软件,广泛应用于各种网络环境中,用于提高网络访问速度、节省带宽、增强安全性以及实现多种网络管理功能,主要功能如下:

1、代理

  • 正向代理:常用于企业内部网络,允许员工访问外部互联网,同时可以对访问进行监控和控制
  • 反向代理:常用于负载均衡、缓存静态内容、提高网站性能和安全性

2、缓存

  • web缓存:缓存频繁访问的网页内容,当后续请求相同资源时,可以直接从缓存中获取,从而提高访问速度并减少带宽消耗
  • 对象缓存:缓存各种类型的对象,如图片、CSS 文件、JavaScript 文件等,进一步优化网络性能

3、访问控制

  • 访问控制列表(ACL):允许管理员定义哪些客户端可以访问代理服务器,以及可以访问哪些目标地址。通过 ACL,可以实现基于 IP 地址、域名、用户认证等多种访问控制策略
  • 用户认证:支持多种用户认证机制,如基本认证(Basic Auth)、NTLM、Kerberos 等,可以对访问代理服务器的用户进行身份验证

4、安全功能

  • SSL/TLS加密:支持 SSL/TLS 加密,可以对代理服务器与客户端之间的通信进行加密,确保数据传输的安全性
  • 透明代理:在透明代理模式下,Squid 可以将客户端的真实 IP 地址传递给目标服务器,从而实现更灵活的访问控制和日志记录

环境准备:

squid版本linux服务端IPsquid运行方式linux客户端IP
6.10192.168.49.83(要能上网)docker192.168.51.56(不能上网)

本例子使用docker方式部署,如果要本地部署需要去官网下载安装包,docker 启动命令如下:

#docker pull registry.cn-hangzhou.aliyuncs.com/workimage/squid:6.10下载镜像
1、先启动一个镜像,把squid.conf复制出来到/data/squid目录 docker cp squid:/etc/squid/squid.conf .
2、在/data/squid/logs路径下创建access.log和cache.log并给777权限
3、编辑squid.conf,在上方添加visible_hostname squid-host,squid_host为自定义主机名
4、docker run -itd --name squid_new  \
-v /data/squid/squid.conf:/etc/squid/squid.conf \
-v /data/squid/logs/access.log:/var/log/squid/access.log \
-v /data/squid/logs/cache.log:/var/log/squid/cache.log \
--net=host \
--restart=always squid:6.10

1、配置指定的IP地址才可以访问此代理(正向代理)

下图中的acl localnet src ip地址都是允许的访问IP地址,可根据需要增减,如下:

注:localnet这个名字可以自定义的,写完acl后还需要在后面添加http_access allow localnet表示允许localnet使用代理,http_access deny all要写在后面,否则localnet不生效,如图:

在客户端192.168.51.56上配置代理地址如下:

export http_proxy=http://192.168.49.83:3128
export https_proxy=http://192.168.49.83:3128
  • http_proxy:代理http请求
  • https_proxy:代理https请求

客户端此时就可以执行命令安装需要的包了,如图:

注:squid是按照顺序从上往下匹配规则的,因此要注意顺序,顺序不对不会生效

也可以使用外部文件来来读取IP,适合大量网段,支持动态更新,不用重启squid,定义ip.txt,如图:

192.168.0.0/16
172.10.5.0/24
176.5.1.0/24

在配置文件中引用ip.txt,如下:

2、多个IP段ACL规则不能写在同一个http_access里,比如我定义了两个IP段,如图:

如果将localnet和gong都定义在http_access是错误的,如图:

因为在http_access规则中,多个ACL名称默认是逻辑与的关系,而不是逻辑或,因此如果同时定义了localnet gong,那么就要求你的客户的IP同时要是192.168网段和178.10网段的才行,必须同时满足,否则这条规则就不生效了,因此可以针对gong这个名称单独指定http_access规则,如图:

也可以将多个网段写在一个ACL规则下,然后配置一个http_access就行了,如图:

3、配置只能在指定的时间段内使用squid代理,如图:

在http_access规则后添加work_hour,如图:

4、禁止访问指定的域名,如图:

  • dstdomain用于匹配域名
  • http_access后面要用deny

限制后访问将显示403,如图:

5、允许访问指定域名,allow_domains可以自定义,最重要的是http_access后面改为allow,如图:

注:域名也可以通过外部文件的形式来定义规则,比如,定义domain.txt,如下:

.baidu.com
.taobao.com
.abcd.com

在squid.conf中引用此文件即可,如下:

acl allow_domains dstdomain "/etc/squid/domain.txt"

6、禁止下载指定后缀的文件名,如图:

在客户端服务器上,执行下载txt和pdf文件会提示403,如图:

7、反向代理

squid反向代理一般用户中小规模的应用,如果业务量大可使用nginx/haproxy

squid用于反向代理的时候,相当于一个web服务器,此时可以不用3128端口了(也不需要配置代理地址了),如图:

  • accel:启用反向代理
  • vhost:表示启用基于主机名(域名)的虚拟机支持,也就是客户端通过域名来请求后端服务
  • domainame:定一个acl规则名,允许域名gong.com请求
  • cache_peer:一个指令,指定后端服务器
  • parent:固定写法,表示会从49.83这个后端服务器获取内容
  • 88:后端服务器的端口
  • 0:不使用ICP
  • no-query:禁用发送ICP请求,节省开销,反向代理中必须保留此参数
  • originserver:标记后端为源服务器
  • name:自定义的名字,如果只有一个后端服务器,这个name可以省略了

上述配置可以理解为:域名请求到达squid后,实际请求到49.83:88端口的服务上去,如果有多个域名就要配置多个规则,请求的域名需要能解析到squid所在的服务器IP才行

8、负载均衡

squid本身并不直接提供像nginx那样的负载均衡,只是通过反向代理+多后端来轮询的,这里不说了

配置文件参考如下:

visible_hostname squid-host
acl localnet src 0.0.0.1-0.255.255.255	# RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8		# RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10		# RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 	# RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12		# RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16 178.10.0.0/16		# RFC 1918 local private network (LAN)
acl localnet src fc00::/7       	# RFC 4193 local private network range
acl localnet src fe80::/10      	# RFC 4291 link-local (directly plugged) machines
acl work_hour time MTWHF 09:00-20:05
acl deny_files urlpath_regex -i \.txt$ \.pdf$ \.exe$
acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
http_access deny deny_files
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet 
http_access allow work_hour 
http_access deny to_localhost
http_access deny to_linklocal
#include /etc/squid/conf.d/*.conf
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern \/(Packages|Sources)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern \/Release(|\.gpg)$ 0 0% 0 refresh-ims
refresh_pattern \/InRelease$ 0 0% 0 refresh-ims
refresh_pattern \/(Translation-.*)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern .		0	20%	4320

标签