Squid 代理服务器

  Duane Wessels—— Squid的创始人,详细信息可参考其著作:"Squid: The Definitive Guide",由 O'Reilly出版。
对普通的单位上网用户, Squid 可充当代理服务器;而对 Sina,NetEase 这样的大型站点, Squid 又充当 WEB 加速器。这两个角色它都扮演得异常优秀。
cache 命中在 squid 每次从它的缓存里满足 HTTP 请求时发生。cache 命中率,是所有 HTTP 请求中命中的比例。Web 缓存典型的 cache 命中率在 30%到 60%之间
另一个相似的度量单位叫做字节命中率,描绘了 cache 提供服务的数据容量(字节数)。 
  • Squid是Linux和Unix平台下最流行的高性能免费应用层代理服务器,具有权限管理灵活、性能高和速度快等特点
  • Squid使用访问控制列表(ACL)和访问权限列表(ARL)进行权限管理和内容过滤
  • Squid对硬件要求不高,但是对内存和硬盘有一定的要求

[root@localhost Packages]# rpm -Uvh squid-3.1.4-1.el6.i686.rpm
warning: squid-3.1.4-1.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:squid                  ########################################### [100%]
[root@localhost Packages]# chkconfig --level 2345 squid on
[root@localhost Packages]# service squid start
Starting squid: .                                          [  OK  ]
Squid主配置文件/etc/squid /squid.conf

  • 设置Squid监听的IP地址和端口号:http_port 192.168.16.1:8080
  • 设置内存缓冲区的大小:cache_mem 64 MB
  • 设置硬盘缓冲区的大小:cache_dir ufs /var/spool/squid 4096 16 256
  • 本选项的意思: 硬盘缓冲区的目录为/var/spool/squid
缓冲区的存储类型类型为ufs
缓存空间为4096MB,硬盘缓冲区的目录下有16个
一级目录,每个一级目录下有256个二级子目录。。默认的是 16 和 256。

某些人认为 squid 依赖于 L1 和 L2 的特殊值,会执行得更好或更差。这点听起来有关系,即小目录比大目录被检索得更快

  • 设置使用缓存的有效用户:cache_effective_user squid
  • 设置使用缓存的有效用户组:cache_effective_group squid
  • 定义DNS服务器的地址:dns_nameservers 61.144.56.101
  • 设置访问日志:cache_access_log /var/log/squid/access.log
  • 设置缓存日志文件:cache_log /var/log/squid/cache.log
  • 设置网页缓存日志文件的名称:cache_store_log /var/log/squid/store.log
  • 设置运行Squid主机的名称:visible_hostname 192.168.16.1
  • 设置管理员的E-mail地址:cache_mgr lindenstar@163.com
  • 设置访问控制列表:acl all src 0.0.0.0/0.0.0.0(所有的IP地址)
  • 允许或拒绝某个访问控制列表的HTTP请求:http_access allow all创建Squid使用硬盘缓冲区的目录结构
    为了能让Squid在硬盘缓冲区中缓冲客户机访问Internet的内容,在初次启动Squid之前,应该使用如下命令来建立硬盘缓冲区的缓存目录结构
    /usr/sbin/squid -z
    命令执行完后,查看目录/var/spool/squid的内容时,可以看到Squid已经根据配置文件建立了目录结构

访问控制应用实例:
acl参数语法:
ACL 元素是 Squid 的访问控制的基础。这里告诉你如何指定包括 IP 地址,端口号,主机名,和 URL 匹配等变量。每个 ACL 元素有个名字,在编写访问控制规则
时需要引用它们。基本的 ACL 元素语法如下: 

acl name type value1 value2 ... 

例如: 
acl Workstations src 10.0.0.0/16 
在多数情况下,你能对一个 ACL 元素列举多个值。你也可以有多个 ACL 行使用同一个名字。例如,下列两行配置是等价的: 
acl Http_ports port 80 8000 8080 
      acl Http_ports port 80 
     
