squid代理服务器应用
一、ACL 访问控制
环境准备:
squid服务器:192.168.245.204(已安装squid)
web服务器:192.168.245.205(已安装apache)
客户机(win10):192.168.245.147
Squid 提供了强大的代理控制机制,通过合理设置 ACL(Access Control List,访问控制列表)并进行限制,可以针对源地址、目标地址、访问的 URL 路径、访问的时间等各种条件进行过滤。 在配置文件 squid.conf 中,ACL 访问控制通过以下两个步骤来实现:其一,使用 acl 配置项定义需要控制的条件;其二,通过 http_access 配置项对已定义的列表做“允许”或“拒绝”访问的控制。
每行 acl 配置可以定义一条访问控制列表,格式如下所示:
acl 列表名称 列表类型 列表内容 …
- “列表名称”由管理员自行指定,用来识别控制条件;
- “列表类型”必须使用 Squid 预定义的值,对应不同类别的控制条件;
- “列表内容”是要控制的具体对象,不同类型的列表所对应 的内容也不一样,可以有多个值(以空格分隔,为“或”的关系)。
通过上述格式可以发现,定义访问控制列表时,关键在于选择“列表类型”并设置具体的 条件对象。Squid 预定义的列表类型有很多种,常用的包括源地址、目标地址、访问时间、 访问端口等
列表类型 | 列表内容示例 | 含义 |
---|---|---|
src | 192.168.1.168,192.168.1.0/24,192.168.1.0-192.168.3.0/24 | 源 IP 地址、网段、IP 地址范围 |
dst | 216.163.137.3,61.135.167.0/24,www.playboy.com | 目标 IP 地址、网段、主机名 |
port | 80 443 8080 20 21 | 目标端口 |
dstdomain | .qq.com .msn.com | 目标域,匹配域内所有站点 |
time | MTWHF 8:30-17:30,12:00-13:00,AS | 使用代理服务的时间段:字母表示一星期中各天的英文缩写 M—Monday 、 T—Tuesday 、 W—Wednesday 、 H—Thursday、F—Friday、A—Saturday、S—Sunday |
maxconn | 20 | 每个客户机的并发连接数 |
url_regex | url_regex -i ^rtsp://,url_regex -i ^emule:// | 目标资源的 URL 地址,-i 表示忽略大小写 |
urlpath_regex | urlpath_regex -i sex adult,urlpath_regex -i .mp3$ | 网址中主机名后面的部分,-i 表示忽略大小写 |
定义好各种访问控制列表以后,需要使用 httpd_access 配置项来进行控制。必须注意 的是,http_access 配置行必须放在对应的 acl 配置行之后。每行 http_access 配置确定一 条访问控制规则,格式如下所示。
http_access allow 或 deny 列表名……
在每条 http_access 规则中,可以同时包含多个访问控制列表名,各个列表之间以空格分隔,为“与”的关系,表示必须满足所有访问控制列表对应的条件才会进行限制。需要使用取反条件时,可以在访问控制列表前添加“!”符号
修改配置文件,配置acl,拒绝192.168.245.147这个主机访问
[root@sqid ~]# vim /etc/squid.conf
# should be allowed
acl hostlocal src 192.168.245.147/32 <---定义访问控制列表的名字是hostlocal,源为192.168.245.147的主机
# Deny requests to certain unsafe ports
http_access deny hostlocal <---策略是拒绝名为hostlocal的acl
修改完配置文件后记得重载服务
[root@squid ~]# service squid reload
登入192.168.245.147主机,访问网页,显示拒绝
当需要限制的同一类对象较多时,可以使用独立的文件来存放,在 acl 配置行的列表内容处指定对应的文件位置即可
执行访问控制时,Squid 将按照各条规则的顺序依次进行检查,如果找到一条相匹配的规则就不再向后搜索(这点与 iptables 的规则匹配类似)。因此,规则的顺序安排是非常重要的,以下两种默认情况值得大家注意。
- 没有设置任何规则时:Squid 服务将拒绝客户端的请求。
- 有规则但找不到相匹配的项:Squid 将采用与最后一条规则相反的动作,即如果最后一条规则是allow,就拒绝客户端的请求,否则允许该请求。
通常情况下,把最常用到的控制规则放在最前面,以减少 Squid 的负载。在访问控制的总体策略上,建议采用“先拒绝后允许”或“先允许后拒绝”的方式,最后一条规则设为默认策略,设为“http_access allow all”或者“http_access deny all”。
二、日志分析
SARG 全称是 Squid Analysis Report Generator,是一款 Squid 日志分析工具,采用HTML格式,详细列出每位用户访问 Internet 的站点信息、时间占用信息、排名、连接次数、 访问量等。
环境准备:
squid服务器:192.168.245.204
客户机(win10):192.168.245.147
安装gd库,支持图形界面
[root@squid ~]# yum -y install gd gd-devel
解压sarg的tar包,自定义配置
[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]#
[root@squid sarg-2.3.7]# ./configure \
> --prefix=/usr/local/sarg \ <----指定安装路径
> --sysconfdir=/etc/sarg \ <----配置文件目录,默认是/usr/loca/etc
> --enable-extraprotection <----添加额外的安全保护
编译安装
[root@squid sarg-2.3.7]# make && make install
修改sarg配置文件,默认这个文件里的内容是全部被注释掉的,把我们即将修改的部分取消注释
[root@squid sarg-2.3.7]# cd /etc/sarg/
[root@squid sarg]# vim sarg.conf
7:access_log /usr/local/squid/var/logs/access.log <----指定 squid 的访问日志文件
25:title "Squid User Access Reports" <----网页标题
120:output_dir /var/www/html/squid-reports <----sarg 报告的输出目录
178:user_ip no <----使用用户名显示
184:topuser_sort_field connect reverse <----在 top 排序中,指定连接次数、访问字节数,采用降序排列,升序将 reverse 换成 normal
190:user_sort_field reverse (注释这一行)
206:exclude_hosts /usr/local/sarg/noreport <----指定不计入排序的站点列表文件
257:overwrite_report no <----当那个日期报告已经存在,是否覆盖报告
289:mail_utility mailq.postfix <----发送邮件报告的命令
434:charset UTF-8 <----使用字符集
518:weekdays 0-6 <----指定 top 排序时的星期周期,0 为周日
525:hours 0-23 <----指定 top 排序时的时间周期
633:www_document_root /var/www/html <----网页根目录
上述配置中,添加了不计入排序的站点,需要存在/usr/local/sarg/noreport 文件,/usr/local/sarg/noreport 文件中,添加的域名将不被显示在排序中
[root@squid sarg]# mkdir /usr/local/sarg
[root@squid sarg]# touch /usr/local/sarg/noreport
把sarg命令建立软链接便于使用
[root@squid sarg]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/
直接执行 sarg 即可启动一次记录
[root@squid sarg]# sarg
SARG: 纪录在文件: 178, reading: 100.00%
SARG: 成功的生成报告在 /var/www/html/squid-reports/2020Sep07-2020Sep07
因为sarg是html格式的,所以需要安装web服务,这里是apache
[root@squid sarg]# yum -y install httpd
[root@squid sarg]# systemctl start httpd
[root@squid sarg]# netstat -anpt | grep 80
tcp 0 0 192.168.245.204:22 192.168.245.1:55880 ESTABLISHED 100272/sshd: root@p
tcp6 0 0 :::80 :::* LISTEN 8237/httpd
客户机验证:
客户机访问http://192.168.245.204/squid-reports就可以看到sarg的日志页面了,并且能看到本次访问的日志内容
点击文件名进去可以看到具体内容
三、反向代理+负载均衡
Squid最典型的应用是代理局域网的机器联入互联网,它支持现在流行的网络协议。Squid的另一项非常出色的功能就是实现反向代理功能。本实例同时也演示了squid服务器加上后端两个web服务器实现负载均衡
环境准备:
squid服务器:192.168.245.204
web1服务器:192.168.245.205
web2服务器:192.168.245.206
客户机(win10):192.168.245.147
修改squid配置文件,注意:指定的ip是自己的ip,端口一般都设置成80端口,这样使用户感觉不到反向代理的存在,就像访问真正的WEB服务器一样
[root@squid ~]# vim /etc/squid.conf
# Squid normally listens to port 3128
http_port 192.168.245.204:80 accel vhost vport
cache_peer 192.168.245.205 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
cache_peer 192.168.245.206 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web2
cache_peer_domain web1 web2 www.yun.com
配置解读:
http_port 192.168.245.204:80 accel vhost vport
设定squid为accel加速模式,vhost必须要加.否则将无法将主机头转发至后端服务器,访问时就会出现无法找到主机头的错误
这个时候squid相当于一台web服务器,在80端口监听请求,同时和另外的web服务器的请求端口(vhost vport)绑定,这个时候请求到了squid,squid是不用转发请求的,而是向绑定的端口直接请求数据
cache_peer 192.168.245.205 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
定义不同的父节点,将节点设为no-query以及originserver说明这些节点是实际服务器
round-robin:轮询
max_conn=30:最大连接数30
weight=1 权重为1
name=web1 定义名字
cache_peer_domain web1 web2 www.yun.com
设定访问该域名将转发到不同的cache_peer上:web1和web2
重载squid服务
[root@squid ~]# service squid reload
web1服务器安装apache(省略安装步骤)编辑默认主页内容:
[root@web1 ~]# cd /var/www/html/
[root@web1 html]# vim index.html
<h1>this is 205 web</h1>
启动apache
[root@web1 html]# systemctl start httpd
[root@web1 html]# netstat -anpt | grep 80
tcp6 0 0 :::80 :::* LISTEN 102263/httpd
web2服务器安装apache(省略安装步骤)编辑默认主页内容:
[root@web2 ~]# cd /var/www/html/
[root@web2 html]# vim index.html
<h1>this is 206 web</h1>
启动apache
[root@web2 html]# systemctl start httpd
[root@web2 html]# netstat -anpt | grep 80
tcp6 0 0 :::80 :::* LISTEN 102263/httpd
验证分别访问2个web服务器,访问主页成功
现在为客户机的浏览器设置代理,地址为squid服务器的ip地址,端口为80
因为squid配置文件里我们配置了域名,为了方便用域名进行访问验证,直接编辑C:\Windows\System32\drivers\etc目录下的hosts文件即可
打开方式选择用记事本打开,编辑之前需要修改该文件的权限,administrator和user的权限全部设定为完全控制,否则无法保存编辑后的文件
客户机直接访问域名验证可以访问到两台web服务器的主页,并且是轮询的显示不同页面