Squid缓存代理
Squid代理服务器
Squid代理服务器是基于Unix的代理服务器(proxy server),它主要提供缓存加速、应用层过滤控制的功能,缓存网页对象,可以减少重复请求
1.功能
缓存加速
应用层过滤控制
2.工作机制
代替客户机向网站请求数据,从而隐藏用户的真实IP地址
将获得的网页数据保存到缓存中,对下次请求相同数据时做到快速响应
3.代理类型
传统代理
适用于Internet,需在客户机指定代理服务器的地址和端口。
透明代理
客户机不需指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向给代理服务器
反向代理
如果 Squid 反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的 WEB 服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存(静态)在本地,供下一个请求者使用
4.优点
- 提高Web访问速度
- 隐藏客户端的真实IP地址
实验
设备准备
Squid代理服务器(192.168.233.103)
Web服务器1(192.168.118.50、192.168.233.104)
Web服务器2(192.168.118.50、192.168.233.105)
1.配置squid
1.安装依赖环境包
[root@squid ~]# yum -y install gcc gcc-c++ make
2.解压软件包
[root@squid opt]# tar -xf squid-3.5.27.tar.gz
3.编译安装
[root@squid squid-3.5.27]# ./configure --prefix=/usr/local/squid
> --sysconfdir=/etc #将配置文件修改到/etc目录下
> --enable-arp-acl #可在ACL中设置通过MAC地址进行管理,防止IP欺骗
> --enable-linux-netfilter #使用内核过滤
> --enable-linux-tproxy #支持透明模式
> --enable-async-io=100 #异步i/o,提升存储性能
> --enable-err-language="Simplify_Chinese" #错误信息的显示语音
> --enable-underscore #允许URL中有下划线
> --enable-poll #使用Poll模式,提升性能
> --enable-gnuregex #使用GNU正则表达式
[root@squid squid-3.5.27]# make && make install
4.优化squid管理
[root@localhost squid-3.5.27]# ln -s /usr/local/squid/sbin/* /usr/local/sbin //创建链接文件,优化路径
[root@localhost squid-3.5.27]# useradd -M -s /sbin/nologin squid //创建程序用户
[root@localhost squid-3.5.27]# chown -R squid:squid /usr/local/squid/var/ //改变目录属主
5.修改squid配置文件
[root@localhost squid-3.5.27]# vim /etc/squid.conf
6.编写squid启动服务脚本
[root@squid squid-3.5.27]# vim /etc/squid.conf
#!/bin/bash
#chkconfig: 35 90 25
#config: /etc/squid.conf
#pidfile: /usr/local/squid/var/run/squid.pid
#Description: Squid - Internet Object Cache
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
start)
netstat -utpln | grep squid &>/dev/null
if [ $? -eq 0 ]
then
echo "Squid is running"
else
$CMD
fi
;;
stop)
$CMD -k kill &>/dev/null
rm -rf $PID &>/dev/null
;;
status)
[ -f $PID ] &>/dev/null
if [ $? -eq 0 ]
then
netstat -utpln | 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 "用法:{start | stop | restart | reload | check | status}"
esac
[root@localhost squid-3.5.27]# chmod +x /etc/init.d/squid //赋予执行权限
[root@localhost squid-3.5.27]# chkconfig --add squid //加入系统服务
[root@localhost squid-3.5.27]# chkconfig squid on //指定squid在各等级为on
[root@localhost squid-3.5.27]# netstat -antp | grep squid
tcp6 0 0 :::3128 :::* LISTEN 19127/(squid-1)
1.搭建传统代理
1.修改squid服务器
1.修改配置文件
[root@squid squid-3.5.27]# vim /etc/squid.conf
//添加以下内容
2.修改防火墙规则
[root@localhost squid-3.5.27]# iptables -F //清空规则
[root@localhost squid-3.5.27]# systemctl restart firewalld.service //重启防火墙
[root@localhost squid-3.5.27]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT //允许来自tcp3128的流量进入
2.配置web服务器
安装httpd
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# systemctl start httpd
3.win测试
修改网卡
设置代理
访问web2.并查看日志
访问Web2服务器IP地址,刷新网页并实时查看访问日志,观察来访IP地址为squid的IP地址
2.搭载透明代理
设备准备
基于上面的传统代理设置,Squid服务器增加一个网卡(VMnet1仅主机,ens36:192.168.108.133,不用设置网关,DNS)
Win10的IP地址设置为192.168.105.200,网关为Squid的ens37网卡地址
1.修改Squid配置文件
[root@squid ~]# vim /etc/squid.conf
2.添加防火墙规则
[root@squid ~]# iptables -t nat -I PREROUTING -i ens37 -s 192.168.108.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@squid ~]# iptables -t nat -I PREROUTING -i ens37 -s 192.168.108.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
[root@squid ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
[root@squid ~]# systemctl restart squid //重启squid
[root@squid ~]# netstat -antp | grep squid
tcp 0 0 192.168.108.133:3128 0.0.0.0:* LISTEN 23845/(squid-1)
3.在web服务器添加静态路由
[root@web1 ~]# route add -net 192.168.108.0/24 gw 192.168.233.103
4.访问web1
Win10上先关闭代理设置,再清除浏览器缓存,访问Web1IP地址会发现依然能访问,证明透明代理不需要指定Squid服务端
win10网卡配置
访问网页web1:192.168.233.104
3.ACL控制访问
在配置文件/etc/squid.conf 中,ACL访问控制通过以下两个步骤来实现:
-
① 使用acl 配置项定义需要控制的条件;
-
② 通过http_access配置项对已定义的列表做“允许”或“拒绝”访问的控制。
-
格式:
acl 列表名称 列表类型 列表内容
列表名称:名称自定义,相当于给acl起个名字(也会被http_access 调用)
列表类型:必须使用squid预定义的值,对应不同类别的控制条件
列表内容:是要控制的具体对象,不同类型的列表所对应的内容也不一样,可以有多个值(以空格为分隔,为“或”的关系)
1.修改配置文件
[root@squid ~]# vim /etc/squid.conf
2.重启squid
[root@squid ~]# systemctl restart squid
3.访问web1
4.Squid日志分析
Squid日志分析我们可以安装sarg日志分析工具,它采用HTML格式,详细列出每一位用户访问Internet的站点信息、时间占用信息、排名、连接次数、访问量等
1.安装图像处理软件
1.安装依赖包
[root@squid opt]# yum install -y gd gd-devel pcre-devel
2.解压安装包
[root@squid opt]# tar xzf sarg-2.3.7.tar.gz
3.编译安装
[root@squid sarg-2.3.7]# ./configure --prefix=/usr/local/sarg \
> --sysconfdir=/etc/sarg \ #设置配置文件目录,
> --enable-extraprotection #额外安全防护
[root@squid sarg-2.3.7]# make && make install
4.修改sarg配置文件
[root@squid sarg-2.3.7]# vim /etc/sarg/sarg.conf
5.启动sarg
[root@squid sarg-2.3.7]# touch /usr/local/sarg/noreport
[root@squid sarg-2.3.7]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/
[root@squid sarg-2.3.7]# sarg
SARG: 纪录在文件: 169, reading: 100.00%
SARG: 成功的生成报告在 /var/www/html/sarg/2021Aug07-2021Aug07
6.安装httpd
[root@squid sarg-2.3.7]# yum -y install httpd
[root@squid sarg-2.3.7]# systemctl start httpd
7.测试
添加计划任务
[root@squid sarg-2.3.7]# vim /usr/local/sarg/report.sh
#!/bin/bash
#Get current date #获取准确时间
TODAY=$(date +%d/%m/%Y)
#Get one yesterday ago today #获取前一天
YESTERDAY=$(date -d "1 day ago" +%d/%m/%Y)
/usr/local/sarg/bin/sarg -l /usr/local/squid/var/logs/access.log -o /var/www/html/sarg -z -d $YESTERDAY-$TODAY &> /dev/null
exit 0
[root@squid sarg-2.3.7]# chmod +x /usr/local/sarg/report.sh
[root@squid sarg-2.3.7]# crontab -e
0 0 * * * /usr/local/sarg/report.sh
[root@squid sarg-2.3.7]# crontab -l
0 0 * * * /usr/local/sarg/report.sh
5.搭建反向代理
工作机制
- 缓存网页对象,减少重复请求
- 将互联网请求轮询或按权重分配到内网web服务器
- 代理用户请求,避免用户直接访问Web服务器,提高安全
关闭防火墙
[root@squid sarg-2.3.7]# systemctl stop firewalld
1.更新配置文件
[root@squid sarg-2.3.7]# vim /etc/squid.conf
60 #http_port 192.168.108.133:3128 transparent
61 http_port 192.168.233.103:80 accel vhost vport
62 cache_peer 192.168.233.104 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web 1
63 cache_peer 192.168.233.105 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web 2
64 cache_peer_domain web1 web2 www.xzw.com
squid从一个缓存变成了一个Web服务器反向代理加速模式,这个时候squid在80端口监听请求,同时和webserver的请求端口(vhost vport)绑定,这个时候请求到了squid,squid是不用转发请求的,而是直接要么从缓存中拿数据要么向绑定的端口直接请求数据。
accel :反向代理加速模式
vhost:支持域名或主机名来表示代理节点
vport :支持IP和端口来表示代理节点
parent :代表为父节点,上下关系,非平级关系
80:代理内部web服务器的80端口
0 :没有使用icp,表示就一台squid服务器
no-query :不做查询操作,直接获取数据
originserver :指定是源服务器
round-robin :指定squid 通过轮询方式将请求分发到其中一台父节点
max_conn :指定最大连接数
weight :指定 权重
name :设置别名
2.配置web服务器
[root@web1 ~]# echo 'hello' > /var/www/html/index.html
[root@web2 ~]# echo 'world' > /var/www/html/index.html
3.配置客户端
访问网页