目录

Squid服务基础

安装及运行控制

编译安装Squid

创建链接文件、创建用户和组。

Squid的配置文件

Squid的运行控制

构建代理服务器

传统代理

web服务器配置

Squid服务器的配置

重载Squid服务

客户机的代理配置

代理服务的验证方法

透明代理

配置Squid支持透明代理

设置firewalld的重定向策略

验证透明代理的使用

ACL访问控制

定义访问控制列表

设置访问权限

验证访问控制效果

Squid日志分析


        Squid是Linux系统中最常用的一款开源代理服务软件,可以很好地实现HTTP和FTP,以及DNS查询、SSL等应用的缓存代理,功能十分强大。

Squid服务基础

  • squid的功能

用于web代理,缓存网页对象,减少重复请求。

  • 代理的基本类型

        传统代理:也就是普通的代理服务,首先必须在客户机的浏览器、聊天工具。下载软件等程序中手动设置代理服务器的地址和端口,然后才能使用代理来访问网络。对于网页浏览器,访问网站时的域名解析请求也会发给指定的代服务器。

        透明代理:提供与传统代理相同的服务和功能,其区别在于客户机不需要指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将web访问重定向,实际仍然交给代理服务器来处理。重定向的过程对客户机来说是“透明”的,用户甚至并不知道自己在使用代理服务,所以称为透明代理。使用透明代理时,网页浏览器访问网站时的域名解析请求将优先发给DNS服务器。

安装及运行控制

编译安装Squid

        配置Squid的编译选项时,将安装目录设为/usr/local/squid,其他选项根据实际需求来定,配置前可参考"./configure --help"说明。

 [root@localhost ~]# mount /dev/cdrom /media
 mount: /dev/sr0 is write-protected, mounting read-only
 [root@localhost ~]# tar zxf /media/squid-3.5.23.tar.gz -C /usr/src
 [root@localhost ~]# cd /usr/src/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-gunregex
 [root@localhost squid-3.5.23]# make && make install

上述选项含义如下:

--prefix=/usr/local/squid :安装目录。

--sysconfdir=/etc :单独将配置文件修改到其他目录。

--enable-linux-netfilter :使用内核过滤。

--enable-async-io=240 :异步l/O,提升存储性能。

--enable-default-err-language=Simplify_Chinese :错误信息的显示语言。

--disable-poll与--enable-epoll :关闭默认使用poll模式,开启epoll模式提升性能。

--enable-gunregex:使用GNU正则表达式。

创建链接文件、创建用户和组。

 [root@localhost ~]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
 [root@localhost ~]# useradd -M -s /sbin/nologin squid
 [root@localhost ~]# chown -R squid:squid /usr/local/squid/var/

Squid的配置文件

 [root@localhost ~]# vim /etc/squid.conf
 ......//省略部分
 # Squid normally listens to port 3128
 http_port 3128                                  //用来指定代理服务监听的地址和端口(默认为3128)
 cache_effective_user squid                      //指定squid的程序用户,用来设置初始化、运行时缓存的账号、否则启动不成功。
 cache_effective_group squid
 ......//省略部分

        默认情况下,配置文件中不包括cache_effective_user squid与cache_effective_group squid配置项,需要手动添加。

Squid的运行控制

检查配置文件语法

 [root@localhost ~]# squid -k parse

启动、停止Squid

        第一次启动Squid服务时,会自动初始化缓存目录。在没有可用的Squid服务脚本的情况下,也可以直接调用Squid程序来启动服务,这时需要先进行初始化。

 [root@localhost ~]# squid -z        //-z选项用来初始化缓存目录
 [root@localhost ~]# squid           //启动squid服务

确认Squid监听状态。

 [root@localhost ~]# netstat -anpt | grep squid
 tcp6       0      0 :::3128                 :::*                    LISTEN      47321/squid-1)  

使用Squid服务脚本

        为了使Squid服务的启动、停止、重载等操作更加方便,可以编写Squid服务脚本,并使用chkconfig和systemctl工具来进行管理。

[root@localhost ~]# vim /etc/init.d/squid
#!/bin/bash
# chkconfig: 2345 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 -anpt | 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 -anpt | grep squid
	else
	 echo "Squid is not runing."
	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 | restart | reload | check | status)"
