一、传统代理
使用传统代理的特点在于,客户机的相关程序(如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配置文件
[root@localhost ~]# vim /etc/squid.conf
http_port 3128
reply_body_max_size 10 MB //允许下载的最大文件大小(10MB)
http_access allow all //放在http_access deny all之前
...... //省略部分内容
在防火墙上添加允许策略
[root@localhost ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
[root@localhost ~]# service iptables save
(2)重载squid服务
修改squid.conf配置文件以后,需要重新加载方可生效,执行“service squid reload”或者“squid -k reconfigure”,都可重新加载服务配置
[root@localhost ~]# service squid reload
2、客户机的代理配置
在IE浏览器中,选择“工具”→“Internet选项”对话框,在“连接”选项卡中的“局域网(LAN)设置”选项组中单击“局域网设置”按钮,弹出“局域网(LAN)设置”对话框
IE浏览器的代理设置
若要在Linux客户机的命令行界面中使用代理服务器(如elinks网页浏览器、wget下载工具),必须通过环境变量来指定代理服务器的地址、端口等信息(大小写区分)
[root@localhost ~]# 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
[root@localhost ~]# 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的记录
[root@localhost ~]# 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地址,因为实际行是由代理服务器替它在访问
[root@localhost ~]# 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(透明)”选项,就可以支持透明代理了
[root@localhost ~]# vim /etc/squid.conf
...... //省略部分内容
http_port 192.168.4.1:3128 transparent //只在其中一个IP地址上提供服务
[root@localhost ~]# 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端口
[root@localhost ~]# iptables -t nat -I PREROUTING -i enp0s8 -s 192.168.4.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@localhost ~]# iptables -t nat -I PREROUTING -i enp0s8 -s 192.168.4.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
[root@localhost ~]# service iptables save
由于FTP协议涉及多个端口、多个连接,虽然也可以通过HTTP代理进行访问,但使用透明代理不便实现,因此最佳做法仍然是采用传统代理的方式------手动指定代理服务器的地址、端口号
3、验证透明代理的使用
为了验证透明代理的效果,如果存在手动指定的代理服务器设置应在客户机中将其去除。例如,在IE或Firefox浏览器的连接设置中不要勾选“使用代理服务器”;在Linux客户机的命令行界面中,可以通过Unset命令清除HTTP_PROXY、HTTPS_PROXY等变量
[root@localhost ~]# 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表示忽略大小写 |
在定义访问控制列表时,应结合当前网络环境正确分析用户的访问需求,准确定义使用代理服务的控制条件。例如,针对不同的客户机地址,需要限制访问的目标网站、特定的时间段......,分别定义列表
[root@localhost ~]# 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配置行的列表内容处指定对应的文件位置即可。例如,若要针对目标地址建立黑名单文件,可以参考一下操作
[root@localhost ~]# mkdir /etc/squid
[root@localhost ~]# cd /etc/squid/
[root@localhost squid]# vim ipblock.list //建立目标IP地址名单
61.135.167.36
125.39.127.25
60.28.14.0/24
[root@localhost squid]# vim dmblock.list //建立目标域地址名单
.qq.com
.msn.com
.live.com
.verycd.com
[root@localhost ~]# 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规则中,可以同时包含多个访问控制列表名,各个列表之间以空格分隔,为“与”的关系,表示必须满足所有访问控制列表对应的条件才会进行限制。需要使用取反条件时,可以在访问控制列表前添加“!”符号
[root@localhost ~]# 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的测试文件
[root@localhost ~]# 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库
[root@localhost ~]# yum -y install gd gd-devel
2、安装sarg
[root@localhost ~]# mkdir /usr/local/sarg
[root@localhost ~]# tar -zxf sarg-2.3.9.tar.gz
[root@localhost ~]# cd sarg-2.3.9/
[root@localhost 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、配置
[root@localhost ~]# cd /etc/sarg/
[root@localhost 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、运行
上述配置中,添加了不计入排序的站点,需要存在下面这个文件
[root@localhost squid]# touch /usr/local/sarg/noreport
这个文件中添加的域名将不被显示在排序中
直接执行sarg即可启动一次记录,建立设置符号链接,然后执行sarg,会看到提示信息
[root@localhost squid]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/
[root@localhost ~]# 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做成计划任务,定期执行
如下示例,写个日报告
[root@localhost ~]# 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
[root@localhost ~]# chmod +x /usr/local/sarg/daily.sh
[root@localhost ~]# crontab -e //添加任务计划,每天00:00执行
00 00 * * * /usr/local/sarg/daily.sh
[root@localhost ~]# systemctl enable crond