1小时带你吃透squid代理服务器!!!
Posted 28线不知名云架构师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1小时带你吃透squid代理服务器!!!相关的知识,希望对你有一定的参考价值。
一、squid的简单介绍
1.1、squid的概念
squid是一种用来缓存Internet数据的软件。接受来自人们需要下载的目标(object)的请求并适当的处理这些请求。也就是说,如果一个人想下载一web界面,他请求squid为他取得这个页面。squid随之连接到远程服务器并向这个页面发出请求。然后,squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时, squid可以简单的从磁盘中读到它,那样数据会立即传输到客户机上。
1.2、squid代理的作用
- 通过缓存的方式为用户提供Web访问加速
- 对用户的Web访问进行过滤控制
1.3、工作流程
当代理服务器中有客户端需要的数据时:
a. 客户端向代理服务器发送数据请求;
b. 代理服务器检查自己的数据缓存;
c. 代理服务器在缓存中找到了用户想要的数据,取出数据;
d. 代理服务器将从缓存中取得的数据返回给客户端。
当代理服务器中没有客户端需要的数据时:
-
客户端向代理服务器发送数据请求;
-
代理服务器检查自己的数据缓存;
-
代理服务器在缓存中没有找到用户想要的数据;
-
代理服务器向Internet 上的远端服务器发送数据请求;
-
远端服务器响应,返回相应的数据;
-
代理服务器取得远端服务器的数据,返回给客户端,并保留一份到自己的数据缓存中。
Squid代理服务器工作在TCP/IP应用层
目录
1.4、Squid各种代理的定义
正向代理:
标准的代理缓冲服务器
一个标准的代理缓冲服务被用于缓存静态的网页到本地网络上的一台主机上(即代理服务器)。当被缓存的页面被第二次访问的时候,浏览器将直接从本地代理服务器那里获取请求数据而不再向原web站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。但是,要想实现这种方式,必须在每一个内部主机的浏览器上明确指名代理服务器的IP地址和端口号。客户端上网时,每次都把请求发送给代理服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据。如果在本地缓冲区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓冲,然后将文件发送给客户端浏览器。
透明代理缓冲服务器
透明代理缓冲服务器和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。对于linux操作系统来说,透明代理使用Iptables或者Ipchains实现。因此不需要对浏览器作任何设置,所以,透明代理对于ISP(Internet服务器提供商)特别有用。
反向代理:
反向代理缓冲器
反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。它位于WEB服务器和Internet之间,处理所有对WEB服务器的请求,组织了WEB服务器和Internet的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发给用户。这种方式通过降低了WEB服务器的请求数从而降低了WEB服务器的负载。
1.5、正向代理、反向代理的区别
1.5.1、概念区别:
- 正向代理:对于原始服务器而言,就是客户端的代言人
- 反向代理:对于客户端而言,就像是原始服务器
1.5.2、用途区别:
- 正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。
- 反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。
1.5.3、安全性区别:
- 正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。
- 反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
1.6、squid代理的优点
- 提高Web访问速度:将获得的网页数据(静态Web元素)保存到缓存中并发送给客户机,以便下次请求相同的数据时快速响应
- 隐藏客户机的真实IP地址:代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址。
二、squid代理服务器的配置
2.1、实验环境
一台Squid代理服务器:192.168.152.130
两台Web服务器:192.168.152.129
192.168.152.128
一台win10客户机:192.168.152.52
2.2、 Squid代理服务器配置
[root@server ~]# hostnamectl set-hostname squid
[root@server ~]# su
[root@squid ~]# yum install -y gcc gcc-c++ make
[root@squid ~]# cd /opt
[root@squid opt]# ls
rh squid-3.5.27.tar.gz
[root@squid opt]# tar xvf squid-3.5.27.tar.gz
[root@squid opt]# cd squid-3.5.27/
[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
优化squid管理:
[root@squid squid-3.5.27]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
[root@squid squid-3.5.27]# useradd -M -s /sbin/nologin squid
[root@squid squid-3.5.27]# chown -R squid:squid /usr/local/squid/var/
修改配置文件:
[root@squid squid-3.5.27]# vim /etc/squid.conf
52 http_access allow localnet
53 http_access allow localhost
54
55 # And finally deny all other access to this proxy
56 http_access allow all
#放在http_access deny all之前,允许任意客户机使用代理服务,控制规则自上而下匹配
57 http_access deny all
58
59 # Squid normally listens to port 3128
60 http_port 3128
#用来指定代理服务监听的地址和端口(默认的端口号为3128)
61 cache_effective_user squid
#添加,指定程序用户,用来设置初始化、运行时缓存的账号,否则启动不成功
62 cache_effective_group squid
#添加,指定账号基本组
63
64 # Uncomment and adjust the following to add a disk cache directory.
65 #cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256
66
67 # Leave coredumps in the first cache dir
68 coredump_dir /usr/local/squid/var/cache/squid
#指定缓存文件目录
编写squid服务脚本:
[root@squid squid-3.5.27]# cd
[root@squid ~]# vim /etc/init.d/squid
#!/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
开启squid服务:
[root@squid ~]# chmod +x /etc/init.d/squid
[root@squid ~]# chkconfig --add squid
#加入系统服务
[root@squid ~]# chkconfig squid on
#指定squid在各等级为on
[root@squid ~]# squid -k parse
#检查配置文件
[root@squid ~]# squid -k rec
#重新加载配置文件;rec:reconfigure
[root@squid ~]# squid -zX
#初始化缓存目录
[root@squid ~]# squid
#开启服务
[root@squid ~]# netstat -antp | grep squid
tcp6 0 0 :::3128 :::* LISTEN 58101/(squid-1)
[root@squid ~]# systemctl status squid
● squid.service - SYSV: Squid - Internet Object Cache
Loaded: loaded (/etc/rc.d/init.d/squid; bad; vendor preset: disabled)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)
[root@squid ~]# service squid restart
正在关闭Squid...
正在启动Squid...
2.3、web服务器配置
web1服务器:
[root@web1 ~]# yum install -y httpd
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# netstat -antp | grep httpd
tcp6 0 0 :::80 :::* LISTEN 14598/httpd
web2服务器:
[root@web2 ~]# yum install -y httpd
[root@web2 ~]# systemctl start httpd
[root@web2 ~]# netstat -antp | grep httpd
tcp6 0 0 :::80 :::* LISTEN 75610/httpd
三、搭建传统代理
squid服务器配置:
修改配置文件,添加以下内容:
[root@squid ~]# vim /etc/squid.conf
63 cache_mem 64 MB
#指定缓存功能所使用的内存空间大小,便于保存访问较频繁的WEB对象
#容量最好为4的倍数,单位为MB,建议设为物理内存的1/4
64 reply_body_max_size 10 MB
#允许用户下载的最大文件大小,以字节为单位,当下载超过指定大小的Web对象时
#浏览器的报错页面中会出现“请求或访问太大”的提示默认设置0表示不进行限制
65 maximum_object_size 4096 KB
#允许保存到缓存空间的最大对象大小,以KB为单位
#超过大小限制的文件将不被缓存,而是直接转发给用户
重启服务,设置防火墙规则:
[root@squid ~]# service squid restart
正在关闭Squid...
正在启动Squid...
[root@squid ~]# iptables -F
#清除规则
[root@squid ~]# systemctl restart firewalld.service
[root@squid ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
#允许来自tcp3128的流量进入
[root@squid ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:squid
......以下省略
[root@squid ~]# netstat -antp | grep squid
tcp6 0 0 :::3128 :::* LISTEN 58303/(squid-1)
web服务器开启服务,查看端口是否都开启了:
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# netstat -antp | grep httpd
tcp6 0 0 :::80 :::* LISTEN 14598/httpd
Windows10客户机设置:
win10访问客户机129地址
这时候可以看到客户端访问web页面 ,从web服务器上查看日志,发现没有客户端地址,只有squid服务器地址
四、搭建透明代理
4.1、环境配置
结合上一个实验后面增加一部分:在squid服务器增加一块网卡
一台Squid代理服务器:192.168.152.130
192.168.52.2(win10的网关,不用设置网关,DNS)
两台Web服务器:192.168.152.129
192.168.152.128
一台win10客户机:192.168.52.52(网关192.168.52.2)
4.2、squid服务器网卡设置
[root@squid ~]# cd /etc/sysconfig/network-scripts/
[root@squid network-scripts]# ls
[root@squid network-scripts]# cp ifcfg-ens33 ifcfg-ens37
[root@squid network-scripts]# vim ifcfg-ens37
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=192.168.52.10
NETMASK=255.255.255.0
[root@squid network-scripts]# systemctl restart network
[root@squid network-scripts]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.152.130 netmask 255.255.255.0 broadcast 192.168.152.255
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.52.10 netmask 255.255.255.0 broadcast 192.168.52.255
4.3、squid服务器修改配置
[root@squid ~]# vim /etc/squid.conf
59 # Squid normally listens to port 3128
60 http_port 192.168.52.10:3128 transparent
#配置3128端口指向网卡ens37, 添加transparent,设置透明模式
61 cache_effective_user squid
62 cache_effective_group squid
[root@squid ~]# service squid restart
正在关闭Squid...
正在启动Squid...
[root@squid ~]# netstat -antp | grep squid
tcp 0 0 192.168.52.10:3128 0.0.0.0:* LISTEN 60574/(squid-1)
squid服务器添加路由转发:
[root@squid ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@squid ~]# sysctl -p
net.ipv4.ip_forward = 1
添加防火墙规则:
[root@squid ~]# iptables -F
[root@squid ~]# iptables -t nat -F
[root@squid ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
#允许端口3128进入
[root@squid ~]# iptables -t nat -I PREROUTING -i ens37 -s 192.168.52.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@squid ~]# iptables -t nat -I PREROUTING -i ens37 -s 192.168.52.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
#添加防火墙规则(将来源为52网段:80/443端口的流量重定向到3128端口)
[root@squid ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 六 2021-07-31 14:43:24 CST; 2h 49min ago
Docs: man:firewalld(1)
4.4、web服务器修改配置
[root@web1 ~]# netstat -antp | grep httpd
tcp6 0 0 :::80 :::* LISTEN 14598/httpd
[root@web1 ~]# route add -net 192.168.52.0/24 gw 192.168.152.130
4.5、验证
客户端首先关闭代理服务,设置地址,再清除浏览器缓存,访问Web1IP地址会发现依然能访问,证明透明代理不需要指定Squid服务端,这里插播一则广告:切记更改好win10的网络模式
五、ACL访问控制
在配置文件 squid.conf 中,ACL 访问控制通过以下两个步骤来实现:
- 使用 acl 配置项定义需要控制的条件;
- 通过 http_access 配置项对已定义的列表做“允许”或“拒绝”访问的控制
5.1、定义访问控制列表
格式:
acl 列表名称 列表类型 列表内容
列表名称:名称自定义,相当于给acl起个名字
列表类型:必须使用squid预定义的值,对应不同类别的控制条件
列表内容:是要控制的具体对象,不同类型的列表所对应的内容也不一样,可以有多个值(以空格为分隔,为“或”的关系)
例如:添加一条记录,并在下面对它进行访问拒绝
进入配置文件:
[root@squid ~]# vim /etc/squid.conf
7 # should be allowed
8 acl host src 192.168.52.52/24 #插入一条52网段的记录
31 # Deny requests to certain unsafe ports
32 http_access deny host #调用52网段的地址被拒绝
[root@squid ~]# service squid restart
正在关闭Squid...
正在启动Squid...
[root@squid ~]# netstat -antp | grep squid
tcp 0 0 192.168.52.10:3128 0.0.0.0:* LISTEN 62571/(squid-1)
[root@squid ~]#
5.2、测试
在web1上访问一下是否可以成功,很显然结果是被拒绝的,访问不了
六、日志分析
- sarg(Squid Analysis Report Generator),是一款squid日志分析工具,采用html格式,详细列出每一位用户访问Internet的站点信息、时间占用信息、排名、连接次数、访问量等
6.1、安装Sarg日志分析工具
#安装图像处理软件包
[root@squid ~]# yum install -y gd gd-devel pcre-devel
[root@squid ~]# cd /opt
[root@squid opt]# ls
rh sarg-2.3.7.tar.gz squid-3.5.27 squid-3.5.27.tar.gz
[root@squid opt]# tar xf sarg-2.3.7.tar.gz
[root@squid opt]# cd sarg-2.3.7/
[root@localhost sarg-2.3.7]# ./configure --prefix=/usr/local/sarg
--sysconfdir=/etc/sarg \\ #配置文件目录,默认是/usr/loca/etc
--eenable-xtraprotection #额外安全防护
[root@squid sarg-2.3.7]# make && make install
6.2、修改sarg配置文件
[root@squid sarg-2.3.7]# vim /etc/sarg/sarg.conf
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排行的星期周期
>>525行--取消注释
hours 0-23 #top排行的时间周期
>>633行--取消注释
www_document_root /var/www/html #指定网页根目录
[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: 纪录在文件: 32110, reading: 100.00%
SARG: 成功的生成报告在 /var/www/html/sarg/2021Jul31-2021Jul31
[root@squid sarg-2.3.7]#
6.3、下载httpd
[root@squid sarg-2.3.7]# yum install httpd -y
[root@squid sarg-2.3.7]# systemctl start httpd
[root@squid sarg-2.3.7]# netstat -antp | grep 80
tcp 0 0 192.168.152.130:51224 223.111.25.238:80 TIME_WAIT -
tcp 0 0 192.168.152.130:52866 36.156.96.239:80 TIME_WAIT -
tcp6 0 0 :::80 :::* LISTEN 65014/httpd
[root@squid sarg-2.3.7]#
6.4、在squid服务器上测试一下是否成功
6.5、优化-添加定时报告
[root@squid sarg-2.3.7]# vim /usr/local/sarg/report.sh
#!/bin/bash
#Get current date
TODAY=$(date +%d/%m/%Y)
#Get one week 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
no crontab for root - using an empty one
crontab: installing new crontab
[root@squid sarg-2.3.7]# crontab -l
0 0 * * * /usr/local/sarg/report.sh
[root@squid sarg-2.3.7]#
七、搭建反向代理
如果 Squid 反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的 Web 服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用
7.1、工作机制
- 缓存网页对象,减少重复请求
- 将互联网请求轮训或按权重分配到内网Web服务器
- 代理用户请求,避免用户直接访问Web服务器,提高安全
7.2、具体配置
7.2.1、实验环境
一台Squid代理服务器:192.168.152.130
两台Web服务器:192.168.152.129
192.168.152.128
一台client客户机:192.168.152.127
7.2.2、配置过程
squid服务器:
开启防火墙、本地关闭HTTPD:
[root@squid ~]# systemctl start firewalld
[root@squid ~]# systemctl stop httpd
[root@squid ~]# iptables -F
[root@squid ~]# iptables -t nat -F
[root@squid ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
[root@squid ~]# service squid reload
2021/07/31 19:11:22| aclIpParseIpData: WARNING: Netmask masks away part of the specified IP in '192.168.52.52/24'
[root@squid ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:squid
修改配置文件:
[root@squid ~]#
[root@squid ~]# vim /etc/squid.conf
32 #http_access deny host #调用52网段的地址被拒绝
62 #http_port 192.168.52.10:3128 transparent
63 http_port 192.168.152.130:80 accel vhost vport
#添加新的地址端口匹配
64 cache_peer 192.168.152.129 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 na me=web1
65 cache_peer 192.168.152.128 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 na me=web2
66 cache_peer_domain web1 web2 www.fairy.com
#添加域名匹配
#表示对www.fairy.com的请求,squid向192.168.152.129和192.168.152.128的80端口发出请求
7.2.3、 客户机的域名映射配置
修改C:\\Windows\\System32\\drivers\\etc\\hosts 文件
192.168.152.130 www.fairy.com
[root@web1 ~]# echo "www.aaa.com" > /var/www/html/index.html
[root@web2 ~]# echo "www.bbb.com" > /var/www/html/index.html
7.2.4、验证
以上是关于1小时带你吃透squid代理服务器!!!的主要内容,如果未能解决你的问题,请参考以下文章