技术分享
构建Squid代理服务器
2021-04-22
Squid(Squid cache,简称Squid)是Linux系统中最常用的一款开源代理服务软件,可以很好地实现HTTP和FTP,以及DNS查询、SSL等应用的缓存代理,功能十分强大,本篇博客详细介绍了传统代理、透明代理,squid日志分析的配置。squid的官方网站为http://www.squid-cache.org
Squid代理的工作机制
Squid是一个缓存Internet数据的一个软件,它接收用户的下载申请,并自动处理所下载的数据。也就是说,当一个用户想要下载一个主页时,它向Squid发出一个申请,要Squid替它下载,然后Squid 连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid把保存的备份立即传给用户,减少了向Internet提交重复的Web请求的过程,提高了用户下载网页的速度,隐藏了客户机的真实IP,如下图所示:
安装Squid软件
下面以Squid 3.4.6版为例,介绍其安装和运行控制
1. 编译安装Squid
[root@localhost ~]# tar zxf squid-3.4.6.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/squid-3.4.6/ //配置前可参考"./configure --help"给出的说明 [root@localhost squid-3.4.6]# ./configure --prefix=/usr/local/squid //安装目录 --sysconfdir=/etc/ //单独将配置文件修改到/etc目录下 --enable-arp-acl //可在ACL中设置通过MAC地址进行管理,防止IP欺骗 --enable-linux-netfilter //使用内核过滤 --enable-linux-tproxy //支持透明模式 --enable-async-io=100 //异步I/O,提升储存性能,值可修改 --enable-err-language="Simplify_Chinese" //错误信息的显示语言 --enable-underscore //允许URL中有下划线 --enable-poll //使用Poll()模式,提升性能 --enable-gnuregex //使用GNU正则表达式 [root@localhost squid-3.4.6]# make && make install //编译安装 [root@localhost squid-3.4.6]# cd ~ [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/
2. 修改Squid的配置文件
[root@localhost ~]# vim /etc/squid.conf http_port 3128 //指定监听地址和端口,默认端口3128 cache_effective_user squid //用来设置初始化、运行时缓存的账号,否则启动不成功 cache_effective_group squid //默认为指定账号的基本组 cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256 //此行去掉注释,最大缓存100MB文件,16个一级文件目录,256个二级文件目录 [root@localhost ~]# squid -k parse //检查语法是否正确 [root@localhost ~]# squid -z //初始化缓存目录 [root@localhost ~]# squid //启动squid服务 [root@localhost ~]# netstat -anpt | grep squid //确认squid服务处于正常监听状态 tcp 0 0 :::3128 :::* LISTEN 40936/(squid-1)
3. 编写Squid服务脚本
为了使Squid服务的启动、停止、重载等操作更加方便,可以编写Squid服务脚本,并使用chkconfig和service工具来进行管理
[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 -fr $PID &> /dev/null ;; status) [ -f $PID ] &> /dev/null if [ $? -eq 0 ] then netstat -anpt | grep squid else echo "squid is not running." 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 ~]# chkconfig squid on
构建代理服务器
根据实现方式的不同,代理服务可分为传统代理和透明代理
传统代理:适用于Internet,必需在客户机手动设置代理服务器的地址和端口
透明代理:适用于局域网环境,客户端不需要指定代理服务器的地址和端口
1. 传统代理
使用传统代理的特定在于,客户机的相关程序(如IE浏览器、QQ)必须指定代理服务器的地址、端口等信息,下面通过一个案例来配置和使用传统代理
案例:如上图所示,在服务器B上构建Squid代理服务器,允许客户机C指定服务器B作为Web代理,访问网站服务器,但禁止通过代理下载超过10MB的文件,超过4MB的文件不进行缓存
(1)配置服务器A(Web服务器)
[root@localhost ~]# yum -y install httpd //安装httpd服务 [root@localhost ~]# echo www.yangshufan.com > /var/www/html/index.html //制作测试网页 [root@localhost ~]# /etc/init.d/httpd start //开启httpd服务 [root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT //允许Web流量访问
(2)配置服务器B(Squid服务器)
[root@localhost ~]# vim /etc/squid.conf //修改squid配置文件 reply_body_max_size 10 MB //禁止下载的超过10MB的文件 maximum_object_size 4096 KB //超过4MB的文件不进行缓存 http_access deny all //前面两行需要放在这行之上才生效 [root@localhost ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT [root@localhost ~]# service iptables save //允许squid流量通过 iptables:将防火墙规则保存到 /etc/sysconfig/iptables: [确定] [root@localhost ~]# service squid reload //重载squid服务
(3)配置客户机C(代理配置)
打开IE浏览器,依次选择“工具”、“Internet选项”、“连接”“局域网设置”,如下图所示:
(4)验证代理服务是否发挥作用
1)查看Squid访问日志的新增记录
[root@localhost ~]# tail /usr/local/squid/var/logs/access.log //可以看到客户机C访问Web服务器的记录 1515630849.964 10 192.168.1.30 TCP_MISS/200 380 GET http://192.168.1.1/ - HIER_DIRECT/192.168.1.1 text/html 1515630850.113 1 192.168.1.30 TCP_MISS/404 561 GET http://192.168.1.1/favicon.ico - HIER_DIRECT/192.168.1.1 text/html
2)查看Web访问日志的新增记录
[root@localhost ~]# tail /var/log/httpd/access_log //可以看到来自Squid服务器的访问记录,Squid服务器代替客户机C访问Web服务器 192.168.1.10 - - [11/Jan/2018:08:34:18 +0800] "GET /favicon.ico HTTP/1.1" 404 287 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1;WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
当客户机再次访问同一页面时,Squid访问日志会增加新的记录,而Web访问日志的记录不会变化(除非页面变更或强制刷新等操作)。这说明当客户机访问同一静态页面时,实际上是由代理服务器通过缓存提供的
2. 透明代理
透明代理的提供的功能和传统代理是一致的,但其依赖于默认路由和防火墙的重定向策略,因此更适用于局域网,而不适用于Internet中的客户机,下面也通过一个案例来配置和使用透明代理
案例:在Linux网关上构建Squid为客户机访问Internet提供代理服务,在客户机上设置IP地址、默认网关,不需要指定代理服务器的地址、端口等信息
(1)配置网站服务器
前面的案例配置一样,就不在赘述了
(2)配置Squid服务器
[root@localhost ~]# vim /etc/squid.conf //启用透明代理,后面加一个transparent,但3.x版本后改为intercept http_port 192.168.1.1:3128 transparent //修改此项,只在这个IP地址提供代理服务 [root@localhost ~]# service squid reload //重载服务 [root@localhost ~]# vim /etc/sysctl.conf //启用路由转发功能 net.ipv4.ip_forward = 1 [root@localhost ~]# sysctl -p //立即生效 [root@localhost ~]# iptables -t nat -I PREROUTING -i eth1 -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to 3128 [root@localhost ~]# service iptables save //将80端口转到3128端口,有透明代理访问网站服务器 iptables:将防火墙规则保存到 /etc/sysconfig/iptables: [确定]
(3)在客户机上验证
在IE浏览器设置中,不要勾选使用代理服务器,直接访问访问http://172.16.16.172,然后观察Squid服务器、Web服务器的访问日志,验证透明代理是否发生作用,和前面案例的方法一样,就不在赘述了
由于FTP协议涉及多个端口,多个连接,使用透明代理不便实现,因此最佳做法是采用传统代理的方式实现
ACL访问控制
Squid提供了强大的代理控制机制,通过合理设置ACL并进行控制,可以针对源地址、目标地址、URL路径、访问时间等各种条件进行设置
ACL访问控制通过以下两个步骤来实现:
(1)使用acl配置项定义需要控制的条件
(2)通过http_access配置项对已定义的条件做限制,如“允许”或“拒绝”
1. 定义acl配置项
每一行acl配置可以定义一条访问控制列表,格式如下:
acl 列表名称 列表类型 列表内容
其中,
列表名称:由管理员自行指定,用来识别控制条件
列表类型:必须使用Squid预定义的值,对应不同类别的控制条件
列表内容:具体控制的对象,不同的类型对应的内容也不一样,可以有多个值,用空格分隔
下面是一些常用的访问控制列表类型:
列表类型 | 含义/用途 | 列表内容示例 |
src | 源IP地址、网段、IP地址范围(客户机IP地址) | 192.168.1.100 192.168.1.0/24 192.168.1.0-192.168.3.0/24 |
dst | 目标IP地址、网段主机名(服务器IP地址) | 216.182.154.9 216.182.154.0/24 www.ysf.com |
port | 目标端口 | 80 443 20 22 |
srcdomain | 源名称(客户机所属的域) | .yangshufan.com |
dstdomain | 目标名称(服务器所属的域) | .qq.com |
time | 字母表示一星期中各天的英文缩写MTWHFAS | MTWHF 8:30-17:30(周一至周五的时刻) 12:30-13:30 AS(周六、日) |
maxconn | 每个客户机的并发连接数 | 20 |
url_regex | 目标资源的URL地址,-i表示忽略大小写 | url_regex -i ^rtsp:// |
urlpath_regex | 目标资源的整个URL路径 | urlpath_regex -i sex adult urlpath_regex -i \.mp3$ |
例如:针对不同的客户机地址、时间段等,分别定义列表
[root@localhost ~]# vi /etc/squid.conf …… acl mylan src 192.168.1.0/24 192.168.4.0/24 //客户机网段 acl worktime time MTWHF 08:30-17:30 //周一至周五的工作时间段 acl to_host dst 127.0.0.0/8 //目标地址 acl mc20 maxconn 20 //最大并发连接20 acl blackURL url_regex -i ^rtsp:// ^ emo:// //以rtsp://等开头的URL acl fileURL urlpath_regex -i \.mp3$ \.mp4$ //以.mp3、.mp4结尾的URL路径 #当需要限制的同一类型较多时,可以用独立的文件来存放 [root@localhost ~]# mkdir /etc/squid //建立目标地址名单 [root@localhost ~]# cd /etc/squid [root@localhost squid]# vim ipblock.list //建立目标IP地址名单 89.23.12.34 191.12.37.112 171.23.65.0/24 [root@localhost squid]# vim dmblock.list //建立目标域地址名单 .qq.com .ysf.com .yang.com [root@localhost squid]# vim /etc/squid.conf acl ipblock dst "/etc/squid/ipblock.list" //调用指定文件的列表内容 acl dmblock dstdomain "/etc/squid/dmblock.list"
2. 设置访问权限
定义好acl后,需要设置访问权限,并必须防止对应的acl配置项之后,格式如下:
http_access deny或allow 列表名
例如:对应上面的acl配置设置相应的访问权限
[root@localhost ~]# vi /etc/squid.conf …… http_access allow mylan !fileURL //!取反值,表示禁止客户机下载MP3、MP4文件 http_access allow mylan worktime safeport !ipblock !dmblock //允许客户机在工作时间访问80、443端口,拒绝访问黑名单的IP地址、域 http_access deny all //默认禁止所有客户机使用代理 [root@localhost squid]# service squid reload //重载服务,使配置生效
3. 验证访问控制效果
(1)在网站服务器上添加一个以.MP3结尾的文件
[root@localhost squid]# echo yangshufan > /var/www/html/ysf.mp3 [root@localhost squid]# cat /var/www/html/ysf.mp3 yangshufan
(2)在客户机上验证是否可以访问这个文件
Squid日志分析
Sarg全名是Squid Analysis Report Generator,是一款Squid日志分析工具,采用HTML格式,详细列出每一位用户访问Internet的站点信息、时间占用信息、排名、连接次数、访问量等
1. 配置过程如下:
[root@localhost ~]# yum -y install gd gd-devel [root@localhost ~]# tar zxf sarg-2.3.7.tar.gz [root@localhost sarg-2.3.7]# ./configure --prefix=/usr/local/sarg//安装目录 --sysconfdir=/etc/sarg //配置文件目录 --enable-extraprotection && make && make install //添加额外的安全保护 [root@localhost sarg-2.3.7]# 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/sarg //sarg报告的输出目录 user_ip no //使用用户名显示 topuser_sort_field BYTES reverse //降序排列指定连接次数、访问字节数,升序换成normal user_sort_field BYTES reverse //降序排列用户访问记录、连接次数 overwrite_report no //当那么日期时间报告已存在,是否覆盖报告 mail_utility mailq.postfix //发送邮件报告的命令 exclude_hosts /usr/local/sarg/noreport //指定不计入排列的站点目录 charset UTF-8 //使用字符集 weekdays 0-6 //指定top排列的星期,0为周日 hours 7-12,14,16,18-20 //指定top排列的时间周期 www_document_root /var/www/html //网页根目录 [root@localhost sarg]# touch /usr/local/sarg/noreport //把不计入站点的文件添加到文件 [root@localhost sarg]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/ //优化路径 [root@localhost sarg]# sarg //启动一次记录 SARG: 纪录在文件: 171, reading: 100.00% SARG: 成功的生成报告在 /var/www/html/squid-reports/2018Jan11-2018Jan11
2. 验证
3. 设置计划任务,定期执行
[root@localhost ~]# vim /usr/local/sarg/ysf.sh //编写脚本,每天的报告 #/bin/bash today=$(date +%d/%M/%Y) terday=$(date -d "1 day ago" +%d/%m/%Y) /usr/local/sarg/bin/sarg -l /usr/local/squid/var/logs/access.log -o /var/www/html/sarg -z -d $terday-$today &> /dev/null exit 0 [root@localhost ~]# chmod +x /usr/local/sarg/ysf.sh [root@localhost ~]# crontab -e //每天00:00执行 00 00 * * * /usr/local/sarg/ysf.com [root@localhost ~]# chkconfig crond on
- 标签:
-
其他