一、缓存代理概述
1.1 缓存代理的概述-1
■ Web代理的工作机制
- 缓存网页对象,减少重复请求
- 客户机访问过程:
客户端要设置一个代理IP,代理IP指向代理服务器。客户访问163网站代理ip会提前访问连接代理服务器,代理服务器会检查有没有缓存,有的话就直接给客户端,没有的话代理服务器会去163拿资源在给客户机,不会让客户机自己去拿资源(隐藏客户端)。
1.2 缓存代理的概述-2
■ 代理的基本类型
- 传统代理:适用于Internet,需明确指定服务端
- 透明代理:客户机不需指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向给代理服务器处理
■ 使用代理的好处
- 提高Web访问速度
- 隐藏客户机的真实IP地址
二、实验操作
- 案例环境
主机: ip地址:
squid 20.0.0.20
web1 20.0.0.21
web2 20.0.0.22
案例要求:客户端想访问web服务器,访问的是squid代理服务器,不直接访问web服务器
一、安装squid服务
--------------------------------------------安装squid服务--------------------------------------------------------------------------------------------------------------------------------------------------
squid服务器:
[root@localhost ~]# hostnamectl set-hostname squid #设置主机名squid
[root@localhost ~]# su ###刷新
web服务器:
[root@localhost ~]# hostnamectl set-hostname web #设置主机名web
[root@localhost ~]# su
squid服务器配置:
将软件包上传到服务器中
[root@squid ~]# tar zxvf squid-3.4.6.tar.gz -C /opt/ ###将包解压到/opt目录下
[root@squid ~]# cd /opt/squid-3.4.6/
[root@squid squid-3.4.6]# yum -y install gcc gcc-c++ ###安装编译工具gcc、gcc-c++
[root@squid squid-3.4.6]# ./configure \
--prefix=/usr/local/squid \
--sysconfdir=/etc \
--enable-arp-acl \
--enable-linux-netfilter \
--enable-linux-tproxy \
--enable-async-io=100 \
--enable-err-language="Simplify_Chinese" \
--enable-underscore \
--enable-poll \
--enable-gnuregex
--------------------------------------------上面配置的解释---------------------------------------------------------
./configure \
--prefix=/usr/local/squid \ ###指定安装路径
--sysconfdir=/etc \ ###配置文件所存在的目录
--enable-arp-acl \ ###启用acl访问控制列表
--enable-linux-netfilter \ ###内核过滤表
--enable-linux-tproxy \ ###支持透明代理
--enable-async-io=100 \ ###io的优化
--enable-err-language="Simplify_Chinese" \ ###支持err语言(也就是报错是简体中文形式)
--enable-underscore \ ###url支持下划线
--enable-poll \ ###字符设备驱动函数(内核函数)
--enable-gnuregex \ ###支持正则表达式
----------------------------------------------------------------------------------------------------------
[root@squid squid-3.4.6]# make -j4 && make install ###编译并安装
[root@squid squid-3.4.6]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/ ###让可用命令让系统所能识别
[root@squid squid-3.4.6]# useradd -M -s /sbin/nologin squid ###建立一个程序性用户
[root@squid squid-3.4.6]# chown -R squid.squid /usr/local/squid/var/ ###给用户一个权限
[root@squid squid-3.4.6]# vim /etc/squid.conf ###改主配置文件
#http_access deny all ###默认拒绝所有,注销掉,或者放下面,从上往下读,不会拒绝掉
http_access allow all ###加上这条allow,允许所有终端来访问,并且可用访问其他的源端服务器
http_port 3128
cache_effective_user squid ###在端口下面加上缓存管理用户
cache_effective_group squid ###在端口下面加上缓存管理组
[root@squid squid-3.4.6]# squid -k parse ###检查配置文件语法
[root@squid squid-3.4.6]# squid -z ###初始化缓存目录
[root@squid squid-3.4.6]# squid ###启动服务
[root@squid squid-3.4.6]# netstat -anpt | grep 3128 ###可用查看一下启动了没
tcp6 0 0 :::3128 :::* LISTEN 40026/(squid-1)
[root@squid squid-3.4.6]# cd /etc/init.d/
[root@squid init.d]# vim squid
#!/bin/bash
#chkconfig: 2345 90 25
PID="/usr/local/squid/var/run/squid.pid" ##定义PID文件进程号
CONF="/etc/squid.conf" ##定义主配置文件
CMD="/usr/local/squid/sbin/squid" ##定义启动命令
case "$1" in
start)
netstat -ntap | grep squid &> /dev/null
if [ $? -eq 0 ]
then
echo "squid is running"
else
echo "正在启动 squid...."
$CMD
fi
;;
stop)
$CMD -k kill &> /dev/null ##关闭squid
rm -rf $PID &> /dev/null ##删除PID文件
;;
status)
[ -f $PID ] &> /dev/null
if [ $? -eq 0 ]
then
netstat -ntap | 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|reload|status|check|restart}"
;;
esac
[root@squid init.d]# chmod +x squid ###给个执行权限
[root@squid init.d]# chkconfig --add squid ###service添加一个列表名称
[root@squid init.d]# service squid stop ###关闭squid服务网
[root@squid init.d]# netstat -anpt | grep 3128 ###查看一下是否关闭掉了
[root@squid init.d]# service squid start ###在启动
正在启动 squid....
二、传统代理模式(正向)
------------------------------------------配置传统代理服务器(传统模式),还在squid服务器上配置---------------------------------------------------------------------------------------------------------------
[root@squid init.d]# vim /etc/squid.conf ###配置主配置文件,在端口下面添加这三条!
cache_mem 64 MB ###指定缓存功能所使用的内存空间大小
reply_body_max_size 10 MB ###允许用户下载的单个文件最大文件大小,以字节为单位。设置0表示不限制
maximum_object_size 4096 KB ###允许保存到缓存空间的最大对象大小,以KB为单位,超过大小限制的文件将不被缓存,优化指令(大文件保存在用户浏览器缓存里,不用来找服务器了,不然会占用服务器的资源)
[root@squid init.d]# iptables -F ###清空防火墙规则
[root@squid init.d]# iptables -t nat -F ###清空防火墙表规则
[root@squid init.d]# setenforce 0 ###关闭核心防护(临时的)
[root@squid init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT ###-I在开头插入input链(一个链包含多个规则),-p定义一个tcp协议,-dport 端口,-j 允许操作
[root@squid init.d]# service squid reload ###重载配置文件 ```
- 配置web1端
[root@web ~]# systemctl stop firewalld ###关闭防火墙
[root@web ~]# setenforce 0 ###关闭核心防护
[root@web ~]# yum -y install httpd ###安装Apache
[root@web ~]# systemctl start httpd ###启动Apache服务
- 在宿主机上面测试
1、打开谷歌浏览器
2、打开设置
3、点开高级
4、点击左下角系统
5、点击页面上的 打开您计算机的代理设置
6、手动设置代理下面设置,使用代理,地址是你的代理服务器的ip地址,端口是3128,点击保存
7、然后浏览器输入20.0.0.21,去访问web服务器
- web1服务器上查看
[root@web httpd]# cd /var/log/httpd/ ###到httpd目录下
[root@web httpd]# cat access_log ###查看access日志
20.0.0.20 - - [30/Oct/2020:00:28:16 -0400] "GET /noindex/css/fonts/Bold/OpenSans-Bold.ttf HTTP/1.1" 404 238 "http://20.0.0.21/noindex/css/open-sans.css" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
20.0.0.20 - - [30/Oct/2020:00:28:16 -0400] "GET /noindex/css/fonts/Light/OpenSans-Light.ttf HTTP/1.1" 404 240 "http://20.0.0.21/noindex/css/open-sans.css" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
-------从上面的就能看出,访问web服务器的是代理服务器的ip,并不是真机的ip地址
三、透明模式(客户端只需要填一个代理网关ip就可以解析到)
------------------------------------------配置透明代理服务器,还在squid服务器配置---------------------------------------------------------------------------------------------------------------
在代理服务器上添加一块网卡,设置成主机模式
[root@squid ~]# cd /etc/sysconfig/network-scripts/
[root@squid network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
[root@squid network-scripts]# vim ifcfg-ens36
NAME=ens36 ###名称改了
DEVICE=ens36 ###名称改了
ONBOOT=yes
IPADDR=192.168.10.3 ###ip地址改了
NETMASKE=255.255.255.0 ###子网掩码
UUID、DNS都不用设置,可以删掉
[root@squid network-scripts]# systemctl restart network ###重启一下网卡
[root@squid network-scripts]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1 ###开启路由转发功能,1是开启,0是不开启
[root@squid network-scripts]# sysctl -p ###加载一下
-------------------------------------web1端上也要配置一个回去的路由-----------------------------------------------------------------------------------------------------------------------
[root@web ~]# route add -net 192.168.10.0/24 gw 20.0.0.20
----------------------------------------squid服务器配置---------------------------------------------------------------------------------------------------------------------------------------------------
[root@squid network-scripts]# vim /etc/squid.conf
http_port 192.168.10.3:3128 transparent ###把3182端口的地方改成透明模式
[root@squid network-scripts]# service squid start ###重启服务
[root@squid network-scripts]# iptables -F ###清除一下防火墙规则
[root@squid network-scripts]# iptables -t nat -F ###清除一下表缓存
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to 3128 ###添加一个80端口访问的规则
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.10.0/24 -p tcp --dport 443 -j REDIRECT --to 3128 ###访问的是https的就要改成443端口
[root@squid network-scripts]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT ###可以进行一个重定向转发
------------------------------------测试-----------------------------------------------------------------------
客户端的网关填写刚刚配置的代理服务器ens36网卡的ip地址,192.168.10.3
然后浏览器输入20.0.0.21访问apache网站
在Apache服务器查看
[root@web httpd]# cd /var/log/httpd/ ###到httpd目录下
[root@web httpd]# cat access_log ###查看access日志
20.0.0.20 - - [30/Oct/2020:03:03:55 -0400] "GET /favicon.ico HTTP/1.1" 404 209 "http://20.0.0.21/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
只要访问的ip地址是代理服务器的就可以了!!!
四、ACL访问控制
--------------------------------------squid代理服务器操作,在透明模式之后做--------------------------------------------------------------------------------------
[root@squid ~]# vim /etc/squid.conf ###编辑主配置
acl hostlocal src 192.168.10.99/32 ###写在acl第一个就行,
http_access deny hostlocal ###调用上面的ip地址和名称拒绝访问,写在http格式的第一个就行
[root@squid ~]# service squid reload ###重启
测试:客户端浏览器输入20.0.0.21就显示访问被拒绝了!
五、sarg日志分析
--------------------------------------squid代理服务器操作,在透明模式之后做--------------------------------------------------------------------------------------
将sarg包上传到服务器
[root@squid ~]# tar zxvf sarg-2.3.7.tar.gz -C /opt/ ###解压到opt目录
[root@squid ~]# cd /opt/sarg-2.3.7/
[root@squid sarg-2.3.7]# yum -y install gd gs-devel ###gd图像化处理工具
[root@squid sarg-2.3.7]# mkdir /usr/local/sarg ###在 /usr/local/创建一个sarg工作目录
[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 ###编译安装
[root@squid sarg-2.3.7]# cd /etc/sarg/
[root@squid sarg]# vim sarg.conf ###里面全是注释的,需要什么就找到修改和开启
shift+: 输入set nu,开启行数显示,这样更快定位
7行 access_log /usr/local/squid/var/logs/access.log ###指定访问日志文件
25行 title "Squid User Access Reports" ###网页标题
120行 output_dir /var/www/html/squid-reports ###报告输出目录
178行 user_ip no ###实验用户名显示
206行 exclude_hosts /usr/local/sarg/noreport ###要修改。不计入排序的站点列表文件
184行 topuser_sort_field connect reverse ###要修改。top排序中有连接次数、访问字节、降序排列 升序是normal
257行 overwrite_report no ###同名日志是否覆盖
289行 mail_utility mailq.postfix ###要修改。发送邮件报告命令
434行 charset UTF-8 ###要修改。使用字符集
518行 weekdays 0-6 ###top排行的星期周期
525行 hours 0-23 ###top排行的时间周期
633行 www_document_root /var/www/html ###网页根目录
添加不计入站点文件,添加的域名将不被显示在排序中
[root@squid sarg]# touch /usr/local/sarg/noreport ###刚刚配置里面我们开启了不计入站点功能,现在要创建一个文件
[root@squid sarg]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/ ###让系统识别sarg的命令
[root@squid sarg]# sarg ###开启生成
SARG: Records in file: 1796, reading: 100.00%
SARG: Successful report generated on /var/www/html/squid-reports/2020Oct30-2020Oct31
[root@squid ]# yum -y install httpd ###安装Apache
[root@squid squid-reports]# systemctl start httpd ###开启apache
测试:客户端浏览器输入 http://192.168.10.3/squid-reports/index.html 就能看见sarg的日志统计页面了
- 周期性计划任务执行每天生成报告
-----------------------------------------周期性计划任务执行每天生成报告----------------------------------
每敲下面一次代码就生成一次报告,比较麻烦
[root@squid ~]# sarg -l /usr/local/squid/var/logs/access.log -o /var/www/html/squid-reports/ -z -d $(date -d "1 day ago" +%d/%m/%Y)-$(date +%d/%m/%Y)
-o:输出/var/www/html/squid-reports/目录当中
-d:指定时间和日期,这里是一天的时间,但是后面加上了-$(date +%d/%m/%Y),就是前一天的
-------------------------------------想定时生成报告要用crontab -e计划性周期任务--------------------------------------------
crontab -e 计划性周期任务
0 0 * * * /bin/bash /usr/local/bin/sarg -l /usr/local/squid/var/logs/access.log -o /var/www/html/squid-reports/ -z -d $(date -d "1 day ago" +%d/%m/%Y)-$(date +%d/%m/%Y)
客户端浏览器输入192.168.10.3/squid-reports/index.html ###里面就会多一天的日志文件
六、反向代理(客户端访问代理服务器就能到web服务器的网站上)
--------------------------------------------------反向代理---在web1服务器-------------------------------------------------------------------------------------------------
[root@web httpd]# cd /var/www/html/
[root@web html]# echo "this is test1 web" > index.html ###创建一个网站,网页要区分
测试:浏览器输入:20.0.0.21,就能看见 this is test1 web
-------------------------------------------------squid代理服务器操作----------------------------------------------------------------------------------------------------------
[root@web html]# systemctl start firewalld ###开启防火墙
[root@web html]# iptables -F ###清除一下防火墙规则
[root@web html]# iptables -t nat -F ###清除一下防火墙表缓存
[root@web html]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT ###定义一个重定向转发
-----------------------------------------------web2服务器操作------------------------------------------------------------------------------------------------------------
[root@localhost ~]# hostnamectl set-hostname web2 #设置主机名web2
[root@localhost ~]# su
[root@web2 ~]# systemctl stop firewalld ###关闭防火墙
[root@web2 ~]# setenforce 0 ###关闭核心防护
[root@web2 ~]# yum -y install httpd ###安装apache
[root@web2 ~]# cd /var/www/html/ ###进入到apache网站目录
[root@web2 html]# echo "this is test2 web" > index.html ###创建一个网站
[root@web2 html]# systemctl start httpd ###启动apache
[root@web2 html]# route add -net 192.168.10.0/24 gw 20.0.0.20 ###配置静态路由
-------------------------------------------------squid代理服务器操作-----------------------------------------------------------------------------------------------------------------
[root@squid ~]# vim /etc/squid.conf
http_port 20.0.0.20:80 accel vhost vport ###监听自己ip地址80端口,虚拟主机、虚拟端口。有人访问的时候就执行下面的语句
cache_peer 20.0.0.21 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1 ###重定向到web1服务器80端口,禁止查询、指定增值服务器、轮询机制、最大访问数量30、权重为1、别名web1
cache_peer 20.0.0.22 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web2 ######重定向到web2服务器80端口,禁止查询、指定增值服务器、轮询机制、最大访问数量30、权重为1、别名web2
cache_peer_domain web1 web2 www.yun.com ###如果访问www.yun.com就等于访问我两个节点服务器
[root@squid ~]# service squid restart ###重启一下squid
测试:这个时候两个web服务器节点,通过浏览器输入20.0.0.21或20.0.0.22的网站都能访问各自的网站
----------------------------------------------------------客户端操作配置----------------------------------------------------------------------------------------------------------------------
打开目录:C:\Windows\System32\drivers\etc
编辑hosts文件
20.0.0.20 www.yun.com ###添加一个映射
------------------------------------------------------------------------squid代理服务器操作-----------------------------------------------------------------------------------------------------------------
[root@squid ~]# systemctl stop httpd ###关闭apache
[root@squid ~]# netstat -anpt | grep 80 ###查看一下80端口还有没有服务,还有的话可以kill -9 杀死
[root@squid ~]# service squid start ###启动squid
正在启动 squid....
[root@squid ~]# netstat -anpt | grep 80 ###查看一下squid启动了没
tcp 0 0 20.0.0.20:80 0.0.0.0:* LISTEN 45728/(squid-1)
测试:客户端浏览器输入www.yun.com就会显示this is test1 web,在刷新就是this is test2 web,轮询显示!!!