构建Squid代理服务器

简介:

 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,如下图所示:

杨书凡00.png

安装Squid软件

    下面以Squid 3.4.6版为例,介绍其安装和运行控制

1. 编译安装Squid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[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的配置文件

1
2
3
4
5
6
7
8
9
10
11
[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工具来进行管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[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)必须指定代理服务器的地址、端口等信息,下面通过一个案例来配置和使用传统代理

杨书凡02.png


案例:如上图所示,在服务器B上构建Squid代理服务器,允许客户机C指定服务器B作为Web代理,访问网站服务器,但禁止通过代理下载超过10MB的文件,超过4MB的文件不进行缓存

(1)配置服务器A(Web服务器)

1
2
3
4
[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服务器)

1
2
3
4
5
6
7
8
9
[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选项”、“连接”“局域网设置”,如下图所示:

杨书凡04.png

杨书凡05.png



(4)验证代理服务是否发挥作用

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

1
2
3
[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访问日志的新增记录

1
2
3
[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中的客户机,下面也通过一个案例来配置和使用透明代理

杨书凡06.png


案例:在Linux网关上构建Squid为客户机访问Internet提供代理服务,在客户机上设置IP地址、默认网关,不需要指定代理服务器的地址、端口等信息

(1)配置网站服务器

    前面的案例配置一样,就不在赘述了


(2)配置Squid服务器

1
2
3
4
5
6
7
8
9
10
[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$


例如:针对不同的客户机地址、时间段等,分别定义列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[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配置设置相应的访问权限

1
2
3
4
5
6
7
8
[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结尾的文件

1
2
3
[root@localhost squid] # echo yangshufan > /var/www/html/ysf.mp3 
[root@localhost squid] # cat /var/www/html/ysf.mp3 
yangshufan


(2)在客户机上验证是否可以访问这个文件

杨书凡08.png




Squid日志分析

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

1. 配置过程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[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. 验证

杨书凡09.png



3. 设置计划任务,定期执行

1
2
3
4
5
6
7
8
9
10
11
[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









本文转自 杨书凡 51CTO博客,原文链接:http://blog.51cto.com/yangshufan/2060045,如需转载请自行联系原作者
目录
相关文章
|
30天前
|
弹性计算 人工智能 安全
带你读《从基础到应用云上安全航行指南》——阿里云产品专家教你如何全方位构建ECS安全体系(3)
带你读《从基础到应用云上安全航行指南》——阿里云产品专家教你如何全方位构建ECS安全体系(3)
442 0
|
30天前
|
弹性计算 安全 网络安全
带你读《从基础到应用云上安全航行指南》——阿里云产品专家教你如何全方位构建ECS安全体系(2)
带你读《从基础到应用云上安全航行指南》——阿里云产品专家教你如何全方位构建ECS安全体系(2)
495 0
|
30天前
|
前端开发 数据处理 API
后端开发:构建稳健与高效的服务器逻辑
后端开发:构建稳健与高效的服务器逻辑
|
11天前
|
JavaScript Serverless 网络架构
Next.js与SSR:构建高性能服务器渲染应用
创建Next.js项目使用`create-next-app`,每个页面自动支持SSR。动态路由如`pages/posts/[id]`,在`getStaticPaths`和`getServerSideProps`中获取数据。利用静态优化和预渲染提升性能,动态导入减少初始加载时间。使用`next/image`优化图片,自定义服务器增加控制,集成第三方库如Redux。优化SEO,利用i18n支持多语言,使用Serverless模式和Web Workers。项目支持TypeScript,创建`_error.js`处理错误,部署到Vercel并使用工具进行性能监控和优化。
151 4
|
15天前
|
运维 监控 安全
构建高效稳定的Linux服务器:系统优化与安全策略
【5月更文挑战第29天】 在现代IT基础设施中,Linux服务器因其开源性、稳定性和高度可定制的特点而广泛被采用。然而,随着业务需求的不断增长,如何保证Linux服务器的高效稳定运行成为了运维人员必须面对的挑战。本文将深入探讨针对Linux服务器进行系统优化的策略,以及实施有效的安全措施,旨在帮助运维专业人员提升服务器性能,同时确保系统的安全稳定。
|
18天前
|
弹性计算 运维 负载均衡
【阿里云弹性计算】阿里云ECS在金融科技中的应用案例:高性能交易系统的构建
【5月更文挑战第27天】阿里云ECS助力某证券公司构建高性能交易系统,满足高并发、高可用和弹性扩展需求。ECS凭借最新处理器技术、高速内存实现高性能计算;支持多地域、多可用区部署保证高可用性;弹性伸缩特性适应业务波动,降低运维成本。通过分布式架构和负载均衡技术,实现交易请求高效处理,确保系统稳定运行。案例证明,阿里云ECS是金融科技领域构建高性能交易系统的理想选择。
43 1
|
19天前
|
弹性计算 缓存 安全
【阿里云弹性计算】阿里云ECS与CDN结合:构建高性能全球内容分发网络
【5月更文挑战第26天】阿里云ECS与CDN结合打造高性能全球内容分发网络,通过ECS的弹性伸缩和安全可靠性,配合CDN的全球覆盖、高可用性及安全防护,提升访问速度,减轻服务器压力,优化数据传输。以WordPress为例,通过配置CDN域名和ECS,实现高效内容分发,提高系统扩展性和稳定性。此解决方案满足用户对访问速度和稳定性的高要求,为企业提供优质的云计算体验。
54 0
|
21天前
|
弹性计算 监控 安全
【阿里云弹性计算】ECS实例监控与告警系统构建:利用阿里云监控服务保障稳定性
【5月更文挑战第23天】在数字化时代,阿里云弹性计算服务(ECS)为业务连续性提供保障。通过阿里云监控服务,用户可实时监控ECS实例的CPU、内存、磁盘I/O和网络流量等指标。启用监控,创建自定义视图集中显示关键指标,并设置告警规则(如CPU使用率超80%),结合多种通知方式确保及时响应。定期维护和优化告警策略,利用健康诊断工具,能提升服务高可用性和稳定性,确保云服务的卓越性能。
36 1
|
28天前
|
应用服务中间件 网络安全 Apache
构建高性能Web服务器:Nginx vs Apache
【5月更文挑战第16天】Nginx与Apache是两种主流Web服务器,各具优势。Nginx以其轻量级、高并发处理能力和反向代理功能见长,适合大型网站和高并发场景;而Apache以功能丰富、稳定性强闻名,适合企业网站和需要多种Web服务功能的场景。在性能上,Nginx处理高并发更优,Apache则可能在高负载时遭遇瓶颈。在选择时,应根据实际需求权衡。
|
30天前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。