acl Http_ports port 8000 
     
acl Http_ports port 8080 
    

Squid 大约有 25 个不同的 ACL 类型,其中的一些有通用基本类型。例如,src和 dst ACL 使用 IP 地址作为它们的基本类型。为避免冗长,我首先描述基本类

型,然后在接下来章节里描述每种 ACL 类型。 

1.1 IP 地址 

使用对象:src,dst,myip  

1.2 域名 

使用对象:srcdomain,dstdomain,和 cache_host_domain 指令 
1.3 用户名 
使用对象:ident,proxy_auth 
1.4 正则表达式 
使用对象:srcdom_regex, dstdom_regex, url_regex, urlpath_regex, browser, 
referer_regex, ident_regex, proxy_auth_regex, req_mime_type, 
rep_mime_type 
1.5 TCP 端口号 
使用对象:port,myport 
1.6 自主系统号 
使用对象:src_as,dst_as 

例1:禁止IP地址为192.168.16.200的客户机上网

acl  badclientip1  src  192.168.16.200

http_access  deny  badclientip1

例2:禁止子网192.168.1.0的所有客户机上网

acl  badclientnet1  src  192.168.1.0/24

http_access  deny  badclientnet1

例3:禁止用户访问IP地址为210.21.118.68的网站

acl  badsrvip1  dst  210.21.118.68

http_access  deny badsrvip1

例4:禁止用户访问域名为www.163.com的网站

acl  baddomain1 dstdomain www.163.com

http_access  deny baddomain1

例5:禁止用户访问域名含有163.com的网站

acl  badurl1 url_regex  -i  163.com

http_access  deny  badurl1

例6:禁止用户访问含有sex关键字的URL

acl  badurl2 url_regex  -i  sex

http_access  deny  badurl2

例7:限制IP地址为192.168.16.200客户机并发最大连接数为5

acl clientip1  src  192.168.16.200

acl  conn5  maxconn 5

http_access  deny clientip1 conn5

maxconn ACL 指来自客户 IP 地址的大量同时连接。某些 squid 管理员发现这是个有用的方法,用以阻止用户滥用代理或者消耗过多资源。 

例8:禁止192.168.2.0子网内的所有客户机在周一到周五的9:00到18:00上网

acl  clientnet1 src 192.168.2.0/255.255.255.0

acl worktime time MTWHF 9:00-18:00

http_access  deny clientnet1 worktime

time ACL 允许你控制基于时间的访问,时间为每天中的具体时间,和每周中的每天。日期以单字母来表示,见如下表。时间以 24 小时制来表示。开始时间必
须小于结束时间,这样在编写跨越 0 点的 time ACL 时可能有点麻烦。 

Table 6-2. Day codes for the time ACL 
Code  Day 
S  Sunday 
M  Monday 
T  Tuesday 
W  Wednesday 
H  Thursday 
F  Friday 
A  Saturday 
D  All weekdays (M-F) 

让我们看一个麻烦的例子。也许你是某个 ISP,在下午 8 点到早上 4 点这段不忙的时间内放松访问。既然该时间跨越子夜,你不能编写“20:00-04:00”。代替
的,你需要把它们分成两个 ACL 来写,或者使用否定机制来定义非忙时。例如: 
acl Offpeak1 20:00-23:59 
     
acl Offpeak2 00:00-04:00 
 
http_access allow Offpeak1 ... 
 
http_access allow Offpeak2 ... 
另外,你可以这样写: 
acl Peak 04:00-20:00 

http_access allow !Peak ... 
     

例9:禁止客户机下载*.mp3、*.exe、*.zip和*.rar类型的文件

acl badfile1 urlpath_regex -i  \.mp3$ \.exe$ \.zip$ \.rar$

http_access  deny  badfile1

例10:禁止QQ通过Squid代理上网

acl qq  url_regex -i tencent.com

http_access  deny qq

