Squid代理服务器--实战篇

一、传统代理


使用传统代理的特点在于,客户机的相关程序(如IE浏览器、QQ聊天工具)必须指定代理服务器的地址、端口等信息。下面通过一个简单的应用案例来学习传统代理的配置和使用

基于Internet网络环境,案例的主要需求描述如下:

  • 在Linux主机B上,构建Squid为客户机访问各种网站提供代理服务,但禁止通过代理下载超过10MB大小的文件
  • 在客户机C上,指定主机B作为Web访问代理,以隐藏自己的真实IP地址

针对上述实验环境,主机B作为代理服务器必须正确构建Squid服务,并允许客户机使用代理;若要客户机通过代理以http://www.linuxfan.cn/的域名形式访问,则代理服务器本身必须能够正确解析该域名。主机C作为客户机,需要为浏览器等程序指定所使用的代理服务器地址、端口号等信息,主机A作为测试网站,需要启用httpd服务

关于httpd服务器、DNS服务器的构建,请参考相关的资料,这里不在重复讲解。下面主要介绍Squid服务器的配置、客户机的代理配置、以及代理服务的验证方法

1、Squid服务器的配置

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

(1)修改squid.conf配置文件

[[email protected] ~]# vim /etc/squid.conf

http_port 3128

reply_body_max_size 10 MB                    //允许下载的最大文件大小(10MB)

http_access allow all                                //放在http_access  deny  all之前

......                                                                //省略部分内容

在防火墙上添加允许策略

