Squid代理服务器应用
Squid代理服务器应用
一、Squid的脚本概念
1. Squid的作用
Squid主要提供缓存加速、应用层过滤控制的功能。
2. Web代理的工作机制
缓存网页对象,减少重复请求
- 代理客户机向网站请求数据,从而可以隐藏用户的真实IP地址。
- 将获得的网页数据(静态Web元素)保存到缓存中并发送给客户机,以便下次请求相同的数据时快速响应。
3. 代理服务器的概念
代理服务器是一个位于客户端和原始(资源)服务器之间的服务器,为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定原始服务器,然后代理服务器向原始服务器转交请求并将获得的内容返回给客户端。
4. 代理服务器的作用
● 资源获取:代替客户端实现从原始服务器的资源获取。
● 加速访问:代理服务器可能离原始服务器更近,从而起到一定的加速作用。
● 缓存作用:代理服务器保存从原始服务器所获取的资源,从而实现客户端快速的获取。
● 隐藏真实地址:代理服务器代替客户端去获取原始服务器资源,从而隐藏客户端真实信息。
5. 代理的基本类型
● 传统代理:适用于Internet,需在客户机指定代理服务器的地址和端口。
● 透明代理:客户机不需指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向给代理服务器处理。
● 反向代理:如果Squid反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的Web服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。
6. 使用正向代理(传统代理、透明代理)的好处
● 提高Web访问速度
● 隐藏客户机的真实IP地址
7. 反向代理的工作机制
● 缓存网页对象,减少重复请求
● 将互联网请求轮询或按权重分配到内网Web服务器
● 代理用户请求,避免用户直接访问Web服务器,提高安全性
二、Squid的安装及配置
1. 各服务器的环境部署
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2. 安装Squid服务
2.1 编译安装Squid
[root@squid_server ~]# yum install -y gcc gcc++ make
[root@squid_server ~]# cd /opt
[root@squid_server opt]# rz -E
#传入Squid安装包
rz waiting to receive.
[root@squid_server opt]# tar zxvf squid-3.5.28.tar.gz -C /opt
[root@squid_server opt]# cd squid-3.5.28/
[root@squid_server squid-3.5.28]# ./configure \
> --prefix=/usr/local/squid \ #指定安装目录路径
> --sysconfdir=/etc \ #指定配置文件路径
> --enable-arp-acl \ #MAC地址管控,防止客户端使用IP欺骗
> --enable-linux-netfilter \ #使用内核过滤
> --enable-linux-tproxy \ #支持透明模式
> --enable-async-io=100 \ #异步IO,提升存储性能
> --enable-err-language="Simplify_Chinese" \ #错误信息的显示语言
> --enable-underscore \ #允许URL中有下划线
> --disable-poll \ #关闭默认使用poll模式
> --enable-epoll \ #开启epoll模式提升性能
> --enable-gnuregex #使用GNU正则表达式
[root@squid_server squid-3.5.28]# make -j 2 && make install
[root@squid_server squid-3.5.28]# ln -s /usr/local/squid/sbin/* /usr/local/sbin
[root@squid_server squid-3.5.28]# useradd -M -s /sbin/nologin squid
[root@squid_server squid-3.5.28]# chown -R squid:squid /usr/local/squid/var
#此目录用于存放缓存文件,不修改权限或属主属组,squid将无法存储缓存
2.2 修改Squid的配置文件
[root@squid_server squid-3.5.28]# vim /etc/squid.conf
# And finally deny all other access to this proxy
##56行插入
http_access allow all ##放在http_access deny all之前,允许任意客户机使用代理服务,控制规则自上而下匹配
http_access deny all
# Squid normally listens to port 3128
http_port 3128 ##用来指定代理服务监听的地址和端口(默认的端口号为3128)
##61行插入
cache_effective_user squid ##添加,指定程序用户,用来设置初始化、运行时缓存的账户,否则启动不成功
cache_effective_group squid ##添加,指定账号基本组
##68行,缓存文件目录,默认为/usr/local/squid/var/cache/squid,这里不做修改
coredump_dir /usr/local/squid/var/cache/squid
2.3 Squid的运行控制
2.3.1 检查配置文件语法是否正确
[root@squid_server squid-3.5.28]# squid -k parse
2.3.2 启动Squid,第一次启动Squid服务时,会自动初始化缓存目录
[root@squid_server squid-3.5.28]# squid -z #-z选项用来初始化缓存目录
[root@squid_server squid-3.5.28]# squid #启动squid服务
2.3.3 查看Squid服务端口号
[root@squid_server squid-3.5.28]# netstat -natp | grep 'squid'
tcp6 0 0 :::3128 :::* LISTEN 9142/(squid-1)
2.3.4 定期清理swap.state内无效数据
[root@squid_server squid-3.5.28]# squid -k rotate -f /etc/squid.conf
当squid应用运行了一段时间之后,cache_dir对应的swap.state文件就会变得越来越大,里面的无效接口数据越来越多,这可能影响squid的响应时间,因此需要使用squid清理swap.state里面的无效数据,减少swap.state的大小。
2.4 创建Squid服务脚本
[root@squid_server squid-3.5.28]# vim /etc/init.d/squid
#!/bin/bas
##解释器
#chkconfig: 2345 90 25
##2345为默认自启动级别,如是-代表任何级别都不自启动;90为启动优先级,25为停止优先级,优先级范围是0-100,数字越大,优先级越低。
PID="/usr/local/squid/var/run/squid.pid"
##指定进程文件路径
CONF="/etc/squid.conf"
##指定配置文件路径
CMD="/usr/local/squid/sbin/squid"
##指定程序文件路径
case "$1" in
start)
netstat -natp | grep squid &> /dev/null
if [ $? -eq 0 ]
then
echo "squid is running"
else
echo "正在启动 squid..."
$CMD
fi
;;
stop)
$CMD -k kill &> /dev/null
rm -rf $PID &> /dev/null
;;
status)
[ -f $PID ] &> /dev/null
if [ $? -eq 0 ]
then
netstat -natp | grep squid
else
echo "squid is not running"
fi
;;
restart)
$0 stop &> /dev/null
echo "正在关闭 squid..."
$0 start &> /dev/null
echo "正在启动 squid..."
;;
reload)
$CMD -k reconfigure
;;
check)
$CMD -k parse
;;
*)
echo "用法:$0{start|stop|status|reload|check|restart}"
;;
esac
[root@squid_server squid-3.5.28]# chmod +x /etc/init.d/squid
##添加可执行权限
[root@squid_server squid-3.5.28]# chkconfig --add squid
##添加到系统管理程序
[root@squid_server squid-3.5.28]# chkconfig --level 35 squid on
##设置squid启动级别,脚本中已定义
三、构建传统代理服务器
1. 服务器配置
服务器 | 主机名 | IP地址 | 主要软件 |
---|---|---|---|
Squid服务器 | squid_server | 192.168.122.10 | squid |
Web服务器 | web_server | 192.168.122.11 | apache |
Win10客户端 | 192.168.122.222 | edge浏览器 |
2. 修改Squid配置文件
[root@squid_server squid-3.5.28]# vim /etc/squid.conf
# And finally deny all other access to this proxy
http_access allow all
http_access deny all
# Squid normally listens to port 3128
http_port 3128
cache_effective_user squid
cache_effective_group squid
##63行插入
cache_mem 64 MB
##指定缓存功能所使用的内存空间大小,便于保持访问较频繁的WEB对象,容量最好为4的倍数,单位为MB,建议设为物理内存的1/4
reply_body_max_size 10 MB
##允许用户下载的最大文件大小,默认以字节为单位,当下载超过指定大小的Web对象时,浏览器的报错页面中会出现“请求或访问太大”的提示默认设置0表示不进行限制
maximum_object_size 4096 KB
##允许保存到缓存空间的最大对象大小,以KB为单位,超过大小限制的文件将不被缓存,而是直接转发给用户
3. 常用的配置选项
http_port 3128 #监听端口 (还可以只监听一个IP http_port 192.168.0.1:3128)
cache_mem 64MB #缓存占内存大小
maximum_object_size 4096KB #最大缓存块
reply_body_max_size 1024000 allow all #限定下载文件大小
access_log /var/log/squid/access.log #访问日志存放的地方
visible_hostname proxy.test.xom #可见的主机名
cache_dir ufs /var/spool/squid 100 16 256
\#ufs:缓存数据的存储格式
\#/var/spool/squid 缓存目录
\#100:缓存目录占磁盘空间大小(M)
\#16:缓存空间一级子目录个数
\#256:缓存空间二级子目录个数
cache_mgr webmaster@test.com #定义管理员邮箱
http_access deny all #访问控制
[root@squid_server squid-3.5.28]# systemctl restart squid
4. 生产环境中还需要修改防火墙规则
[root@squid_server squid-3.5.28]# iptables -F
#清空原防火墙规则
[root@squid_server squid-3.5.28]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
#不指定表将默认配置filter表,设置INPUT链规则,指定协议为tcp,指定端口3128,目标动作为ACCEPT接受
5. 客户机的代理配置
win7:
- 打开浏览器
- 工具
- Internet选项
- 连接
- 局域网设置
- 开启代理服务器
- 输入地址:Squid服务器的IP地址,端口:3128
win10:
- 打开浏览器
- 设置
- 系统
- 打开计算机的代理设置
- 手动设置代理
- 输入地址:Squid服务器的IP地址,端口:3128
- 访问测试
6. 查看Squid访问日志的新增记录
第一次访问:
[root@squid_server squid-3.5.28]# tail -f /usr/local/squid/var/logs/access.log
1631140806.233 4 192.168.122.222 TCP_MISS/200 410 GET http://192.168.122.11/test.html - HIER_DIRECT/192.168.122.11 text/html
1631140806.267 2 192.168.122.222 TCP_MISS/200 73839 GET http://192.168.122.11/jobs.jpg - HIER_DIRECT/192.168.122.11 image/jpeg
第二次访问:
[root@squid_server squid-3.5.28]# tail -f /usr/local/squid/var/logs/access.log
1631140979.429 1 192.168.122.222 TCP_REFRESH_UNMODIFIED/200 417 GET http://192.168.122.11/test.html - HIER_DIRECT/192.168.122.11 text/html
1631140979.447 0 192.168.122.222 TCP_MEM_HIT/200 73848 GET http://192.168.122.11/jobs.jpg - HIER_NONE/- image/jpeg
来自客户端192.168.122.222前往web服务器192.168.122.11的访问请求。
第一次访问TCP_MISS表示Squid没有请求资源的cache拷贝。HIER_DIRECT将请求转发至web服务器。
第二次访问文字TCP_REFRESH_UNMODIFIED表示Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器响应新的内容,指示这个cache拷贝确实是陈旧的。因此HIER_DIRECT将请求转发至web服务器。
访问图片TCP_MEM_HIT表示Squid在内存cache里发现请求资源的有效拷贝,并将其立即发送到客户端。注意这点并非精确的呈现了所有从内存服务的响应。因此后面HIER_NONE/-将不再转发到web服务器。
7. 查看Web访问日志的新增记录
[root@web_server html]# tail -f /var/log/httpd/access_log
192.168.122.10 - - [09/Sep/2021:06:40:06 +0800] "GET /test.html HTTP/1.1" 200 74 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
192.168.122.10 - - [09/Sep/2021:06:40:06 +0800] "GET /jobs.jpg HTTP/1.1" 200 73511 "http://192.168.122.11/test.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
访问记录来自于squid代理服务器,使得服务端无法得知客户的真实IP。
将代理关闭后访问,查看访问记录
[root@web_server html]# tail -f /var/log/httpd/access_log
192.168.122.222 - - [09/Sep/2021:07:04:27 +0800] "GET /test.html HTTP/1.1" 200 74 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
192.168.122.222 - - [09/Sep/2021:07:04:27 +0800] "GET /jobs.jpg HTTP/1.1" 200 73511 "http://192.168.122.11/test.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
访问记录来自于客户端本身。
四、构建透明代理服务器
1. 服务器配置
服务器 | 主机名 | IP地址 | 主要软件 |
---|---|---|---|
Squid服务器 | squid_server | 内网ens33:192.168.122.10 外网ens36:12.0.0.1 |
squid |
Web服务器 | web_server | 12.0.0.12 | apache |
Win10客户端 | 192.168.122.222 | edge浏览器 |
2. Squid服务器部署
2.1 修改Squid配置文件
[root@squid_server ~]# vim /etc/squid.conf
# And finally deny all other access to this proxy
http_access allow all
http_access deny all
# Squid normally listens to port 3128
##60行,修改,添加提供内网服务的网卡IP地址,和支持透明代理选项transparent
http_port 192.168.122.10:3128 transparent
cache_effective_user squid
cache_effective_group squid
cache_mem 64 MB
reply_body_max_size 10 MB
maximum_object_size 4096 KB
[root@squid_server ~]# systemctl restart squid
2.2 开启路由转发,实现本机中不同网段的地址转发
[root@squid_server ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@squid_server ~]# sysctl -p
net.ipv4.ip_forward = 1
2.3 修改防火墙规则
[root@squid_server ~]# iptables -F
[root@squid_server ~]# iptables -t nat -F
[root@squid_server ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.122.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
#用于转发http协议,将访问端口重定向到3128
[root@squid_server ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.122.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
#用于转发https协议,将访问端口重定向到3128
[root@squid_server ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
#定义防火墙入站规则,允许3128的连接请求
3. 客户端访问测试
3.1 查看Squid访问日志的新增记录
第一次访问:
[root@squid_server ~]# tail -f /usr/local/squid/var/logs/access.log
1631145090.410 5412 192.168.122.222 TCP_MISS/200 410 GET http://12.0.0.12/test.html - ORIGINAL_DST/12.0.0.12 text/html
1631145090.556 29 192.168.122.222 TCP_MISS/200 73839 GET http://12.0.0.12/jobs.jpg - ORIGINAL_DST/12.0.0.12 image/jpeg
1631145090.613 1 192.168.122.222 TCP_MISS/404 464 GET http://12.0.0.12/favicon.ico - ORIGINAL_DST/12.0.0.12 text/html
第二次访问:
[root@squid_server ~]# tail -f /usr/local/squid/var/logs/access.log
1631145233.875 0 192.168.122.222 TCP_MEM_HIT/200 419 GET http://12.0.0.12/test.html - HIER_NONE/- text/html
1631145233.924 1 192.168.122.222 TCP_MEM_HIT/200 73848 GET http://12.0.0.12/jobs.jpg - HIER_NONE/- image/jpeg
来自客户端192.168.122.222前往web服务器12.0.0.12的访问请求。
第一次访问缓存后,第二次访问直接返回的squid服务器中的缓存数据,客户端的响应速度得到了很大的提升。
3.2 查看Web访问日志的新增记录
第一次访问:
[root@web_server ~]# tail -f /var/log/httpd/access_log
12.0.0.1 - - [09/Sep/2021:07:51:30 +0800] "GET /test.html HTTP/1.1" 200 74 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
12.0.0.1 - - [09/Sep/2021:07:51:30 +0800] "GET /jobs.jpg HTTP/1.1" 200 73511 "http://12.0.0.12/test.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
12.0.0.1 - - [09/Sep/2021:07:51:30 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://12.0.0.12/test.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
第二次访问:
[root@web_server ~]# tail -f /var/log/httpd/access_log
12.0.0.1 - - [09/Sep/2021:08:00:13 +0800] "GET /test.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
访问记录来自于squid代理服务器的外网卡,使得服务端无法得知客户的真实IP。
五、构建反向代理服务器
1. 服务器配置
服务器 | 主机名 | IP地址 | 主要软件 |
---|---|---|---|
Squid服务器 | squid_server | 192.168.122.10 | squid |
Web1服务器 | web_server1 | 192.168.122.11 | apache |
Web2服务器 | web_server2 | 192.168.122.12 | apache |
Win10客户端 | 192.168.122.222 | edge浏览器 |
2. 配置Squid服务器
2.1 修改squid配置文件
[root@squid_server ~]# vim /etc/squid.conf
······
##60行,插入
http_port 192.168.122.10:80 accel vhost vport
http_port 192.168.122.10:443 accel vhost vport
cache_peer 192.168.122.11 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
cache_peer 192.168.122.12 parent 80 0 no-query originaservr round-robin max_conn=30 weight=1 name=web2
cache_peer_domain web1 web2 www.test.com
##表示对www.test.com的请求,squid向192.168.122.11和192.168.122.12的80端口发出请求
http_port 192.168.122.10:80 accel vhost vport
表示squid从一个缓存变成了一个Web服务器反向代理加速模式,这个时候squid在80端口监听请求,同时和web服务器的请求端口(vhost vport)绑定,这个时候请求到了squid,squid是不用转发请求的,而是直接要么从缓存中拿数据要么向绑定的端口直接请求数据。
accel:反向代理加速模式
vhost:支持域名或主机名来表示代理节点
vport:支持IP和端口来表示代理节点
cache_peer 192.168.122.11 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
parent:代表父节点,上下关系,非平级关系
80:代理内部web服务器的80端口
0:没有使用icp(电信运营商),表示就一台squid服务器
no-query:不做查询操作,直接获取数据
originserver:指定是源服务器
ronud-robin:指定squid通过轮询的方式将请求分发到其中一台父节点
max_conn:指定最大连接数
weight:指定权重
name:设置别名
2.2 腾出80端口,清空无效的路由规则
[root@squid_server ~]# systemctl stop httpd
[root@squid_server ~]# netstat -natp | grep ":80"
[root@squid_server ~]# iptables -F
[root@squid_server ~]# iptables -t nat -F
3. Web服务器页面准备
web_server1(192.168.122.11)
[root@web_server1 ~]# yum install -y httpd
[root@web_server1 ~]# systemctl start httpd
[root@web_server1 ~]# echo "this is a web_server1" > /var/www/html/index.html
web_server2(192.168.122.12)
[root@web_server2 ~]# yum install -y httpd
[root@web_server2 ~]# systemctl start httpd
[root@web_server2 ~]# echo "this is web_server2_test" > /var/www/html/index.html
4. 客户端访问测试
4.1 添加主机映射
前往C:\Windows\System32\drivers\etc,修改hosts文件
4.2 访问www.test.com测试
4.3 查看squid访问记录
[root@squid_server ~]# tail -f /usr/local/squid/var/logs/access.log
1631232033.287 6 192.168.122.222 TCP_MISS/200 361 GET http://www.test.com/ - ROUNDROBIN_PARENT/192.168.122.12 text/html
1631232033.380 3 192.168.122.222 TCP_MISS/404 464 GET http://www.test.com/favicon.ico - ROUNDROBIN_PARENT/192.168.122.11 text/html
1631232513.921 1 192.168.122.222 TCP_REFRESH_UNMODIFIED/304 225 GET http://www.test.com/ - ROUNDROBIN_PARENT/192.168.122.12 -
1631232604.228 4 192.168.122.222 TCP_REFRESH_UNMODIFIED/304 225 GET http://www.test.com/ - ROUNDROBIN_PARENT/192.168.122.12 -
1631232659.196 1 192.168.122.222 TCP_REFRESH_MODIFIED/200 361 GET http://www.test.com/ - ROUNDROBIN_PARENT/192.168.122.11 text/html
第一轮访问为TCP_MISS,说明没有缓存数据并GET网站静态资源,且两次访问都是RR轮询,访问结果分别是web2和web1。
第二轮访问为TCP_REFRESH_UNMODIFIED,说明squid服务器中已有网页资源,并直接向客户端返回网页数据。
4.4 查看Web服务器访问记录
web_server1
[root@web_server1 ~]# tail -f /var/log/httpd/access_log
192.168.122.10 - - [10/Sep/2021:08:00:33 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://www.test.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
192.168.122.10 - - [10/Sep/2021:08:10:59 +0800] "GET / HTTP/1.1" 200 25 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
web_server2
[root@web_server2 ~]# tail -f /var/log/httpd/access_log
192.168.122.10 - - [10/Sep/2021:08:00:33 +0800] "GET http://www.test.com/ HTTP/1.1" 200 25 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
192.168.122.10 - - [10/Sep/2021:08:08:33 +0800] "GET http://www.test.com/ HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
192.168.122.10 - - [10/Sep/2021:08:10:04 +0800] "GET http://www.test.com/ HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
访问请求来自于squid代理服务器,无法查看到客户端ip。
4.5 客户端抓包
六、ACL访问控制
1. ACL访问控制方式
● 根据源地址、目标URL、文件类型等定义列表
格式为:acl 列表名称 列表类型 列表内容 ...
● 针对已定义的acl列表进行限制
格式为:http_access allow或deny 列表名称 ...
2. ACL规则优先级
● 一个用户访问代理服务器时,Squid会以从上至下的顺序匹配Squid中定义的所有规则列表,一旦匹配成功,立即停止匹配
● 所有规则都不匹配时,Squid会使用与最后一条相反的规则
3. ACL的定义步骤
在配置文件squid.conf中,ACL访问控制通过以下两个步骤来实现呢:
(1)通过acl配置项定义需要控制的条件;
(2)通过http_access对已定义的列表做“允许”或“拒绝”访问的控制。
4. 常用的列表类型
列表类型 | 列表内容示例 | 说明 |
---|---|---|
src | 192.168.4.1 192.168.4.0/24 192.168.1.0/24-192.168.4.0/24 |
源地址、网段、IP地址范围 |
dst | 216.163.137.3 61.135.167.0/24 www.baidu.com |
目标IP地址、网段、主机名 |
port | 80 443 8080 20 21 |
目标端口 |
dstdomain | .qq.com .msn.com |
目标域 |
time | MTWHF 8:30-17:30 12:00-13:00 AS |
字母表示一星期中各天的英文缩写。 MTWHF:代表星期一到星期五 AS:代表星期六和星期天 |
maxconn | 20 | 每个客户机的并发连接数 |
url_regex | url_regex -i ^rtsp:// url_regex -i ^emule:// |
目标资源的URL地址,-i表示忽略大小写 |
urlpath_regex | urlpath_regex –i sex adult urlpath_regex -i .mp3$ |
目标资源整个URL路径,-i表示忽略大小写 |
proto | FTP HTTP HTTPS |
URI访问(或传输)协议 |
browser | Mozilla Firefox Opera |
浏览器 |
4.1 src(推荐使用)
IP地址在访问控制元素里是最普遍使用的。大部分站点使用IP地址来控制客户允许或不允许访问Squid。src类型指客户源IP地址。也就是说,当src ACL出现在访问控制列表里时,squid将它与发布请求的客户IP地址进行比较。
正常情况下你允许来自内网中主机的请求,并阻塞其他的。例如,假如你的单位使用192.168.0.0子网,你可以这样指定ACL:
acl MyNetwork src 192.168.0.0
假如你有许多子网,你能在同一个acl行里面列举它们:
acl MyNetwork src 192.168.0.0 10.0.1.0/24 10.0.5.0/24 172.16.0.0/12
squid有许多其他ACL类型用以检查客户地址。srcdomain类型比较客户的完整可验证域名。它要求反向DNS查询,这可能会延缓处理该请求。srcdom_regex ACL是类似的,但它允许你使用正则表达式来匹配域名。最后,src_as类型比较客户的AS号。
4.2 dst(不推荐使用)
dst类型指向原始服务器(目标)IP地址。在某些情况下,你能使用该类型来阻止你的用户访问特定web站点。然而,在使用dst ACL时你须谨慎。大部分squid接受到的请求有原始服务器主机名。例如:
GET http://www.web-cache.com/ HTTP/1.0
这里,www.web-cache.com是主机名。当访问列表规则包含了dst元素时,squid必须找到该主机名的IP地址。假如squid的IP缓存包含了该主机名的有效接口,这条ACL被立即检测。否则,在DNS查询忙碌时,squid会延缓处理该请求。这对某些请求来说会造成延时。为了避免延时,你该尽可能的使用dstdomain ACL类型来代替dst。
如下是简单的dst ACL示例:
acl AdServers dst 1.2.3.0/24
请注意,dst ACL存在的问题是,你试图允许或拒绝访问的原始服务器可能会改变它的IP地址。假如你不关心这样的改变,那就不必麻烦去升级squid.conf。你可以在acl行里放上主机名,但那样会延缓启动速度。假如你的ACL需要许多主机名,你也许该预处理配置文件,将主机名转换成IP地址。
4.3 dstdomain(推荐使用)
在某些情况下,你发现基于名字的访问控制非常有用。你可以使用它们去阻塞对某些站点的访问,去控制squid如何转发请求,以及让某些响应不可缓存。dstdomain之所以非常有用,是因为它检查请求url里的主机名。然而首先我想申明如下两行的不同:
acl A dst www.squid-cache.org (这个其实是IP地址)
acl B dstdomain www.squid-cache.org
A实际上是IP地址ACL。当Squid解析配置文件时,它查询www.squid-cache.org的IP地址,并将它们存在内存里。它不保存名字。假如在squid运行时IP地址改变了,squid会继续使用旧的地址。
然而dstdomain ACL以域名形式存储,并非IP地址。当squid检查ACL B时,它对URL的主机名部分使用字符串比较功能。在该情形下,它并不真正关心是否www.squid-cache.org的IP地址改变了。
使用dstdomain ACL的主要问题是某些URL使用IP地址代替主机名。假如你的目标是使用dstdomain ACL来阻塞对某些站点的访问,聪明的用户能手工查询站点的IP地址,然后将它们放在URL里。例如,下面的2行URL带来同样的页面:
http://www.squid-cache.org/docs/FAQ/ http://206.168.0.9/docs/FAQ/
第一行能被dstdomain ACL轻易匹配,但第二行不能。这样,假如你依靠dstdomain ACL,你也该同样阻塞所有使用IP地址代替主机名的请求。
4.4 srcdomain(不推荐使用)
srcdomain ACL也有点麻烦。它要求对每个客户IP地址进行所谓的反向DNS查询。技术上,squid请求对该地址的DNS PTR记录。DNS的响应--完整可验证域名(FQDN)--是squid匹配ACL值的东西。(请参考O'Reilly's DNS and BIND找到更多关于DNS PTR记录的信息)使用dst ACL,FQDN查询会导致延时。请求会被延缓处理直到FQDN响应返回。FQDN响应被缓存下来,所以srcdomain查询通常仅在客户首次请求时延时。
不幸的是,srcdomain查询有时不能工作。许多组织并没有保持他们的反向查询数据库与日更新。假如某地址没有PTR记录,ACL检查失败。在该情形下,请求可能会延时非常长时间(例如2分钟)直到DNS查询超时。假如你使用srcdomain ACL,请确认你自己的DNS in-addr.arpa区域配置正确并且在工作中。假如这样,你可以使用如下的ACL:
acl LocalHosts srcdomain .users.example.com
4.5 proto
该类型指URI访问(或传输)协议。如下是有效值:http, https (same as HTTP/TLS), ftp, gopher, urn, whois, 和cache_object。也就是说,这些是被squid支持的URL机制名字。例如,假如你想拒绝所有的FTP请求,你可以使用下列指令:
acl FTP proto FTP
http_access deny FTP
cache_object机制是squid的特性。它用于访问squid的缓存管理接口。默认的squid.conf文件有许多行限制缓存管理访问:
acl Manager proto cache_object
acl Localhost src 127.0.0.1
http_access allow Manager Localhost
http_access deny Manager
这些配置行仅允许来自本机地址的缓存管理请求,所有其他的缓存管理请求被拒绝。这意味着在squid机器上有帐号的人,能访问到潜在的敏感缓存管理信息。你也许想修改缓存管理访问控制,或对某些页面使用密码保护
4.6 time
time ACL允许你控制基于时间的访问,时间为每天中的具体时间,和每周中的每天。日期以单字母来表示,见如下表。时间以24小时制来表示。开始时间必须小于结束时间,这样在编写跨越0点的time ACL时可能有点麻烦。
S:Sunday
M:Monday
T:Tuesday
W:Wednesday
H:Thursday
F:Friday
A:Saturday
D:All weekdays (M-F)
可以这样写:
acl Working_hours MTWHF 08:00-17:00
or:
acl Working_hours D 08:00-17:00
另外,你可以这样写:
acl Peak 04:00-20:00
http_access allow !Peak
你不应该在同一个time ACL里放置多个日期和时间范围列表。对这些ACL的解析不一定是你想象的那样。例如,假如你输入:
acl Blah time M 08:00-10:00 W 09:00-11:00
实际能做到的是:
acl Blah time MW 09:00-11:00
解析仅仅使用最后一个时间范围。正确的写法是,将它们写进两行:
acl Blah time M 08:00-10:00
acl Blah time W 09:00-11:00
4.7 maxconn
maxconn ACL指来自客户IP地址的大量同时连接。某些squid管理员发现这是个有用的方法,用以阻止用户滥用代理或者消耗过多资源。
maxconn ACL在请求超过指定的数量时,会匹配这个请求。因为这个理由,你应该仅仅在deny规则里使用maxconn。考虑如下例子:
acl OverConnLimit maxconn 4
http_access deny OverConnLimit
在该情况中,squid允许来自每个IP地址的同时连接数最大为4个。当某个客户发起第五个连接时,OverConnLimit ACL被匹配,http_access规则拒绝该请求。
4.8 srcdom_regex
srcdom_regex ACL允许你使用正则表达式匹配客户域名。这与srcdomain ACL相似,它使用改进的的子串匹配。相同的限制是:某些客户地址不能反向解析到域名。作为示例,下面的ACL匹配以dhcp开头的主机名:
acl DHCPUser srcdom_regex -i ^dhcp
因为领头的^符号,该ACL匹配主机名dhcp12.example.com,但不匹配host12.dhcp.example.com
4.9 dstdom_regex
dstdom_regex ACL也与dstdomain相似。下面的例子匹配以www开头的主机名:
acl WebSite dstdom_regex -i ^www.
如下是另一个有用的正则表达式,用以匹配在URL主机名里出现的IP地址:
acl IPaddr dstdom_regex [0-9]$
这样可以工作,因为squid要求URL主机名完全可验证。既然全局顶级域名中没有以数字结尾的,该ACL仅仅匹配IP地址,它以数字结尾。
4.10 url_regex
url_regex ACL用于匹配请求URL的任何部分,包括传输协议和原始服务器主机名。例如,如下ACL匹配从FTP服务器的MP3文件请求:
acl FTPMP3 url_regex -i ^ftp://.*.mp3$
4.11 urlpath_regex
urlpath_regex与url_regex非常相似,不过传输协议和主机名不包含在匹配条件里。这让某些类型的检测非常容易。例如,假设你必须拒绝URL里的"sex",但仍允许在主机名里含有"sex"的请求,那么这样做:
acl Sex urlpath_regex sex
另一个例子,假如你想特殊处理cgi-bin请求,你能这样捕获它们:
acl CGI1 urlpath_regex ^/cgi-bin
当然,CGI程序并非总在/cgi-bin/目录下,这样你应该编写其他的ACL来捕获它们。
4.12 browser
大部分HTTP请求包含了User-Agent头部。该头部的值典型如下:
Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686)
browser ACL对user-agent头执行正则表达式匹配。例如,拒绝不是来自Mozilla浏览器的请求,可以这样写:
acl Mozilla browser Mozilla
http_access deny !Mozilla
在使用browser ACL之前,请确认你完全理解cache接受到的User-Agent字符串。某些user-agent与它们的来源相关。甚至squid可以重写它转发的请求的User-Agent头部。某些浏览器例如Opera和KDE的Konqueror,用户可以对不同的原始服务器发送不同的user-agent字串,或者干脆忽略它们。
5. 对象列表管理
5.1 创建列表管理
[root@squid_server ~]# mkdir /etc/squid
[root@squid_server ~]# vim /etc/squid/dest.list
#创建列表文件
12.0.0.12
192.168.122.0/24
[root@squid_server ~]# vim /etc/squid.conf
······
acl destinationhost dst "/etc/squid/dest.list"
#调用指定文件中的列表内容
······
http_access deny(或allow) destinationhost
#注意,如果是拒绝列表,需要放在http_access allow all之前
[root@squid_server ~]# systemctl restart squid
5.2 客户端访问测试
http_access deny destinationhost
http_access allow destinationhost
七、Squid日志分析--sarg软件的安装及应用
1. 安装图像处理软件包
[root@squid_server ~]# yum install -y pcre-devel gd gd-devel
2. 源码编译安装sarg
[root@squid_server ~]# mkdir /usr/local/sarg
#创建软件安装目录
[root@squid_server ~]# cd /opt
[root@squid_server opt]# rz -E
#传入sarg软件安装包
rz waiting to receive.
[root@squid_server opt]# tar zxvf sarg-2.3.7.tar.gz -C /opt
[root@squid_server opt]# cd sarg-2.3.7/
[root@squid_server sarg-2.3.7]# ./configure \
> --prefix=/usr/local/sarg \ #软件安装目录
> --sysconfdir=/etc/sarg \ #配置文件目录,默认是/usr/local/etc
> --enable-extraprotection #额外安全防护
[root@squid_server sarg-2.3.7]# make -j 2 && make install
3. 修改配置文件/etc/sarg/sarg.conf
[root@squid_server sarg-2.3.7]# vim /etc/sarg/sarg.conf
##7行,取消注释
access_log /usr/local/squid/var/logs/access.log ##指定访问日志文件
##25行,取消注释(并修改)
title "Squid User Access Reports" ##网页标题,可自定义修改
##120行,取消注释(并修改)
output_dir /var/www/html/sarg ##报告输出目录,可自定义修改
##178行,取消注释
user_ip no ##使用用户名显示
##184行,取消注释并修改
topuser_sort_field connect reverse ##top排序中,指定连接次数采用降序排列,升序是normal
##190行,取消注释并修改
user_sort_field connect reverse ##对于用户访问记录,连接次数按降序排列
##206行,取消注释并修改
exclude_hosts /usr/local/sarg/noreport ##指定不计入排序的站点列表的文件,需自行创建,必须有该文件(可为空文件),否则会报错
##257行,取消注释
overwrite_report no ##同名同日期的日志是否覆盖
##289行,取消注释并修改
mail_utility mailq.postfix ##发送邮件报告命令
##434行,取消注释并修改
charset UTF-8 ##指定字符集UTF-8
##518行,取消注释
weekdays 0-6 ##top排行的周期周期,0表示周日
##525行,取消注释
hours 0-23 ##top排行的时间周期
##633行,取消注释(并修改)
www_document_root /var/www/html ##指定网页根目录,务必为当前网页服务的根目录
4. 创建不计入站点文件,添加的域名将不被显示在排序中
[root@squid_server sarg-2.3.7]# cd /usr/local/sarg/
[root@squid_server sarg]# ls
bin share
[root@squid_server sarg]# touch noreport
5. 创建软链接到PATH路径
[root@squid_server sarg]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin
6. 安装apache并生成sarg
[root@squid_server sarg]# yum install -y httpd
[root@squid_server sarg]# systemctl start httpd
[root@squid_server sarg]# netstat -natp | grep 'httpd'
tcp6 0 0 :::80 :::* LISTEN 4808/httpd
[root@squid_server sarg]# sarg
SARG: 纪录在文件: 19, reading: 100.00%
SARG: 成功的生成报告在 /var/www/html/sarg/2021Sep09-2021Sep10
7. 浏览器访问查看
通过浏览器访问Squid服务器,查看sarg报告网页
8. 添加计划任务,执行每天生成报告
8.1 编写执行脚本
[root@squid_server sarg]# vim /usr/local/sarg/report.sh
#!/bin/bash
#Get current date
TODAY=$(date +%d/%/%m/%Y)
#Get yesterday date
YESTERDAY=$(date -d '-1 day' +%d/%m/%Y)
#Create daily_report
/usr/local/sarg/bin/sarg -l /usr/local/squid/var/logs/access.log -o /var/www/html/sarg -z -d $YESTERDAY-$TODAY &> /dev/null
#Delete old directory which mtime>30
find /var/www/html/sarg -type d -a -name '20*' -a -mtime +30 -exec rm -rf {} \;
exit 0
[root@squid_server sarg]# chmod +x /usr/local/sarg/report.sh
#赋予脚本执行权限
8.2 添加计划任务
[root@squid_server sarg]# crontab -e
##分时日月周,添加计划性任务
0 0 * * * /usr/local/sarg/report.sh
[root@squid_server sarg]# crontab -l
##查看计划性任务列表
0 0 * * * /usr/local/sarg/report.sh
[root@squid_server sarg]# systemctl status crond
##查看cronf服务状态,需保持开启状态
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 五 2021-09-10 07:04:56 CST; 15s ago
Main PID: 11502 (crond)
CGroup: /system.slice/crond.service
└─11502 /usr/sbin/crond -n
9月 10 07:04:56 squid_server systemd[1]: Started Command Scheduler.
9月 10 07:04:56 squid_server systemd[1]: Starting Command Scheduler...
9月 10 07:04:56 squid_server crond[11502]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 33% if used.)
9月 10 07:04:56 squid_server crond[11502]: (CRON) INFO (running with inotify support)
9月 10 07:04:56 squid_server crond[11502]: (CRON) INFO (@reboot jobs will be run at computer's startup.)