squid正向代理(传统代理与透明代理)的配置、ACL访问控制与日志分析工具sarg的使用
一:squid代理服务概述
Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。
- 工作机制
Squid是一种用来缓冲Internet数据的软件。它是这样实现其功能的,接受来自人们需要下载的目标(object)的请求并适当地处理这些请求。也就是说,如果一个人想下载一web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器(比如:www.163.com)并向这个页面发出请求。然后,Squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时,Squid可以简单地从磁盘中读到它,那样数据迅即就会传输到客户机上。 - 正向代理的基本类型
传统代理:普通的代理服务,适用于Internet,需明确指定服务端
透明代理:客户机不需要指定代理服务器的地址和端口,是通过默认路由,防火墙将web重定向给代理 - 使用代理的好处
提高web访问速度
隐藏客户机的真实IP地址
二:传统代理的配置
2.1:实验环境介绍
VMware软件
一台centos7虚拟机作为squid服务器,IP地址为:192.168.209.145
一台centos7虚拟机作为web服务器,IP地址为:192.168.209.146
一台win10虚拟机作为client测试机,IP地址为:192.168.209.128
2.2:实验步骤
2.2.1:在squid服务器上安装squid服务
[root@squid ~]# yum install gcc gcc-c++ -y
[root@squid ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg squid-3.4.6.tar.gz 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@squid ~]# tar zxvf squid-3.4.6.tar.gz
[root@squid ~]# cd squid-3.4.6/
[root@squid squid-3.4.6]# ./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" \ //设置报错语言
> --enable-underscore \
> --enable-poll \ //IO流事件模型
> --enable-gnuregex //支持正则
[root@squid squid-3.4.6]# make && make install
2.2.2:优化执行路径
[root@squid squid-3.4.6]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
2.2.3:更改权限
[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/
2.2.4:修改配置文件、添加缓存用户与组
[root@squid squid-3.4.6]# vim /etc/squid.conf
...
# Squid normally listens to port 3128
http_port 3128
cache_effective_user squid //缓存用户
cache_effective_group squid //缓存组
...
2.2.5:检查配置文件的语法
[root@squid squid-3.4.6]# squid -k parse
2.2.6:初始化缓存目录
[root@squid squid-3.4.6]# squid -z
2.2.7:启动squid服务
[root@squid squid-3.4.6]# squid
2.2.8:编写squid的启动脚本
[root@squid squid-3.4.6]# vim /etc/init.d/squid
#!/bin/bash
#chkconfig: 2345 90 25
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@squid squid-3.4.6]# chmod +x /etc/init.d/squid
[root@squid squid-3.4.6]# chkconfig --add squid
2.2.9:配置传统代理服务
[root@squid ~]# vim /etc/squid.conf
http_port 3128
cache_effective_user squid
cache_effective_group squid
cache_mem 64 MB '//自定义缓存空间大小,容量最好为4的倍数'
reply_body_max_size 10 MB '//允许下载最大文件大小,以字节为单位,默认设置0表示不进行限制'
maximum_object_size 4096 KB '//允许保存到缓存空间的最大对象的大小,以KB为单位,超过限制不会缓存,直接转到web端'
[root@squid init.d]# iptables -F '//清空防火墙表内容'
[root@squid init.d]# iptables -L '//查看防火墙表内容'
[root@squid init.d]# setenforce 0 '//关闭防火墙增强型功能'
[root@squid init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT '//新增规则,允许3128端口'
[root@squid init.d]# service squid reload '//重载服务'
2.2.10:客户端配置
需开启游览器的代理功能
2.2.11:在web服务器上安装http服务
[root@web ~]# yum install httpd -y '//安装httpd服务'
[root@web ~]# systemctl stop firewalld.service '//关闭防火墙'
[root@web ~]# setenforce 0
[root@web ~]# systemctl start httpd.service '//开启httpd服务'
2.2.12:客户端访问web站点,查看web服务器的访问日志
[root@web ~]# cd /var/log/httpd/
[root@localhost httpd]# ls
access_log error_log
[root@localhost httpd]# cat access_log
...
192.168.209.145 - - [09/Sep/2020:10:15:46 +0800] "GET / HTTP/1.1" 403 4897 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"
...
源地址显示的是代理服务器的地址,配置成功!
三:透明代理的配置
3.1:实验环境介绍
透明代理提供的服务功能与传统代理是一致的,但是其“透明”的实现依赖于默认路由和防火墙的重定向策略,因此更适用于局域网主机服务,而不适合为Internet中的客户机提供服务。
在Linux网关上,构建Squid为客户机访问Internet提供代理服务
在所有的局域网主机上,只需正确设置IP地址、默认网关,不需要手动指定代理服务器的地址、端口等信息
基于传统代理的基础上,在squid服务器上增加一块网卡,作为网关
3.2:实验拓扑
3.3:实验步骤
3.3.1:squid代理服务上增加一块网卡
添加一块网卡(ens36),选择仅主机模式,IP:192.168.10.1
[root@squid network-scripts]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.209.145 netmask 255.255.255.0 broadcast 192.168.209.255
inet6 fe80::a426:25c8:ffe1:7352 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:f4:5d:9b txqueuelen 1000 (Ethernet)
RX packets 332726 bytes 468459295 (446.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 177525 bytes 30670285 (29.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.1 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::1857:8c72:c551:a9a0 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:f4:5d:a5 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 70 bytes 11020 (10.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3.3.2:squid服务器开启路由转发功能
[root@squid network-scripts]# vim /etc/sysctl.conf '//开启路由转发功能'
net.ipv4.ip_forward=1 '//末行添加,注意#号'
[root@squid network-scripts]# sysctl -p '//加载sysctl.conf'
net.ipv4.ip_forward = 1
3.3.4:透明代理配置
[root@squid network-scripts]# vim /etc/squid.conf
http_port 192.168.10.1:3128 transparent '//仅修改此行,开启透明代理即可'
cache_effective_user squid
cache_effective_group squid
3.3.5:设置防火墙规则
[root@squid network-scripts]# iptables -F '//清空表内容'
[root@squid network-scripts]# iptables -t nat -F '//清空nat表内容'
[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 '//定义规则入口ens36网卡,http协议80端口重定向到3128端口'
[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 '//定义规则入口ens36网卡,https协议443端口重定向到3128端口'
[root@squid network-scripts]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT '//新增规则,允许3128端口'
3.3.6:客户端验证
关闭客户端游览器的代理功能,直接访问web站点
3.3.7:查看web站点的访问日志
[root@web httpd]# cat access_log
...
192.168.209.145 - - [09/Sep/2020:12:19:32 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363"
...
同样源地址为squid代理服务器的地址!
四:ACL访问控制
4.1:acl访问控制方式
根据源地址、目标URL、文件类型等定义列表
语法结构:
acl 列表名称 列表类型 列表内容
针对已定义的acl列表进行限制
语法结构:
http_access allow或deny 列表名称1 列表名称2 …
4.2:acl访问控制类型
常用的acl列表类型
- src:源地址
- dst:目标地址
- port:端口
- dstdomain:目标域
- time:访问时间 MTWHFAC代表周一至周日
- maxconn:最大并发连接
- url_regex:目标URL地址
- Urlpath_regex:整个目标URL路径
4.3:acl规则的优先级
- 一个用户访问代理服务器时,squid会顺序匹配squid中定义的所有规则列表,一旦匹配成功,立即停止匹配
- 所有规则都不匹配时,squid会使用与最后一条相反的规则
五:日志分析工具sarg
5.1:在squid服务器上部署sarg
[root@squid ~]# yum install gd gd-devel -y
[root@squid ~]# cd /opt
[root@squid opt]# rz -E
rz waiting to receive.
[root@squid opt]# ls
rh sarg-2.3.7.tar.gz
[root@squid opt]# tar zxvf sarg-2.3.7.tar.gz
[root@squid opt]# cd sarg-2.3.7/
[root@squid sarg-2.3.7]# ./configure \
> --prefix=/usr/local/sarg \
> --enable-extraprotection \
> --sysconfdir=/etc/sarg
[root@squid sarg-2.3.7]# make && make install
5.2:修改sarg的配置文件
[root@squid sarg-2.3.7]# cd /etc/sarg/
[root@squid sarg]# ls
css.tpl exclude_codes sarg.conf user_limit_block
[root@squid sarg]# vim sarg.conf
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排序中有连接次数、访问字节(BYTES)、降序排序 升序是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 //网页根目录
5.3:添加不计入站点文件,添加的域名将不被显示在排序中
[root@squid sarg]# touch /usr/local/sarg/noreport
5.4:开启sarg
[root@squid sarg]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin
[root@squid sarg]# sarg
5.5:安装、启动http
[root@squid sarg]# yum install httpd -y
[root@squid sarg]# systemctl start httpd
5.6:查看sarg的统计日志
客户端输入网址http://192.168.209.145/squid-reports/
5.7:执行周期性计划任务,每天生成报告
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)
sarg 命令常用选项:
-l 指定输入日志来源
-o 指定输出目录
-z 处理信息
-d 指定日期