栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Squid代理服务器

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Squid代理服务器

目录

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  mtu 1500
       ......//省略部分
 ens36: flags=4163  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。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/988549.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号