Squid按照顺序读取访问控制列表的,在获得匹配的访问控制语句后,不再继续向下查找如果有多条访问控制语句,必须注意它们的顺序
修改完配置文件后,需要使用命令使新的配置生效:

/etc/rc.d/init.d/squid reload

 访问规则语法 

访问控制规则的语法如下: 

access_list allow|deny [!]ACLname ... 

例如: 

http_access allow MyClients 

     

http_access deny !Safe_Ports 

     

http_access allow GameSites AfterHours 

当读取配置文件时,squid 仅仅扫描一遍访问控制行。这样,在访问列表里引用ACL 元素之前,你必须在 acl 行里定义它们。甚至,访问列表规则的顺序也非常

重要。你以怎样的顺序编写访问列表,那么 squid 就按怎样的顺序来检查它们。将最常用的 ACL 放在列表的开始位置,可以减少 squid 的 CPU 负载 对大部分访问列表,deny 和 allow 的意义明显。然而,它们中的某些,却并非如此含义清楚。请谨慎的编写 always_direct,never_direct,和 no_cache 规则。在 always_direct 中,allow 规则意味着匹配的请求直接转发到原始服务器。always_direct deny 规则意味着匹配的请求不强迫发送到原始服务器,但假如邻居cache不可到达,那可能还是会这么做。no_cache 规则也有点麻烦。这里,你必须对不必被 cache 的请求使用 deny。 

对该匹配规则来说,请求必须匹配 ACL1,ACL2,ACL3 中的任何一个。假如这些 ACL中的任何一个不匹配请求,squid 停止搜索该规则,并继续处理下一条。对某个
规则来说,将最少匹配的 ACL 放在首位,能使效率最佳。考虑如下示例: 

acl A method http 

     

acl B port 8080      

     

http_access deny A B 

该 http_access 规则有点低效,因为 A ACL 看起来比 B ACL 更容易匹配。反转顺序应该更好,以便 squid 仅仅检查一个 ACL,而不是两个: 

http_access deny B A 

 访问列表风格 

squid 的访问控制语法非常强大。大多数情况下,你可以使用两种或多种方法来完成同样的事。通常,你该将更具体的和受限制的访问列表放在首位。例如,如

下语句并非很好: 

acl All src 0/0 

     

acl Net1 src 1.2.3.0/24 

     

acl Net2 src 1.2.4.0/24 

     

acl Net3 src 1.2.5.0/24 

     

acl Net4 src 1.2.6.0/24 

     

acl WorkingHours time 08:00-17:00      

http_access allow Net1 WorkingHours      

http_access allow Net2 WorkingHours      

http_access allow Net3 WorkingHours      

http_access allow Net4      

http_access deny All 

假如你这样写,访问控制列表会更容易维护和理解: 

http_access allow Net4 

     

http_access deny !WorkingHours 

     

http_access allow Net1 

     

http_access allow Net2 

     

http_access allow Net3 

     

http_access deny All 

无论何时,你编写了一个带两个或更多 ACL 元素的规则,建议你在其后紧跟一条相反的,更广泛的规则。例如,默认的squid配置拒绝非来自本机IP地址的cache

管理请求,你也许试图这样写: 

acl CacheManager proto cache_object 

     

acl Localhost src 127.0.0.1 

  

http_access deny CacheManager !Localhost 

然而,这里的问题是,你没有允许确实来自本机的 cache 管理请求。随后的规则可能导致请求被拒绝。如下规则就产生了问题: 

acl CacheManager proto cache_object 

     

acl Localhost src 127.0.0.1 

     

acl MyNet 10.0.0.0/24 

    

acl All src 0/0      

     

http_access deny CacheManager !Localhost 

     

http_access allow MyNet 

     

http_access deny All 

既然来自本机的请求不匹配 MyNet,它被拒绝。编写本规则的更好方法是: 

http_access allow CacheManager localhost 

     

http_access deny CacheManager 

     

http_access allow MyNet 

     

http_access deny All 

 
 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值