linux-squid代理服务器
squid简介
作为应用层的代理服务软件,Squid 主要提供缓存加速、应用层过滤控制的功能、用来缓冲Internet数据
- 接受来自人们需要下载的目标(object)的请求并适当地处理这些请求。也就是说,如果想下载一web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器(比如:http://squid.nlanr.net/)并向这个页面发出请求。然后,Squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时,Squid可以简单地从磁盘中读到它,那样数据立即就会传输到客户机上。当前的Squid可以处理HTTP,FTP,GOPHER,SSL和WAIS等协议。但它不能处理如POP,NNTP,RealAudio以及其它类型的东西
- 缓存代理
- 正向代理
- 标准代理缓冲服务器:一个标准的代理缓冲服务被用于缓存静态的网页(例如:html文件和图片文件等)到本地网络上的一台主机上(即代理服务器)
- 透明代理缓冲服务器:透明代理缓冲服务和标准代理服务器的功能完全相同;代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口)
- 反向代理
- 反向代理缓冲服务器:反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载
- 正向代理
演示部分
演示一:squid安装及运行
[root@localhost ~]# yum -y install gcc*
[root@localhost ~]# tar zxvf squid-3.5.23.tar.gz
[root@localhost ~]# cd squid-3.5.23
[root@localhost squid-3.5.23]# ./configure --prefix=/usr/local/squid --sysconfdir=/etc --enable-linux-netfilter --enable-async-io=240
--enable-default-err-language=Simplify_Chinese --disable-poll --enable-epoll --enable-gnuregex
//可以使用以下简化的配置
./configure --prefix=/usr/local/squid --sysconfdir=/etc --enable-linux-netfilter --enable-gnuregex
- --prefix=/usr/local/squid:安装目录
- --sysconfdir=/etc:单独将配置文件修改到其他目录
- --enable-linux-netfilter:使用内核过滤(透明模式)
- --enable-async-io:用于异步IO,提升存储性能(240表示在进行异步io时提供的线程数)
- Squid是一个代理服务器,每个用户需要通过这个代理服务器访问网站的时候,当用户访问量很大时,需要保存每一个用户请求的数据,所以需要支持更多的用户能够同时的、并发的访问
- --enable-default-err-language=Simplify_Chinese:错误信息提示语言
- --disable-poll --enable-epoll:关闭默认的poll模式,开启epoll(扩展了的poll)模式提升性能
- --enable-gnuregex:允许规则中使用GNU正则表达式
2:编译及安装
[root@s2 squid-3.5.23]#make && make install
[root@s2 squid-3.5.23]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/ #创建软链接来优化命令路径,使我们可以直接在终端里像使用系统命令一样来使用Squid的命令
[root@s2 squid-3.5.23]# useradd -M -s /sbin/nologin squid #M:不建立宿主目录;-s不能用于登录
//为了安全性考虑,可以让专门运行该程序的程序用户来控制该程序,也就是要修改这些文件的属主和属组
[root@s2 squid-3.5.23]# chown -R squid:squid /usr/local/squid/var/
#chown:Linux 和 Unix 系统中用于更改文件或目录所有者和/或所属组的命令
#-R:选项表示递归地更改目录及其内部所有文件和子目录的所有者和/或所属组
#squid:squid:这指定了新的所有者和所属组
3:编辑squid配置文件
[root@s2 ~]# vi /etc/squid.conf
http_access allow all ##放在deny all的前面;允许所有客户端访问本代理服务器
cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256 #去掉注释符
cache_effective_user squid ##指定squid程序的用户(可以添加在末尾)
cache_effective_group squid ##指定squid账号的基本组(可以添加在末尾)
- ufs:是一种数据的存储格式
- 100:缓存大小,单位100兆(Mb)
- 16:一级目录的目录数量
- 256:二级目录的目录数量
- effective:有效的
4:检查配置结果
[root@s2 ~]# squid -k parse ##检查配置文件的语法是否正确
[root@s2 ~]# squid -z ##初始化缓存目录
[root@s2 ~]# squid ##启动squid服务
[root@s2 ~]#squid –k reconfigure ##重新加载,相当于reload
[root@s2 ~]# netstat -anpt | grep squid
[root@s2 ~]# yum -y install psmisc ##psmisc提供了killall工具
[root@localhost ~]# killall squid
5:使用squid服务脚本
//编写一个脚本;;
将squid添加为系统服务
[root@s2 init.d]# chmod +x /etc/init.d/squid
[root@s2 init.d]# chkconfig --add squid
[root@s2 init.d]# chkconfig squid on
演示二:传统代理设置
设备名称 | 系统版本 | IP地址 | 所需软件 |
客户机(宿主机或虚拟机) | win10 | 192.168.10.51 | |
服务器B(squid) | CentOS7.9 | ens33=192.168.10.101 | squid-3.5.23、sarg-2.3.7 |
服务器A(web) | CentOS7.9 | ens33=192.168.10.103 | httpd |
1:web服务器配置
为了方便实验关闭防火墙和内核安全机制,然后使用yum命令快速的安装一个Apache HTTP Server
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install httpd
cd进入Apache存放网页文件的目录下,编写一个测试的页面
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# vim index.html[root@localhost ~]# cd /var/www/html/
[root@localhost html]# vim index.html
这里编写了一个使用超链接下载文件的网页,保存并退出,在/var/www/html/目录下,除了编写的网页文件以外,还需要把超链接的这两个文件从宿主机导入到当前目录下
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<p>软件下载1:<a href="test01.zip">测试01.zip</a></br>
软件下载2:<a href="test02.rar">测试02.rar</a>
</p>
</body>
</html>
//保存退出并重启服务
[root@localhost html]# systemctl start httpd
2:squid代理服务器配置
[root@s2 squid-3.5.23]# vim /etc/squid.conf
http_port 3182
reply_body_max_size 10 MB //允许下载的最大文件大小
http_access allow all //放在 http_access deny all 之前
[root@s2 squid-3.5.23]# systemctl restart squid //重启一下squid
在防火墙上添加允许策略
//添加允许访问http服务的流量通过,由于防火墙没有针对3128端口的服务策略,所以使用添加端口的方式允许3128端口的流量通过
//因为我们添加策略是永久的,所以需要重载防火墙
[root@localhost ~]# firewall-cmd --add-service=http --permanent
[root@localhost ~]# firewall-cmd --add-port=3128/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
3:设置客户端
- windows:更改代理服务器,然后直接访问192.168.10.103
4:squid上查看日志
[root@localhost ~]# tail -f /usr/local/squid/var/logs/access.log //查看squid访问日志的新增记录
[root@localhost ~]# tail -f /var/log/httpd/access_log //查看web访问日志的新增记录
演示三:透明代理
设备名称 | 系统版本 | 桥接 | IP地址 | 所需软件 |
测试客户机 | win10 | 桥接nat | 192.168.10.51 | |
Squid代理服务器 | CentOS7.9 | ens33桥接nat ens36桥接vm1 | ens33=192.168.10.101 ens36=172.16.16.1 | squid-3.5.23 sarg-2.3.7 |
测试网站 | CentOS7.9 | 桥接vm1 | ens33=172.16.16.172 |
在Windows的设置关闭代理功能
1:配置web服务器
因为Web服务器已经和XShell断连接了,所以来到虚拟机的TTY终端进行操作
修改网卡配置文件,修改IP为拓扑图中的IP,把网关地址注释掉
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=172.16.16.172
NETMASK=255.255.255.0
#GATEWAY=192.168.10.254
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ifconfig
2:为squid服务器添加一个网卡
//测试代理服务器能否访问外网的Web服务器,如果能访问,那Web服务器就配置好了
[root@localhost ~]# curl 172.16.16.172
//cd进入存放网卡配置文件的目录下, 拷贝出ens36的网卡配置文件,然后编辑
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens36
[root@localhost network-scripts]# vim ifcfg-ens36
//设置ens36的ip地址为172.16.16.1,并且将网关地址和UUID注释掉后保存退出
3:修改配置文件以支持透明代理
[root@s2 ~]# vi /etc/squid.conf
找到http_port 3128这一行,
将其修改为http_port 192.168.10.101:3128 transparent(透明) //只在其中一个IP地址提供服务;ip地址为内网网卡的ip
//保存并退出,重启服务(pkill杀死,再启动),然后使用netstat命令检查是否启动
[root@localhost ~]# pkill -9 squid
[root@localhost ~]# squid
[root@localhost ~]# netstat -anpt | grep squid
[root@s2 ~]# service squid reload ##或者重启squid服务
4:设置iptables重定向策略
//不影响透明代理案例的实现,我们先删除刚才传统代理配置的防火墙策略
firewall-cmd --remove-service=http --permanent
firewall-cmd --remove-port=3128/tcp --permanent
firewall-cmd --reload
//既然两个网卡一个连接外网一个连接内网,那两个网卡的区域也要修改
//把ens36网卡加入到external的区域就自动拥有了地址伪装的功能,才能拥有网关的源地址转换功能
//外部区域(external):这个区域通常代表企业外部的网络环境,通常包括互联网或其他不受信任的网络。
//在这个区域中的计算机或设备可能包含潜在的安全风险,因此对它们的访问和控制会更加严格,以保护企业内部网络不受外部侵害。
firewall-cmd --zone=external --change-interface=ens36
//默认网卡的区域的public,所以我们修改ens33到的区域到internal,也就是内网
//内部区域(internal):这个区域通常代表企业内部网络或受信任的网络环境。
//在这个区域中的计算机或设备被认为是可信的,它们之间的通信受到较少的限制,以便于企业内部的数据交换和通信。
firewall-cmd --zone=internal --change-interface=ens33
//允许http(80端口)和3128端口TCP协议的流量通过
firewall-cmd --zone=internal --add-service=http
firewall-cmd --zone=internal --add-port=3128/tcp
//使用直接规则来实现:如果客户端请求访问的是80端口,代理服务器接收到请求后,就要转发给3128端口,也就说明该请求就被Squid进程接收到了
firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -i ens33 -p tcp --dport 80 -j REDIRECT --to-ports 3128
//-i:input,流量的方向
firewall-cmd --runtime-to-permanent
//如果在添加策略的时候没有设为永久时,可以使用runtime-to-permanent选项把策略从运行时改为永久时
5:客户端设置
//修改客户端的网关地址:192.168.10.101
//验证透明代理,将代理服务器的钩去掉,并保存设置,设置其网关为squid的ens33的ip地址,然后访问web服务
//无法访问重启squid服务在试
[root@localhost ~]# tail /usr/local/squid/var/logs/access.log
//删除squid缓存
[root@s2 ~]# grep cache_dir /etc/squid.conf
#cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256
[root@s2 ~]#service squid stop
[root@s2 ~]# rm -rf /usr/local/squid/var/cache/squid
[root@s2 ~]# squid -z
[root@s2 ~]#service squid start
//cache_dir:缓存文件放置位置,ufs是文件系统类型,100指定缓存目录大小,单位是M, 16 指缓存空间一级子目录个数, 256 指缓存空间的二级子目录个数
6:ACL访问控制(控制特定IP范围的用户访问 )
1、查看acl
[root@s2 ~]# vi /etc/squid.conf
2、源ip为控制条件
[root@localhost ~]# vi /etc/squid.conf
修改acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
为 acl aaa src 192.168.0.0/16 # RFC1918 possible internal network
在acl列的末尾添加
http_access deny aaa
http_access allow all
[root@s2 ~]#service squid reload
3、设置文件下载限制
[root@s2 ~]# vi /etc/squid.conf
添加
reply_body_max_size 10 MB ##下载文件的大小限制
重启squid服务并用客户端进行下载测试
4、黑名单文件作为控制条件
[root@s2 ~]# vi /etc/squid.conf
修改
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
为
acl MYLAN src 192.168.0.0/16 # RFC1918 possible internal network
针对目标ip建立黑名单
[root@s2 ~]# mkdir /etc/squid
[root@s2 ~]# cd /etc/squid
[root@s2 squid]# vi ipblock.list
添加172.16.16.172 ##定义针对特定IP范围的列表
[root@s2 squid]# vi dmblock.list
添加 qq.com ##定义针对特定域名的列表
[root@s2 ~]# vi /etc/squid.conf
添加(在acl列表的末尾,放在http_access allow前面
acl IPBLOCK dst "/etc/squid/ipblock.list" ##定义一个名为 ipBlock 的 ACL,它匹配目标 IP 地址在/opt/ipBlock.list文件中列出的地址
acl DMBLOCK dstdomain "/etc/squid/dmblock.list" ##定义一个名为 dmBlock 的 ACL,它匹配目标域名在/opt/dmBlock.list文件中列出的域名
http_access deny MYLAN IPBLOCK ##拒绝任何来自 MYLAN ACL(即 IP 地址在 192.168.0.0/16 范围内)并且目标在 ipBlock ACL 列表中的请求
http_access deny MYLAN DMBLOCK ##拒绝任何来自 MYLAN ACL 并且目标在 dmBlock ACL 列表中的请求
[root@s2 ~]#service squid reload
使用客户端测试,此时访问就被拒绝了
日志分析
SARG 全称是 Squid Analysis Report Generator,是一款 Squid 日志分析工具,采用HTML 格式,详细列出每位用户访问 Internet 的站点信息、时间占用信息、排名、连接次数、访问量等
1:安装GD库及SARG
[root@s2 ~]#yum -y install gd httpd gd-devel
[root@localhost ~]# tar zxvf sarg-2.3.7.tar.gz
[root@localhost ~]# cd sarg-2.3.7
[root@s2 sarg-2.3.7]# ./configure --prefix=/usr/local/sarg --sysconfdir=/etc/sarg --enable-extraprotection && make && make install
//--prefix=/usr/local/sarg:配置文件目录,默认是/usr/loca/etc
//--enable-extraprotection:添加额外的安全保护
2:配置
[root@s2 ~]#cd /etc/sarg/
[root@s2 sarg]#vim sarg.conf
......
里面要改的东西较多,可以删掉sarg.conf,在创建一个将给的内容复制进去
[root@s2 sarg]#vim /etc/sarg/sarg.conf
access_log /usr/local/squid/var/logs/access.log
title "Squid User Access Reports"
output_dir /var/www/html/sarg
user_ip no
topuser_sort_field connect reverse
user_sort_field connect reverse
overwrite_report no
mail_utility mailq.postfix
charset UTF-8
weekdays 0-6
hours 9-12,14-16,18-20
www_document_root /var/www/html
3:运行
[root@s2 sarg]#setenforce 0
[root@s2 sarg]#touch /usr/local/sarg/noreport ##该文件中添加的域名将不被显示在排序中
[root@s2 sarg]#ln -s /usr/local/sarg/bin/sarg /usr/local/bin/
[root@localhost sarg]# systemctl start httpd
用客户端访问一次网站
[root@s2 sarg]# sarg
或
[root@s2 sarg]# /usr/local/sarg/bin/sarg
SARG: 纪录在文件: 396, reading: 100.00%
SARG: 成功的生成报告在 /var/www/html/sarg/2015Sep18-2015Sep18
4:验证
开启squid服务器的httpd服务service httpd start
多次访问web,并多次在squid上执行sarg
在客户端访问http://172.16.16.1/sarg