作为应用层的代理服务软件,Squid 主要提供缓存加速和应用层过滤控制的功能
当客户机通过代理来请求 Web 页面时
指定的代理服务器会先检查自己的缓存,如果缓存中已经有客户机需要访问的页面,则直接将缓存中的页面内容反馈给客户机
如果缓存中没有客户机需要访问的页面,则由代理服务器向 Internet 发送访问请求
当获得返回的 Web 页面以后,将网页数据保存到缓存中并发送给客户机
HTTP 代理的缓存加速对象主要是文字、图像等静态 Web 元素。
使用缓存机制后,当客户机在不同的时候访问同一 Web 元素,或者不同的客户机访问相同的 Web 元素时,可以直接从代理服务器的缓存中获得结果。这样就大大减少了向 Intermet 重复提交 Web 请求的过程,提高了客户机的 Web 访问响应速度。
由于客户机的 Web 访问请求实际上是由代理服务器来代替完成的,从而可以隐藏用户的真实 IP 地址,起到一定的保护作用。另一方面,代理服务器担任着类似“经纪人的角色,所以有机会针对要访问的目标、客户机的地址、访问的时间段等进行过滤控制。
根据实现的方式不同,代理服务可分为传统代理和透明代理两种常见的代理服务。
传统代理:也就是普通的代理服务,首先必须在客户机的浏览器、OO聊天工具、下载软件等程序中手动设置代理服务器的地址和端口,然后才能使用代理服务来访问网络。对于网页浏览器,访问网站时的域名解析请求也会发送给指定的代理服务器。
透明代理:提供与传统代理相同的功能和服务,其区别在于客户机不需要指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将 Web 访问重定向,实际上仍然交给代理服务器来处理。重定向的过程对客户机来说是“透明”的,用户甚至并不知道自己在使用代理服务,所以称为“透明代理”。使用透明代理时,网页浏览器访问网站时的域名解析请求将优先发给 DNS 服务器。
# 源码包
squid-3.4.6.tar.gz
安装目录为’/usr/local/squid’
[root@localhost ~]# tar xf squid-3.4.6.tar.gz
[root@localhost ~]# cd squid-3.4.6/
[root@localhost squid-3.4.6]# ./configure --prefix=/usr/local/squid --sysconfdir=/etc --enable-arp-acl --enable-linux-netfilter --enable-async-io=100 --enable-err-language="Simplify_Chinese" --enable-underscore --enable-poll --enable-gnuregex
[root@localhost squid-3.4.6]# make && make install
./configure 选项含义:
--prefix=/usr/local/squid // 安装目录
--sysconfdir=/etc // 单独将配置文件修改到其他目录
--enable-arp-acl // 使用内核过滤
--enable-linux-netfilter // 支持透明模式
--enable-async-io=100 // 异步I/O,提升存储性能
--enable-err-language="Simplify_Chinese" // 错误信息的显示语言
--enable-underscore // 运行URL中有下划线
--enable-poll // 使用Poll()模式,提升性能
--enable-gnuregex // 使用GNU正则表达式
路径优化,并创建用户组
[root@localhost ~]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
[root@localhost ~]# useradd -M -s /sbin/nologin squid
[root@localhost ~]# chown -R squid:squid /usr/local/squid/
配置文件的路径位于/etc/squid.conf
详细的配置项参考/etc/squid.conf.decunmented
[root@localhost ~]# cp /etc/squid.conf /etc/squid.conf.bak
[root@localhost ~]# vim /etc/squid.conf
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
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
acl CONNECT method CONNECT
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 localhost
http_access deny all
http_port 3128 // 用来指定代理服务器监听的地址和端口
cache_effective_user squid // 指定 squid 的程序用户,用来设置初始化、运行时缓存的账号
cache_effective_group squid // 指定用户组
coredump_dir /usr/local/squid/var/cache/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
检测配置文件的语法是否正确
[root@localhost ~]# squid -k parse
第一次启动 Squid 服务时,会自动初始化缓存目录; -z 选项用来初始化缓存目录
[root@localhost ~]# squid -z
[root@localhost ~]# 2023/06/29 19:24:19 kid1| Set Current Directory to /usr/local/squid/var/cache/squid
2023/06/29 19:24:19 kid1| Creating missing swap directories
2023/06/29 19:24:19 kid1| No cache_dir stores are configured.
启动 Squid 服务
[root@localhost ~]# squid
确定 Squid 服务处于监听状态
[root@localhost ~]# netstat -anpt | grep squid
tcp6 0 0 :::3128 :::* LISTEN 61087/(squid-1)
使用传统代理的特点在于,客户机的相关程序,比如 IE 浏览器等,必须手动指定代理服务器的地址、端口等信息。
构建 Squid 为客户机访向各种网站提供代理服务,但禁止通过代理下载超过 10MB 大小的文件
在客户机上,指定 Squid 作为 Web 访问代理,以隐藏自己的真实 IP 地址
修改配置文件,添加reply_body_max_size
配置项
[root@localhost ~]# vim /etc/squid.conf
····
reply_body_max_size 10 MB // 允许下载的最大文件大小
http_access deny all // reply_body_max_size放在该配置项之前;定义拒绝规则
····
Squid 服务的默认端口 3128,要么关闭防火墙,要么开放该端口
firewall-cmd --zone=public --add-port=3128/tcp
重载 Squid 服务
[root@localhost ~]# squid -k reconfigure
IP 地址指向代理服务器,端口使用 Squid 服务端口3128,正常访问即代理成功
在 Squid 代理服务器中,跟踪 Squid 服务的访问日志文件,应该可以发现客户机192.168.153.144访问网站服务器192.168.153.143的记录
查看 web 访问日志的新增记录,通过跟踪 httpd 服务的访问日志文件,能够发现来自代理服务器192.168.153.145的访问记录。
这说明,当客户机使用代理后,web 服务器并不知道客户机的真实 IP 地址,实际上是由代理服务器在替它访问。
透明代理提供的服务与传统代理是一致的,但是其“透明”的实现依赖于默认路由和防火墙的重定向策略,因此更适合于为局域网主机服务,而不适合为 Internet 中的客户机提供服务。
透明代理的关键在于网关服务器,而对于客户机仅需要正确地设置网络地址、默认网关,并不需要指定代理服务器。
对于2.6以上版本的 Squid 服务,只要在http_port
配置行添加transparent
选项就可以支持透明代理。
[root@localhost ~]# vim /etc/squid.conf
http_port 3128 transparent
[root@localhost ~]# squid -k reconfigure
透明代理中的 Squid 服务实际上是构建在 Linux 网关主机上,因此只需要设置防火墙策略,就可以将局域网主机访问 Internet 的数据包转交给 Squid 进行处理。
[root@localhost ~]# firewall-cmd --zone=public --add-port=3128/tcp
[root@localhost ~]# firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -i ens33 -p tcp --dport 80 -j REDIRECT --to-ports 3128
[root@localhost ~]# firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -i ens33 -p tcp --dport 443 -j REDIRECT --to-ports 3128
[root@localhost ~]# firewall-cmd --runtime-to-permanent
如果手动设置了指定的代理服务器,应在客户机中去除
在客户机中通过浏览器访问目标网站192.168.27.168,然后观察 Squid 代理服务器、Web服务器的访问日志,验证透明代理是否发挥作用。
在 Squid 代理服务器中,能够发现客户机192.168.153.144访问网站服务器192.168.27.168的记录;
在被访问的 Web 服务器中,能够发现来自代理服务器192.168.27.145的访问记录;
Squid 提供了强大的代理控制机制,通过合理设置 ACL (Access Control List ,访问控制列表)并进行限制,可以针对源地址、目标地址、访问的 URL 路径,访问的时间等各种条件进行过滤。
在配置文件squid.conf
中, ACL 访问控制可以通过两个步骤实现:
①定义访问控制列表
每一行 acl 配置可以定义一条访问控制列表,基本格式:
acl 列表名称 列表类型 列表内容 ···
其中,“列表名称”由管理员自行指定,用来识别控制条件;
“列表类型”必须使用Squid预定义的值,对应不同类型的控制条件;
“列表内容”是要控制的具体对象,不同类型的列表所对应的内容也不一样,可以有多个值(以空格分隔,都为或的关系);
常用的访问控制列表类型:
列表类型 | 用途/含义 | 示例 |
---|---|---|
src | 源 IP 地址、网段、IP 地址范围 | 192.168.1.1/32 192.168.1.0/241 192.168.1.0-192.168.3.0/24 |
dst | 目标 IP 地址、网段、主机名 | www.xxx.com 216.163.137.3/32 |
port | 目标端口 | 20、21、8080 |
dstdomain | 目标域、匹配域内的所有站点 | .qq.com |
time | 使用电力服务的时间段,字母标识一星期中各天的英文缩写; M-monday、T-tuesday、W-wednesday、H-thursday、F-friday、A-saturday、S-sunday | MTWHF 8:30-17:30 12:30-13:30 AS |
maxconn | 每个客户机的并发连接数 | 20 |
url_regex | 目标资源的 URL 地址,-i 表示忽略大小写 | url_regex -i ^rtsp:// ^mms:// url_regex -i ^emule:// |
urlpath_regex | 目标资源的整个 RUL 路径,-i 表示忽略大小写 | urlpath_regex -i sex adult nude urlpath_regex -i .mp3$ .rar$ |
在定义访问控制列表时,应结合当前网络环境正确分析用户的访问需卖义他在定理服务的控制条件。例如,针对不同的客户机地址、需要限制访问的目标。特定的时间段等,分别定义列表。
[root@localhost -]# vi /ete/squid.conf
····
acl localhost src 127.0.0.1/255.255.255.255 //源地址为 127.0.0.1
ac1 MYLAN src 192.168.1.0/24 192.168.4.0/24 //客户机网段
acl to localhost dst 127.0.0.0/8 // 目标地址为127.0.0.0/8 网段
acl MC20 maxconn 20 // 最大并发连接 20
acl BlackURL url_regex -i ^rtsp:// /emule:// // 以rtsp://等开头的URL
acl MEDIAFILE urlpath_regex -i \.mp3$ \.mp4$ \.rmvb$ // 以.mp3、.mp4、.rvb 结尾的 URL路名
acl WORKTIME time MTWHF 08:30-17:30 // 时间为周一至周五 8:30~17:30
当需要限制的同一类对象较多时,可以使用独立的文件来存放,在 acl 配置行的列表内容处指定对应的文件位置即可。例如,若要针对目标地址建立黑名单文件,可以参考以下操作。
[root@localhost -]# mkdir /etc/squid
[root@localhost -]# cd /etc/squid
[root@localhost squid]# vi ipblock.list // 建立目标IP 地址名单
61.135.167.36
125.39.127.25
60.28.14.0/24
[root@localhost squid]# vi dmblock.list // 建立目标域地址名单
.qq.com
.msn.com
.live.com
[root@localhost squid]# vi /ete/squid.conf
acl IPBLOCK dst "/etc/squid/ipblock.list"
acl DMBLOCk dstdomain "/ete/squid/dmblock.list" // 调用指定文件中的列表内容
设置访问权限
定义好各种访问控制列表以后,需要使用 httpd_access 配置项来进行控制。需要注意的是,http_access 配置行必须放在对应的 acl 配置行之后。每一行 http_access配置确定一条访问控制规则,格式如下:
http_access allow 或 deny 列表名······
在每一条http_access 规则中,可以同时包含多个访问控制列表名,各个列表之间以空格分隔,为“与”的关系,表示必须满足所有访问控制列表对应的条件才会进行限制。需要使用取反条件时,可以在访问控制列表前添加“!”符号。
[root@localhost -]# vi /etc/squid.conf
····
http_access deny MYLAN MEDIAFILE // 禁止客户机下载MP3、MP4等文件
http_access deny MYLAN IPBLOCK // 禁止客户机访问黑名单中的 IP 地址
http_access deny MYLAN DMBLOCK // 禁止客户机访问黑名单中的网站域
http_access deny MYLAN MC20 // 客户机的并发连接超过 20 时将被阻止
http_access allow MYLAN WORKTIME // 允许客户机在工作时间上网
http_access deny all //默认禁止所有客户机使用代理
执行访问控制时,Squid 将按照各条规则的顺序依次进行检查,如果找到一条相匹配的规则就不再向后搜索(这点与 iptables 的规则匹配类似)。因此,规则的顺序安排是非常重要的,以下两种默认情况需要我们注意。
通常情况下,把最常用到的控制规则放在最前面,以减少 Squid 的负载。在访问控制的总体策略上,建议采用“先拒绝后允许”或“先允许后拒绝”的方式,最后一条规则设为默认策略,可以为 http_access allow all
或者 http_access deny all
。
`
执行访问控制时,Squid 将按照各条规则的顺序依次进行检查,如果找到一条相匹配的规则就不再向后搜索(这点与 iptables 的规则匹配类似)。因此,规则的顺序安排是非常重要的,以下两种默认情况需要我们注意。
通常情况下,把最常用到的控制规则放在最前面,以减少 Squid 的负载。在访问控制的总体策略上,建议采用“先拒绝后允许”或“先允许后拒绝”的方式,最后一条规则设为默认策略,可以为 http_access allow all
或者 http_access deny all
。