squid代理负载与缓存服务
Squid 是一款高性能的开源代理服务器和缓存服务器软件,广泛应用于各种网络环境中,用于提高网络访问速度、节省带宽、增强安全性以及实现多种网络管理功能,主要功能如下:
1、代理
- 正向代理:常用于企业内部网络,允许员工访问外部互联网,同时可以对访问进行监控和控制
- 反向代理:常用于负载均衡、缓存静态内容、提高网站性能和安全性
2、缓存
- web缓存:缓存频繁访问的网页内容,当后续请求相同资源时,可以直接从缓存中获取,从而提高访问速度并减少带宽消耗
- 对象缓存:缓存各种类型的对象,如图片、CSS 文件、JavaScript 文件等,进一步优化网络性能
3、访问控制
- 访问控制列表(ACL):允许管理员定义哪些客户端可以访问代理服务器,以及可以访问哪些目标地址。通过 ACL,可以实现基于 IP 地址、域名、用户认证等多种访问控制策略
- 用户认证:支持多种用户认证机制,如基本认证(Basic Auth)、NTLM、Kerberos 等,可以对访问代理服务器的用户进行身份验证
4、安全功能
- SSL/TLS加密:支持 SSL/TLS 加密,可以对代理服务器与客户端之间的通信进行加密,确保数据传输的安全性
- 透明代理:在透明代理模式下,Squid 可以将客户端的真实 IP 地址传递给目标服务器,从而实现更灵活的访问控制和日志记录
环境准备:
| squid版本 | linux服务端IP | squid运行方式 | linux客户端IP |
| 6.10 | 192.168.49.83(要能上网) | docker | 192.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


