理论+实验:Squid代理服务器应用(传统代理、透明代理、squid的ACL使用、squid的日志分析工具sarg、squid的反向代理)

一、缓存代理概述

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,轮询显示!!!
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值