;;
esac
[root@localhost ~]# chmod +x /etc/init.d/squid
[root@localhost ~]# chkconfig --add squid				//添加为系统服务
[root@localhost ~]# systemctl restart squid

构建代理服务器

        本节主要从三个方面来学习Squid服务的构建和使用,分别为传统代理、透明代理、和ACL访问控制。传统代理的实现最为简单,透明代理还需要结合默认路由、防火墙策略等一起来完成,ACL列表主要用来针对客户机的Web访问过程进行过滤控制。

传统代理

        使用传统代理的特点在于,客户机的相关程序,必须指定代理服务器的地址、端口等基本信息。下面通过案例学习传统代理的配置和使用方法。

环境如下:

        在客户机1.10上,指定Squid作为Web代理,以隐藏自己的真实IP地址。

        在Squid服务器上为客户机访问各种网站提供代理服务,但是禁止代理下载超过10MB大小的文件。

        Web服务器上搭建Apache,作为测试网站。

web服务器配置

 [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
 [root@localhost ~]# systemctl restart network
 [root@localhost ~]# systemctl stop firewalld
 [root@localhost ~]# systemctl disable firewalld
 [root@localhost ~]# rm -rf /etc/yum.repos.d/*
 [root@localhost ~]# vim /etc/yum.repos.d/test.repo
 [yum]
 name=a
 baseurl=file:///media
 gpgcheck=0
 保存退出,挂载系统光盘并安装httpd服务
 [root@localhost ~]# mount /dev/cdrom /media
 mount: /dev/sr0 写保护,将以只读方式挂载
 [root@localhost ~]# yum -y install httpd
 创建一个测试网页
 [root@localhost ~]# echo 6666666 > /var/www/html/index.html
 [root@localhost ~]# systemctl start httpd
 [root@localhost ~]# systemctl enable httpd
 生一个大文件:cat  /dev/zero   >  /var/www/html/yy (回车后,等几秒,ctrl+c结束)

首先配置IP地址、关闭防火墙等配置,Squid服务器需要配置两个IP。

 [root@localhost ~]# ifconfig            //查看两个网卡名称
 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       ......//省略部分
 ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       ......//省略部分
 [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33          //修改网络配置
 [root@localhost ~]# cd /etc/sysconfig/network-scripts 
 [root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens36                //复制ens33到当前文件夹命名为第二块网卡信息
 ......//省略部分
 修改IP地址等配置,把网卡名称为ens33的都改为ens36
 [root@localhost ~]# systemctl restart network
 [root@localhost ~]# systemctl stop firewalld
 [root@localhost ~]# systemctl disable firewalld

Squid服务器的配置

        配置Squid实现传统代理服务时,需要注意添加http_access allow all访问策略,以便允许任意客户机使用代理服务。除此之外,为了限制下载的文件大小,还需要设置reply_body_max_size项,其他各种参数均可保持默认。

 [root@localhost ~]# vim /etc/squid.conf
 reply_body_max_size 10 MB                           //在配置文件中添加限制文件大小(10MB)

重载Squid服务

        修改squid.conf配置文件以后,需要重启服务生效。做了前面的脚本可以用"systemctl restart squid"启动,没做脚本用"squid -k reconfigure"启动。

[root@localhost ~]# squid -k reconfigure

客户机的代理配置

        在火狐浏览器中,点击下图所示位置,首选项→高级→网络→设置→手动配置代理→添加代理的ip和端口号→保存即可。其他浏览器配置基本相同。

代理服务的验证方法

        客户机1.10中通过浏览器访问目标网站http://200.0.0.10,然后观察Squid代理服务器、Web服务器的访问日志是否发挥作用。

  • 查看Squid访问日志的新增记录

 [root@localhost ~]# tail -f /usr/local/squid/var/logs/access.log 
 1655638857.719      2 192.168.1.10 TCP_MISS/200 360 GET http://200.0.0.10/ - HIER_DIRECT/200.0.0.10 text/html
 1655638857.799      1 192.168.1.10 TCP_MISS/404 482 GET http://200.0.0.10/favicon.ico - HIER_DIRECT/200.0.0.10 text/html
 1655638857.806      1 192.168.1.10 TCP_MISS/404 482 GET http://200.0.0.10/favicon.ico - HIER_DIRECT/200.0.0.10 text/html
  • 查看Web访问日志的新增记录
 [root@localhost ~]# tail -f /var/log/httpd/access_log 
 200.0.0.10 - - [19/Jun/2022:19:39:02 +0800] "GET /yy HTTP/1.1" 200 253325312 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
 200.0.0.10 - - [19/Jun/2022:19:39:07 +0800] "GET /yy HTTP/1.1" 200 253325312 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
 200.0.0.1 - - [19/Jun/2022:19:39:36 +0800] "GET /yy HTTP/1.1" 200 253325312 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"

        当客户机再此访问同一Web页面时,Squid访问日志中会增加新的记录,但Web访问日志中的记录不会有变化(除非页面变更或执行强制刷新等操作)。这说明客户机访问统一静态页面时,实际上是有代理服务器缓存提供的。

透明代理

        透明代理提供的服务功能与传统代理是一致的,但是其”透明“的现实依赖于默认路由和防火墙的重定向策略,因此更适用于为局域网主机服务,而不适合为internet中的客户机提供服务。

基于局域网主机通过Linux网关访问internet的环境,需求如下。

  1. 在linux网关上,构建Squid为客户家访问internet提供代理服务。

  2. 在所有的局域网客户机上,只需要正确设置IP地址、默认网关和DNS,不需要手动指定代理服务器的地址和端口等信息。

        以上实验环境,透明代理的关键在于linux网关服务器,而对于客户机仅需正确设置网络地址、默认网关、而并不需要指定代理服务器。

配置Squid支持透明代理

        Squid服务的默认配置并不支持透明代理,因此需要调整相关设置。对于2.6以上版本的Squid服务,只需要在http_port配置行加上一个"transparent"(透明)选项,就可以支持透明代理了。

 [root@localhost ~]# vim /etc/squid.conf
 ......//省略部分
 http_port 192.168.1.1:3128 transparent      //只在其中一个IP地址上提供服务(ens33网卡)
 [root@localhost ~]# squid -k reconfigure
 [root@localhost ~]# vim /etc/sysctl.conf
 net.ipv4.ip_forward = 1                     //开启路由转发功能
 [root@localhost ~]# sysctl -p               //刷新
 net.ipv4.ip_forward = 1

设置firewalld的重定向策略

        透明代理中的Squid服务实际上是构建在linux网关主机上的,因此只需正确设置防火墙策略,就可以将局域网主机访问internet的数据包转交给Squid进行处理。这需要用到firewalld的IP伪装与端口转发策略,其作用是实现本机端口的重定向,将访问网站协议HTTP、HTTPS的转发数据包交给本机的Squid服务(3128端口)。

        防火墙做端口转发操作,将访问本机80/443端口的请求转发到3128端口。

 [root@localhost ~]# systemctl start firewalld
 [root@localhost ~]# firewall-cmd --zone=external --add-interface=ens33
 The interface is under control of NetworkManager, setting zone to 'external'.
 success
 [root@localhost ~]# firewall-cmd --zone=internal --add-interface=ens36
 The interface is under control of NetworkManager, setting zone to 'internal'.
 success
 [root@localhost ~]# firewall-cmd --zone=external --add-service=http
 success
 [root@localhost ~]# firewall-cmd --zone=external --add-service=https
 success
 [root@localhost ~]# firewall-cmd --zone=external --add-port=3128/tcp
 success
 [root@localhost ~]# firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -i ens33 -p tcp --dport 80 -j REDIRECT --to-ports 3128
 success
 [root@localhost ~]# firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -i ens33 -p tcp --dport 443 -j REDIRECT --to-ports 3128
 success
 [root@localhost ~]# firewall-cmd --runtime-to-permanent
 success

验证透明代理的使用

        为了验证透明代理效果,如果存在手动指定的代理服务器设置应在客户机中将其去除。例如,在火狐浏览器中的连接设置中不要勾选使用代理服务器;客户机网关应设为Squid代理服务器的地址。

        在客户机1.10中通过浏览访问目标网站http://200.0.0.10/,然后观察Squid代理服务器、web服务器的访问日志,已验证透明代理是否发挥作用。在被访问的web服务器中,应该能够发现来自代理服务器200.0.0.1的访问记录。

ACL访问控制

        Squid提供了强大的代理控制机制,通过合理设置ACL并进行限制,可以针对源地址、目标地址、访问的URL路径、访问的时间等各种条件进行过滤。

        在配置文件squid.conf中,ACL访问控制通过以下两个步骤来实现:其一,使用ACL配置项定义需要控制的条件;其二,通过http_access配置项对已定义的列表作允许或拒绝的访问的控制。

定义访问控制列表

        每一行acl配置可以定义一条访问控制列表,格式如下:

 acl 列表名称 列表类型 列表内容 ...

        ”列表名称“由管理员自行指定,用来识别控制条件;“列表类型”必须使用Squid预定义的值,对应不同类别的控制条件;“列表内容”是要控制的具体对象,不同类型的列表对应的内容也不一样,可以有多个值(以空格分隔,为“或”的关系)。

常用的ACL列表类型

列表类型列表内容示例用途/含义
src192.168.1.0/24源IP地址、网段、IP地址范围
dstwww.123.com目标IP地址、网段、主机名
port80 443 8080 20 21目标端口
dstdomain.q.com .w.com目标域,匹配域内所有站点
timeMTWHT 8:00-18:00使用代理服务的时间段,字母表示一星期中的英文缩写M-Monday、T-Tuesday、W-Wednesday、H-Thursday、F-Friday、A-Saturday、S-Sunday
maxconn20每个客户机的并发连接数
url_regexurl_regex -i ^rtsp://目标资源的URL地址,-i表示忽略大小写
Urlpath_regexurlpath_regex -i sex adult网址中主机名后面的部分,-i表示忽略大小写

        在定义访问控制列表时,应结合当前网络环境正确分析用户的访问需求,准确定义使用代理服务的控制条件。

 [root@localhost ~]# vim /etc/squid.conf
 ......//省略部分
 #acl localnet src 192.168.0.0/16
 acl AAA src 192.168.1.0/24              //添加源网段
 acl BBB time MTWHF 09:00-17:00          //添加访问时间为每周一到周五九点掉下午五点访问
 http_access allow AAA BBB               //允许以上两条规则
 [root@localhost ~]# squid -k reconfigure

虚拟机可以通过date -s命令修改时间测试ACL规则是否成功

        需要限制的同一类对象较多时,可以使用独立的文件来存放,在acl配置行的列表内容处指定对应的文件位置即可。例如,若要针对目标地址建立黑名单文件,可以参考以下操作。

 [root@localhost ~]# mkdir /etc/squid
 [root@localhost ~]# vim /etc/squid/ipblock.list                 //建立目标IP地址名单
 61.135.167.36
 125.39.127.25
 60.28.14.0/24
 [root@localhost ~]# vim /etc/squid/dmblock.list                 //建立目标域地址名单
 .123.com
 .my.com
 [root@localhost ~]# vim /etc/squid.conf
 ......//省略部分
 acl IPBLOCK dst "/etc/squid/ipblock.list"                       //调用指定文件中的列表内容
 acl DMBLOCK dstdomain "/etc/squid/dmblock.list"

设置访问权限

        定义好各种访问控制列表以后,需要使用后http_access配置项来进行控制。必须注意的是,http_access配置行必须放在对应的 acl配置行之后。每行http_access配置确定一条访问控制规则。

 http_access allow或deny 列表名...

        每条http_access规则中,可以同时包含多个访问控制列表名,每个列表之间以空格分隔,为“与”的关系,表示必须满足所有访问控制列表对应的条件才会进行限制。需要使用取反条件时,可以再访问控制列表前面添加“ !”符号。

 [root@localhost ~]# vim /etc/squid.conf
 http_access deny MC20                           //客户机的并发连接超过20将被阻止
 http_access allow WORKTIME                      //允许客户机在工作时间上网
 http_access deny all                            //默认禁止所有客户机使用代理

        执行访问控制时,Squid将按照各条规则的顺序依次进行检查,如果找到一条相匹配的规则就不再向后搜索。因此,规则的顺序安排是非常重要的,以下两种默认情况需要我们注意。

  1. 没有设置任何规则时:Squid服务将拒绝客户端的请求。

  2. 有规则但找不到相匹配的项:Squid将采用与最后一条规则相反的动作,即如果最后一条规则时allow,就拒绝客户端的请求,否则允许该请求。

        通常情况下,把最常用到的控制规则放到最前面,以减少Squid的负载。在访问控制的总策略上,建议采用“先拒绝后允许”或”先允许后拒绝“的方式,最后一条规则设为默认策略,设为"http_access allow all"或者"http_access deny all"。

验证访问控制效果

  • 测试访问权限限制

        对于使用http_access规则拒绝访问的情况(如访问被禁止的网站或者在禁止的时间段访问),浏览器的报错页面中会出现访问被拒绝的提示。

  • 测试文件下载权限

        对于限制文件下载大小的情况(reply_body_max_size配置项),当下在超过指定大小的Web对象时,浏览器的报错页面中会出现请求或访问太大的提示。

用来下载测试的文件可以通过dd命令生成。(在Web端配置)

 [root@localhost ~]# dd if=/dev/zero of=/var/www/html/a bs=10M count=10
 记录了10+0 的读入
 记录了10+0 的写出
 104857600字节(105 MB)已复制,0.392383 秒,267 MB/秒

 

Squid日志分析

        SARG全称是Squid Analysis Report Generator,是一款Squid日志分析工具,采用HTML格式,详细列出每位用户访问Internet的站点信息、时间占用信息、排名、连接次数、访问量等。

安装GD库

 [root@localhost ~]# rm -rf /etc/yum.repos.d/*               //采用yum的方式安装
 [root@localhost ~]# vim /etc/yum.repos.d/yum.repo
 [yum]
 name=aaa
 baseurl=file:///media
 gpgcheck=0
 [root@localhost ~]# mount /dev/cdrom /media                 //挂载系统光盘
 mount: /dev/sr0 写保护,将以只读方式挂载
 [root@localhost ~]# yum -y install gd gd-devel httpd        //后面还需要httpd服务,在这里直接安装了

安装SARG

 [root@localhost ~]# eject
 [root@localhost ~]# mount /dev/cdrom /media                         //挂载sarg包光盘
 mount: /dev/sr0 写保护,将以只读方式挂载
 [root@localhost ~]# mkdir /usr/local/sarg
 [root@localhost ~]# tar zxf /media/sarg-2.3.7.tar.gz -C /usr/src
 [root@localhost ~]# cd /usr/src/sarg-2.3.7/
 [root@localhost sarg-2.3.7]# ./configure --prefix=/usr/local/sarg --sysconfdir=/etc/sarg --enable-extraprotection && make && make install

上述配置项含义如下。

--prefix=/usr/local/sarg :路径

--sysconfdir=/etc/sarg :配置文件目录

--enable-extraprotection :添加额外的安全保护

配置

 [root@localhost ~]# vim /etc/sarg/sarg.conf 
 access_log /usr/local/squid/var/logs/access.log         //指定squid的访问日志文件(去掉#注释)
 title "Squid User Access Reports"                       //网页标题(去掉#注释)   
 output_dir /var/www/html/sarg                           //sarg报告的输出目录(将squid-reports改为sarg)(去掉#注释)
 www_document_root /var/www/html                         //网页根目录(去掉#注释)

运行

        直接执行sarg即可启动一次记录,建议设置符号链接,然后执行sarg,会看到提示信息。

 [root@localhost ~]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/
 [root@localhost ~]# sarg
 SARG: 未知的选项 /www_document_root /var/www/html
 SARG: 纪录在文件: 17, reading: 100.00%
 SARG: 成功的生成报告在 /var/www/html/sarg/2022Jun19-2022Jun23
 [root@localhost ~]# systemctl start httpd
 [root@localhost ~]# systemctl enable httpd
 Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

验证

        多次执行sarg后,在客户端上访问sarg/目录可看到SARG报告。因为Squid服务器开启了防火墙,只能在内网查看,如192.168.1.1/sarg或200.0.0.1/sarg。

 

GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