[[email protected] ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT

[[email protected] ~]# service iptables save

iptables: Saving firewall rules to /etc/sysconfig/iptables:                 [  确定  ]

(2)重载squid服务

修改squid.conf配置文件以后,需要重新加载方可生效,执行“service  squid  reload”或者“squid  -k  reconfigure”,都可重新加载服务配置

[[email protected] ~]# service squid reload

2、客户机的代理配置

在IE浏览器中,选择“工具”→“Internet选项”对话框,在“连接”选项卡中的“局域网(LAN)设置”选项组中单击“局域网设置”按钮,弹出“局域网(LAN)设置”对话框

IE浏览器的代理设置

若要在Linux客户机的命令行界面中使用代理服务器(如elinks网页浏览器、wget下载工具),必须通过环境变量来指定代理服务器的地址、端口等信息(大小写区分)

[[email protected] ~]# vim /etc/profile

......                //省略部分内容

HTTP_PROXY=http://172.16.1.20:3128                                                    //为使用HTTP协议指定代理

HTTPS_PROXY=http://172.16.1.20:3128                                                 //为使用HTTPS协议指定代理

FTP_PROXY=http://172.16.1.20:3128                                                       //使用FTP协议指定代理

NO_PROXY=http://172.16.2.,172.16.3.                                                    //对两个局域网不使用代理

export HTTP_PROXY HTTPS_PROXY FTP_PROXY NO_PROXY

[[email protected] ~]# source /etc/profile

3、代理服务的验证方法

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

(1)查看Squid访问日志的新增记录

在Squid代理服务器中,通过跟踪Squid服务的访问日志文件,应该能够发现客户机172.16.1.10访问网站服务器172.16.1.30的记录

[[email protected] ~]# tail /usr/local/squid/var/logs/access.log

1440927958.950      0 172.16.1.10 TCP_MISS/200 382 GET http://172.16.1.30/ - HIER_DIRECT/172.16.1.30 text/html

1440927996.276      0 172.16.1.10 TCP_CLIENT_REFRESH_MISS/304 235 GET http://172.16.1.30/ - HIER_DIRECT/172.16.1.30 -

(2)查看Web访问日志的新增记录

在被访问的Web服务器中,通过跟踪httpd服务的访问日志文件,应该能够发现来自代理服务器172.16.1.20的访问记录。这说明当客户机使用代理以后,Web服务器并不知道客户机的真实IP地址,因为实际行是由代理服务器替它在访问

[[email protected] ~]# tail /var/log/httpd/access_log

172.16.1.20 - - [30/Aug/2015:17:53:20 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

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

二、透明代理


透明代理提供的服务功能与传统代理是一致的,但是其“透明”的实现依赖于默认路由和防火墙的重定向策略,因此更适用于局域网主机服务,而不适合为Internet中的客户机提供服务。下面也通过一个简单的应用案例来学习透明代理的配置和使用

基于局域网主机通过Linux网关访问Internet的环境,案例的主要需求描述如下

  • 在Linux网关上,构建Squid为客户机访问Internet提供代理服务
  • 在所有的局域网主机上,只需正确设置IP地址、默认网关,不需要手动指定代理服务器的地址、端口等信息

         使用Squid透明代理

针对上述实验环境,透明代理的关键在于Linux网关服务器,而对于客户机仅需正确设置网络地址、默认网关,而并不需要指定代理服务器(若指定了反而易出错)

关于客户机的DNS解析工作,最好还是通过正常的DNS服务器来提供,不建议抛给代理服务器来处理。下面主要介绍Squid服务的透明代理设置、防火墙策略设置,其他配置操作请参考前面的传统代理构建过程

1、配置Squid支持透明代理


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

[[email protected] ~]# vim /etc/squid.conf

......                    //省略部分内容

http_port 192.168.4.1:3128 transparent                    //只在其中一个IP地址上提供服务

[[email protected] ~]# service squid reload

2、设置iptables的重定向策略

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

REDIRECT也是一种数据包控制类型,只能在nat表的PREROUTING或OUTPUT链以及被其调用的链中使用,通过“--to-ports  端口号”的形式来指定映射的目标端口。本例中可以将来自局域网端192.168.4.0/24且访问HTTP、HTTPS等协议的数据包转交给运行在本机3128端口上的Squid服务处理

防火墙做重定向操作,将访问本机80、443端口的请求重定向到3128端口

[[email protected] ~]# iptables -t nat -I PREROUTING -i enp0s8 -s 192.168.4.0/24 -p tcp --dport 80 -j REDIRECT --to 3128

[[email protected] ~]# iptables -t nat -I PREROUTING -i enp0s8 -s 192.168.4.0/24 -p tcp --dport 443 -j REDIRECT --to 3128

[[email protected] ~]# service iptables save

iptables: Saving firewall rules to /etc/sysconfig/iptables:        [  确定  ]

由于FTP协议涉及多个端口、多个连接,虽然也可以通过HTTP代理进行访问,但使用透明代理不便实现,因此最佳做法仍然是采用传统代理的方式------手动指定代理服务器的地址、端口号

3、验证透明代理的使用

为了验证透明代理的效果,如果存在手动指定的代理服务器设置应在客户机中将其去除。例如,在IE或Firefox浏览器的连接设置中不要勾选“使用代理服务器”;在Linux客户机的命令行界面中,可以通过Unset命令清除HTTP_PROXY、HTTPS_PROXY等变量

[[email protected] ~]# unset HTTP_PROXY HTTPS_PROXY

在客户机192.168.4.10中通过浏览器访问目标网站http://172.16.1.30,然后观察Squid代理服务器、Web服务器的访问日志,以验证透明代理是否发挥作用。操作方法可参考传统代理验证,验证结果为在Squid代理服务器中,应该能够发现客户机192.168.4.10访问网站服务器172.168.1.30的记录;在被访问的Web服务器中,应该能够发现来自代理服务器172.16.1.1的访问记录

三、ACL访问控制

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

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

1、定义访问控制列表

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

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

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

通过上述格式可以发现,定义访问控制列表时,关键在于选择“列表类型”并设置具体的条件对象。Squid预定义类型有很多种,常用的包括源地址、目标地址、访问时间、访问端口等

列表类型 列表内容示例 含义/用途
src
192.168.1.168

192.1681.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--Wednesdat

H--Thursday

F--Fridat

A--Saturdat

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$

目标资源的整个URL路径,-i表示忽略大小写

在定义访问控制列表时,应结合当前网络环境正确分析用户的访问需求,准确定义使用代理服务的控制条件。例如,针对不同的客户机地址,需要限制访问的目标网站、特定的时间段......,分别定义列表

[[email protected] ~]# vim /etc/squid.conf

......

acl localhost src  127.0.0.1/255.255.255.255                                //源地址为127.0.0.1

acl MYLAN src 192.168.1.0/24  192.168.4.0/24                              //客户机网段

acl to_localhost dst 127.0.0.0/8                                                            //目标地址为127.0.0.0/8网段

acl MC20 maxconn 20                                                                                 //最大并发连接20

acl BlankURL url_regex -i ^rtsp:// ^emule://                                    //以rtsp://等开头的URL

acl MEDIAFILE urlpath_regex -i \.mp3& \.mp4& \.rmvb&            //以.mp3、.mp4等结尾的URL路径

acl WORKTIME time MTWHF 08:30-17:30                                             //时间为周一至周五08:30-17:30

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

[[email protected] ~]# mkdir /etc/squid

[[email protected] ~]# cd /etc/squid/

[[email protected] squid]# vim ipblock.list                        //建立目标IP地址名单

61.135.167.36

125.39.127.25

60.28.14.0/24

[[email protected] squid]# vim dmblock.list                     //建立目标域地址名单

.qq.com

.msn.com

.live.com

.verycd.com

[[email protected] ~]# vim /etc/squid.conf

......

acl IPBLOCK dst "/etc/squid/ipblock.list"                     //调用指定文件中的列表内容

acl DMBLOCK dstdomain "/etc/squid/dmblock.list"

2、设置访问权限

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

 http_access  allow或deny  列表名  ......

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

[[email protected] ~]# vim /etc/squid.conf

......

http_access deny MYLAN MEDIAFILE                            //禁止客户机下载MP3、MP4等文件

http_access deny MYLAN IPBLOCK                                //禁止客户机访问黑名单中的IP地址

http_access deny MYLAN DMBLOCK                              //禁止客户机访问黑名单中的网站域

http_access deny MYLAN MC20                                        //客户机的并发连接超过20时将被阻止

http_access allow MYLAN WORKTIME                           //允许客户机在工作时间上网

http_access deny all                                                             //默认禁止所有客户机使用代理

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

  • 没有设置任何规则时:Squid服务将拒绝客户端的请求
  • 有规则但找不到相匹配的项:Squid将采用最后一条规则相反的权限,即如果最后一条规则时allow,就拒绝客户机的请求,否则允许该请求

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

3、验证访问控制效果

关于Squid服务的访问控制效果,无外乎两种情况:一种是能够正常访问,另一种时禁止访问。当客户机的代理访问请求被Squid服务被拒绝时,在浏览器中会看到ERROR报错页面,具体内容会根据限制条件不同有些细小差别

(1)测试访问权限限制

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

拒绝使用Squid代理服务

拒绝下载超过大小的文件

用来下载测试的文件可以通过dd命令生成。例如,若限制的大小为10MB,则可以在目标网站服务器中创建一个15MB的测试文件

[[email protected] ~]# dd  if=/dev/zero  of=/var/www/html/file1.tgz  bs=1MB  count=15

四、Squid日志分析


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

Sarg部署过程如下所述

1、安装GD库

[[email protected] ~]# yum  -y  install gd  gd-devel

2、安装sarg


[[email protected] ~]# mkdir /usr/local/sarg

[[email protected] ~]# tar -zxf sarg-2.3.9.tar.gz

[[email protected] ~]# cd sarg-2.3.9/

[[email protected] sarg-2.3.9]# ./configure --prefix=/usr/local/sarg --sysconfdir=/etc/sarg --enable-extraprotection && make && make install


上述配置项含义如下

--sysconfdir=/etc/sarg                                //配置文件目录,默认为/usr/local/etc

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

3、配置


[[email protected] ~]# cd /etc/sarg/

[[email protected] sarg]# vim sarg.conf

access_log /usr/local/squid/var/logs/access.log              //指定Squid的访问日志文件

title "Squid User Access Reports"                                            //网页 标题

output_dir /var/www/html/squid-reports                          //sarg报告的输出目录

user_ip no                                                                                          //使用用户名显示

exclude_hosts /usr/local/sarg/noreport                             //指定不计入排序的站点列表文件

topuser_sort_field BYTES reverse                                         //在top排序中,指定连接次数、访问字节数、采用降序排列,升序将reverse换成normal

user_sort_field connect reverse                                            //对于用户访问记录,连接次数按降序排序

overwrite_report no                                                                    //当那个日志报告已经存在,是否覆盖报告

mail_utility mailq.postfix                                                         //发送邮件报告的命令

charset UTF-8                                                                                 //使用字符集

weekdays 0-6                                                                                 //指定top排序时的星期周期,0为周日

hours 9-12,14,16,18-20                                                              //指定top排序时的时间间隔

www_document_root /var/www/html                               //网页根目录

4、运行


    上述配置中,添加了不计入排序的站点,需要存在下面这个文件

[[email protected] squid]# touch /usr/local/sarg/noreport

这个文件中添加的域名将不被显示在排序中

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

[[email protected] squid]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/

[[email protected] ~]# sarg

SARG: Records in file: 156, reading: 100.00%

SARG: Successful report generated on /var/www/html/squid-reports/2015Aug30-2015Aug30

5、验证


    在sarg.conf配置中可设置字体、颜色等信息,方便查询。多次执行sarg后,在客户端上访问/sarg/目录,可看到报表

sarg报表

6、计划任务


    可将sarg做成计划任务,定期执行

如下示例,写个日报告

[[email protected] ~]# vim  /usr/local/sarg/daily.sh                        //示例:每日报告,内容如下:

#!/bin/bash

# Get current date

TODAT=$(date)

# Get one week ago today

YESTERDAY=$(date -d "1 day ago")

/usr/local/sarg/bin/sarg -l /usr/local/squid/var/logs/access.log -o /var/www/html/squid-reports -z -d $YESTERDAY-$TODAT &>/dev/null

exit 0

[[email protected] ~]# chmod +x /usr/local/sarg/daily.sh

[[email protected] ~]# crontab -e                                                            //添加任务计划,每天00:00执行

00 00 * * * /usr/local/sarg/daily.sh

[[email protected] ~]# systemctl enable crond

时间: 2024-08-23 22:34:58

Squid代理服务器--实战篇的相关文章

Squid代理服务器--基础篇

一.缓存代理概述 应用层的代理服务软件,Squid主要提供缓存加速.应用层过滤控制的功能 1.代理的工作机制 第一种情况:Squid服务器中有缓存 当客户机通过代理来请求Web页面时,指定的代理服务器会先检查自己的缓存,如果缓存中已经有客户机需要的页面,则直接将缓存中的页面内容反馈给客户机: 第二种情况:Squid服务器中没有缓存 如果缓存中没有客户机要访问的页面,则由代理服务器向Internet发送访问请求,当获得返回的Web页面以后,将网页数据保存到缓存中并发送给客户机 HTTP代理的缓存加

2-12-配置squid代理服务器加快网站访问速度

本节所讲内容: squid服务器常见概念 squid服务器安装及相关配置文件 实战:配置squid正向代理服务器 实战:配置透明squid代理提升访问速度 实战:配置squid反向代理加速度内网web服务器访问速度 squid服务概述: 全称: squid cache,是一个流行的自由软件(GNU通用公共许可证). 主要有连个功能:  代理服务器 和 为web服务器提供缓存 应用广泛: 1. 共享网络资源,缓存万维网; 2.为web服务器前置缓存提高web服务器的访问速度; 3. 域名和其他网络

《黑客攻防技术宝典Web实战篇》.Dafydd.Stuttard.第2版中文高清版pdf

下载地址:网盘下载 内容简介 编辑 <黑客攻防技术宝典(Web实战篇第2版)>从介绍当前Web应用程序安全概况开始,重点讨论渗透测试时使用的详细步骤和技巧,最后总结书中涵盖的主题.每章后还附有习题,便于读者巩固所学内容. <黑客攻防技术宝典(Web实战篇第2版)>适合各层次计算机安全人士和Web开发与管理领域的技术人员阅读.本书由斯图塔德.平托著. 目录 编辑 第1章 Web应用程序安全与风险 1.1 Web应用程序的发展历程 [1] 1.1.1 Web应用程序的常见功能 1.1.

caffe框架下目标检测——faster-rcnn实战篇操作

原有模型 1.下载fasrer-rcnn源代码并安装 git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git 1)  经常断的话,可以采取两步: git clone https://github.com/rbgirshick/py-faster-rcnn.git 2)  到py-faster-rcnn中,继续下载caffe-faster-rcnn,采取后台跑: git submodule update --in

《nodejs+gulp+webpack基础实战篇》课程笔记(四)-- 实战演练

一.用gulp 构建前端页面(1)---静态构建 npm install gulp-template --save-dev 通过这个插件,我们可以像写后台模板(譬如PHP)一样写前端页面.我们首先学习一下写法. 现在我们创建一个新任务:创建一个裸的index.html文件,然后在body里面写上 ,我的年龄是:<%= age %> 下载好gulp-template,我们引用并配置 var gulp_tpl = require("gulp-template"); gp.tas

XenApp_XenDesktop_7.6实战篇之十九:安装、升级和配置StoreFront 3.0

CitrixXenDesktop7.6 Feature Pack 2中发布了StoreFront 3.0,本章节为大家分享如何全新部署.升级和配置StoreFront 3.0.默认XenDesktop 7.6光盘自带的StoreFront版本为2.6.0.5031.注意升级和全新部署StoreFront 3.0使用的安装程序是一致的. 1.  全新部署StoreFront 3.0 1.1   将CTXSF01服务器加入域,并使用具备本地管理员权限的域账户进行登录 1.2   运行StoreFro

2天驾驭DIV+CSS (实战篇)(转)

这是去年看到的一片文章,感觉在我的学习中,有不少的影响.于是把它分享给想很快了解css的兄弟们.本文是实战篇. 基础篇[知识一] “DIV+CSS” 的叫法是不准确的[知识二] “DIV+CSS” 将你引入两大误区[知识三] 什么是W3C标准?[基础一] CSS如何控制页面[基础二] CSS选择器[基础三] CSS选择器命名及常用命名[基础四] 盒子模型[基础五] 块状元素和内联元素 实战篇[第一课] 实战小热身[第二课] 浮动[第三课] 清除浮动[第四课] 导航条(上) | 导航条(下)[大练

Java 基础:认识&理解关键字 native 实战篇

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 泥瓦匠初次遇见 navicat 是在 java.lang.Object 源码中的一个hashCode方法: 1 public native int hashCode(); 为什么有个navicat呢?这是我所要学习的地方.所以今天泥瓦匠想要总结下navicat. 一.认识 native 即 JNI,Java Native Interface 凡是一种语言,都希望是纯.比如解决某一个方案都喜欢就单单这

漫游kafka实战篇之搭建Kafka开发环境

转载注明出处:http://blog.csdn.net/honglei915/article/details/37563647 上篇文章中我们搭建了kafka的服务器,并可以使用Kafka的命令行工具创建topic,发送和接收消息.下面我们来搭建kafka的开发环境. 添加依赖 搭建开发环境需要引入kafka的jar包,一种方式是将Kafka安装包中lib下的jar包加入到项目的classpath中,这种比较简单了.不过我们使用另一种更加流行的方式:使用maven管理jar包依赖. 创建好mav