squid代理
一、缓存代理概述
1.1 Web代理的工作机制
- 缓存网页对象,减少重复请求
- 代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址
- 将获得的网页数据(静态Web元素)保存到缓存中并发送给客户机,以便下次请求相同的数据时快速相应
1.2 代理的基本类型
- 传统代理:适用于lnternet,需明确指定服务端
- 透明代理:客户机不需指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向给代理服务器处理
- 反向代理:如果Squid反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的Web服务器请求资源,然后将请求的应答返回给客户端,同时也将应答缓存(静态)在本地,以供下一个请求者使用
1.3 使用代理的好处
- 提高Web访问速度
- 隐藏客户机的真实IP地址
二、Squid服务搭建
2.1 搭建环境
- squid:192.168.131.10
- apache:192.168.131.11
- 客户端(Win10):192.168.131.5
2.2 安装squid服务
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# yum -y install gcc gcc-c++ make
[root@localhost opt]# cd /opt/
[root@localhost opt]# ls
rh squid-3.5.28.tar.gz
[root@localhost opt]# tar zxvf squid-3.5.28.tar.gz
[root@localhost opt]# cd squid-3.5.28/
[root@localhost 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中又下划线】
> --enable-poll \ 【使用poll模式】
> --enable-gnuregex 【使用GUN正则表达式】
./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
[root@localhost squid-3.5.28]# make -j2 && make install
【创建程序用户squid,保证系统安全性】
[root@localhost squid-3.5.28]# useradd -M -s /sbin/nologin squid
【创建软链接到路径环境变量便于系统识别squid】
[root@localhost squid-3.5.28]# ln -s /usr/local/squid/sbin/ * /usr/local/bin/
【为/usr/local/squid/var/目录递归指定属主属组】
[root@localhost squid-3.5.28]# chown -R squid.squid /usr/local/squid/var/
【该配置文件的运行机制是自上而下。即匹配之后,自此行之下不再进行匹配】
[root@localhost bin]# vim /etc/squid.conf
【55行以上是访问权限允许的配置,以下是权限拒绝的操作,如果不需要配置权限拒绝的话,可以直接注释配置“允许所有访问”】
55 # And finally deny all other access to this proxy
【因为机制是自上而下,所以需在deny之前。允许放通所有,即允许所有客户机使用代理服务】
56 http_access allow all
57 http_access deny all
61 cache_effective_user squid 【添加指定程序用户,用来设置初始化,运行时缓存的账号,不添加启动不成功】
62 cache_effective_group squid 【添加指定账户基本组】
[root@localhost bin]# squid -k parse 【检测配置文件语法是否正确】
[root@localhost bin]# squid -z 【初始化缓存目录】
[root@localhost bin]# squid 【启动服务】
[root@localhost bin]# netstat -napt | grep squid
tcp6 0 0 :::3128 :::* LISTEN 57070/(squid-1)
[root@localhost bin]# cd /etc/init.d/
[root@localhost init.d]# vim squid 【编写squid服务脚本】
#!/bin/bash
#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@localhost init.d]# chmod +x /etc/init.d/squid 【给予该服务启动脚本可执行权限】
[root@localhost init.d]# chkconfig --add squid 【将该服务加入chkconfig(系统服务管理)管理】
[root@localhost init.d]# chkconfig --level 35 squid on 【可以在字符界面(3)和视图界面(5)中自启动】
[root@localhost init.d]# chkconfig --list squid 【查看能在几个运行级别中自启动】
注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。
要列出 systemd 服务,请执行 'systemctl list-unit-files'。
查看在具体 target 启用的服务请执行
'systemctl list-dependencies [target]'。
【2、3、4、5是脚本中默认的自启动级别】
squid 0:关 1:关 2:开 3:开 4:开 5:开 6:关
2.3 传统代理
【在squid配置文件的63行插入以下3行】
[root@localhost init.d]# vim /etc/squid.conf
【指定缓存功能所使用的内存空间大小,便于保持访问教频繁的Web对象,容量最好为4的倍数,单位为MB。建议设为物理内存的四分之一】
63 cache_mem 64 MB
【允许用户下载的最大文件大小,以字节为单位。默认设置0表示不进行限制】
64 reply_body_max_size 10 MB
【允许保存到缓存空间的最大对象大小,以KB为单位,超过大小限制的文件将不被缓存,而是直接转发给用户】
65 maximum_object_size 4096 KB
- 重启服务并查看
[root@localhost init.d]# service squid restart
正在关闭 squid...
正在启动 squid....
[root@localhost init.d]# netstat -natp | grep squid
tcp6 0 0 :::3128 :::* LISTEN 97458/(squid-1)
- 生产环境中还需要修改防火墙规则
[root@localhost init.d]# iptables -F
[root@localhost init.d]# setenforce 0
【在INPOT链开头插入允许tcp端口3128的数据通过的策略】
[root@localhost init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
[root@localhost init.d]# service squid reload 【重载服务】
[root@localhost init.d]# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:squid
2.4 httpd配置
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# netstat -natp | grep 80
tcp6 0 0 :::80 :::* LISTEN 44106/httpd
2.5 开启代理并观察日志
2.6 透明代理服务器构建
- Squid-Server :ens33:192.168.13110 、 ens36:192.168.100.10
- Web : 192.168.100.100
- 客户端 :192.168.131.100
- 配置双网卡
[root@localhost init.d]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens36
[root@localhost init.d]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.131.10
NETMASK=255.255.255.0
#GATEWAY=192.168.131.2 【将网关和DNS注释掉,此时本机相当于网关服务器】
#DNS1=192.168.131.2
[root@localhost init.d]# vim /etc/sysconfig/network-scripts/ifcfg-ens36
NAME=ens36 【名称ens36】
#UUID=8b83f99f-7a65-42d7-9510-5b214a8a20de 【因为是直接复制ens33,所以这里的UUID需注释】
DEVICE=ens36 【设备ens36】
ONBOOT=yes
IPADDR=192.168.100.10 【ens36IP地址】
NETMASK=255.255.255.0
#GATEWAY=192.168.100.2 【网关注释】
#DNS1=192.168.100.2 【DNS注释】
[root@localhost init.d]# systemctl restart network
[root@localhost init.d]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.131.10 netmask 255.255.255.0 broadcast 192.168.131.255
inet6 fe80::a642:fac7:7adb:8efb prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:49:74:c2 txqueuelen 1000 (Ethernet)
RX packets 25556 bytes 14832869 (14.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22490 bytes 14555560 (13.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.10 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::ee9:986a:f26c:46e5 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:49:74:cc txqueuelen 1000 (Ethernet)
RX packets 369 bytes 43266 (42.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 51 bytes 7436 (7.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost /]# vim /etc/sysctl.conf 【在此配置文件最后一行添加,开启路由转发】
net.ipv4.ip_forward=1
[root@localhost /]# sysctl -p 【加载内核配置文件】
net.ipv4.ip_forward = 1
【添加静态路由。gw:指定下一跳路由器的 IP 地址】
[root@localhost /]# route add -net 192.168.100.0/24 gw 192.168.131.10
【将配置文件的第60行进行修改,添加提供内网服务的ip地址并开启透明模式的支持】
[root@localhost /]# vim /etc/squid.conf
60 http_port 192.168.131.10:3128 transparent
[root@localhost /]# service squid reload 【重载服务】
[root@localhost /]# iptables -F
[root@localhost /]# iptables -t nat -F
【添加防火墙规则(将100网段:80(HTTP)/443(HTTPS)端口的流量重定向到3128端口)】
[root@localhost /]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.131.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@localhost /]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.131.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
【如果重启的话需要再配置以下规则】
[root@localhost /]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
- Web服务器
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.100.100
NETMASK=255.255.255.0
GATEWAY=192.168.100.2
[root@localhost ~]# systemctl restart network
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.100 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::d6b9:3f4f:af20:4b7e prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:a2:07:46 txqueuelen 1000 (Ethernet)
RX packets 56 bytes 6858 (6.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 93 bytes 10530 (10.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# mount /dev/cdrom /mnt/
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl restart httpd.service
2.7 Windows关闭代理测试
三、ACL访问控制
- 在配置文件squid.conf中,ACL访问控制通过以下两个步骤来实现
- 1.使用acl配置项定义需要控制的条件
- 2.通过http_access配置项对已定义的列表做“允许”或“拒绝”访问的控制
- 每行ACL配置可以定义一条访问控制列表,格式如下
- 格式:acl 列表名称 列表类型 列表内容
- 列表名称:名称是自定义,相当于给ACL起个名字(类似于Shell脚本变量名)
- 列表类型:必须使用squid预定义的值,对应不同类别的控制条件
- 列表内容:是要控制的具体对象,不同类型的列表所对应的内容也不一样,可以有多个值(以空格分隔,相当于“或”的关系)
3.1 方式一
- ACL控制分析
acl localhost src 192.168.131.10/32 【基于源地址为】
acl MYLAN src 192.168.131.0/24 【基于客户机网段】
acl destionhost dst 192.168.131.20/32 【基于目标地址为】
acl MC20 maxconn 30 【基于最大并发连接】
acl PORT port 33 【基于目标端口】
acl DMBLOCK dstdomain .qq.com 【基于目标域,匹配域内所有站点】
【url正则表达式的结构,基于指定的协议进行过滤^rtsp(协议)的控制】
acl BURL url_regex -i ^rtsp:// ^emule:// 【以 rtsp://、emule:// 开头的 URL,-i表示忽略大小写】
【基于访问文件的末尾(格式)】
acl PURL urlpath_regex -i \.mp3$ \.mp4$ \.rmvb$ 【以.mp3、.mp4、.rmvb 结尾的URL路径】
【基于访问时间控制】
acl WORKTIME time MTWHF 0:30-7:30 【时间为周一至周五 0:30~7:30,“MTWHF”为每个星期的英文首字母】
【以上控制是否允许则取决于以下的allow/deny】
[root@localhost /]# vim /etc/squid.conf
8 acl host src 192.168.131.100/24 【IP地址为192.168.131.100.10/24的主机】
32 http_access deny host 【拒绝目标主机访问】
- Win10进行访问测试
3.2 方式二
- squid:192.168.131.10
- Web1:192.168.131.13
- Web2:192.168.131.14
[root@localhost /]# vim /dest.list 【启用对象列表管理】
192.168.131.13 【目标IP】
【调用指定文件中的列表内容】
【如果调用的列表是文件形式,则需要先把文件定义给列表】
【acl 将文件定义的列表(名) dst(目标地址) 定义目标地址的文件路径(绝对路径)】
[root@localhost /]# vim /etc/squid.conf
8 acl destionhost dst "/dest.list"
32 http_access deny destionhost 【拒绝列表】
【如果是拒绝列表,则需要放在http_access allow all前面(上一行)】
[root@localhost /]# service squid restart
- Web1和Web2
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# yum install -y httpd
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=192.168.131.10 【将网卡指向squid服务器】
- 清理缓存并设置代理后进行访问验证
四、squid日志分析
- Sarg(Squid Analysis Report Generator)是一款Squid日志分析工具,采用HTML格式,详细列出每一位用户访问Internet的站点信息、时间占用信息、排名、连接次数、访问量等等
4.1 安装图像处理软件包
[root@localhost opt]# vim /etc/squid.conf 【需把之前配置的deny部分删除】
[root@localhost opt]# yum install -y pcre-devel gd gd-devel
[root@localhost opt]# vim /etc/squid.conf
[root@localhost opt]# mkdir /usr/local/sarg
[root@localhost opt]# cd /opt/
[root@localhost opt]# ls
rh sarg-2.3.7.tar.gz squid-3.5.28 squid-3.5.28.tar.gz
[root@localhost opt]# tar zxvf sarg-2.3.7.tar.gz
[root@localhost sarg-2.3.7]# ./configure --prefix=/usr/local/sarg \
> --sysconfdir=/etc/sarg \ 【配置文件目录,默认是/usr/local/etc】
> --enable-extraprotection 【额外安全防护】
[root@localhost sarg-2.3.7]# make && make install
[root@localhost 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排行的星期周期】
525 hours 0-23 【取消注释;top排行的时间周期】
633 www_document_root /var/www/html 【取消注释;指定网页根目录】
4.2 添加不计入站点文件,并运行
【添加不计入站点文件,添加的域名将不被显示在排序中】
[root@localhost sarg-2.3.7]# touch /usr/local/sarg/noreport
[root@localhost sarg-2.3.7]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/
[root@localhost sarg-2.3.7]# sarg 【启动一次记录】
SARG: 纪录在文件: 128, reading: 100.00%
SARG: 成功的生成报告在 /var/www/html/sarg/2021May09-2021May09
4.3 验证
[root@localhost sarg-2.3.7]# yum install httpd -y
[root@localhost sarg-2.3.7]# systemctl start httpd
- 浏览器访问 http://192.168.131.10/sarg ,查看sarg报告网页sarg
4.4 添加计划任务,执行每天生成报告
[root@localhost 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
【TODAY=$(date +%d/%m/%Y):变量TODA日期+日/月/年】
【YESTERDAY=$(date -d "1 day ago" +%d/%m/%Y) :变量YESTERDAY前一天日期+日/月/年】
【-o:输出到报告目录中】
【-l:导入缓存日志文件】
【-z:进程消息】
【-d:日期消息】
【exit 0:退出返回值0】
[root@localhost sarg-2.3.7]# chmod +x /usr/local/sarg/report.sh
[root@localhost sarg-2.3.7]# crontab -e
no crontab for root - using an empty one
0 30 * * * /usr/local/sarg/report.sh
五、Squid 反向代理
- Squid 反向代理工作机制
- 缓存网页对象,减少重复请求
- 将互联网请求轮训或按权重分配到内网Web服务器
- 代理用户请求,避免用户直接访问Web服务器,提高安全
- Squid-Server :192.168.131.10
- Web1:192.168.131.13
- Web2:192.168.131.14
- 客户机(Win10):192.168.131.7
【在第60行下面进行插入】
[root@localhost sarg-2.3.7]# vim /etc/squid.conf
60 # Squid normally listens to port 3128
61 http_port 192.168.131.10:80 accel vhost vport
62 cache_peer 192.168.131.13 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
63 cache_peer 192.168.131.14 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web2
64 cache_peer_domain web1 web2 www.qz.com
【表示对www.qz.com的请求,squid向192.168.131.13和192.168.131.14的80端口发出请求】
【http_port 80 accel vhost vport:squid从一个缓存变成了一个Web服务器反向代理加速模式,这个时候squid在80端口监听请求,
同时和web server的请求端口(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 :设置别名】
[root@localhost init.d]# systemctl stop httpd 【因为httpd会占用80端口,所以必须关闭squid服务器中的htppd服务】
[root@localhost init.d]# systemctl restart squid
- Web1、Web2
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# echo "this is Web1" >> /var/www/html/index.html
[root@localhost ~]# echo "this is Web2" >> /var/www/html/index.html 【Web2】
- 客户机Win10的域名映射配置
- hosts文件修改后无法保存
- 开启代理服务器(地址:Squid服务器IP地址,端口:80)
- 浏览器访问 http://www.qz.com
六、总结
6.1 squid
- 代理的好处
- 提高Web访问速度
- 隐藏客户机的真实IP地址
- squid代理功能
- 做前置的Web缓存,加快用户访问Web的速度代理内网用户访问互联网资源设置访问控制策略,控制用户的上网行为。主要支持http、ftp等应用协议
- 传统代理:适用于lnternet,需明确指定服务端
- 透明代理:客户机不需指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向给代理服务器处理
- 反向代理:如果Squid反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的Web服务器请求资源,然后将请求的应答返回给客户端,同时也将应答缓存(静态)在本地,以供下一个请求者使用
6.2 squid与SNAT和DNAT的区别
- 1. SNAT和DNAT
- 网络层次:网络层
局域网用户访问外网走snat模式,同一个数据包,改变数据包头部的来源地址,再把数据包发到internet。 - 作用:内网用户上外网(SNAT)和内网服务发布到公网(DNAT)
- 网络层次:网络层
- 2. 代理服务器模式
- 网络层次:应用层
不改变数据包头信息,把数据包代理给internet的服务器,基于应用层的过滤。 - 作用:缓存页面,加速访问,ACL资源访问控制
- 网络层次:应用层