您的位置:首页 > 运维架构 > 反向代理

squid如何匹配访问控制元素及规则(Squid中文权威指南-笔记)

2010-04-27 22:15 239 查看
1,Squid如何匹配访问控制元素
理解squid如何搜索ACL元素去匹配是很重要的。当ACL元素有多个值时,任何单个值能导致匹配。换句话说,squid在检查ACL元素值时使用OR逻辑。当squid找到第一个值匹配时,它停止搜索。这意味着把最可能匹配的值放在列表开头处,能减少延时。
让我们看一个特殊的例子,考虑如下ACL定义:acl Simpsons ident Maggie Lisa Bart Marge Homer
当squid在访问列表里遇到Simpsons ACL时,它执行ident查询。让我们看一下,当用户ident服务返回Marge时,会发生什么呢?squid的ACL代码在成功匹配Marge前,会先后将这个值与Maggie,Lisa,和Bart对比。当搜索完成时,我们认为Simpsons ACL匹配了这个请求。
实际上,这有点欺骗。ident ACL值并非存储在无序列表里。它们存储在splay tree中。这意味着,在非匹配事件中,squid不会搜索完所有的名字。对一个splay tree搜索N个条目需要记录N个比较。许多其他的ACL类型也使用splay tree。然而,基于正则表达式的类型不使用。
既然正则表达式不能这样存储,它们以链表形式存储。这使得在大链表里它们特别低效,特别是不匹配链表里任何正则表达式的请求。为了改进这个形式,当匹配发生时,squid将正则表达式移到列表的顶部。实际上,因为ACL匹配代码的天然特性,squid将匹配的条目移到列表的第二个位置。这样,普通的匹配值自然移到ACL列表的顶部,这样会减少比较数量。
让我们看另一个简单示例:acl Schmever port 80-90 101 103 107 1 2 3 9999
该ACL匹配到原始服务器80-90端口,和其他独立端口的请求。对80端口的请求,squid通过查看第一个值就匹配了该ACL。对9999端口,其他每个值都先被检查。对某个不在列表里的端口,squid要检查所有值才宣布它不匹配。就像我已经讲过的,将最常用的值放在第一位能优化ACL匹配。
2,访问控制规则
前面提过,ACL元素是建立访问控制的第一步。第二步是访问控制规则,用来允许或拒绝某些动作。在早先的例子里,你已见过http_access规则。squid有大量其他的访问控制列表:http_access
这是最重要的访问控制列表。它决定哪些客户HTTP请求被允许,和哪些被拒绝。假如http_access配置错误,squid cache容易遭受***或被不当利用。http_reply_access
http_reply_access与http_access类似。不同之处是前者在squid接受到来自原始服务器或上级代理的响应时,才会被检测。大部分访问控制基于客户请求的方式,对这些使用http_access就够了。然而,某些人喜欢基于响应内容类型来允许或拒绝请求。redirector_access
该访问列表决定哪个请求被发送到重定向进程。默认情况下,假如你使用重定向器,那么所有的请求都通过重定向器。你可以使用redirector_access列表来阻止某些请求被重写。这点特别有用,因为这样的访问列表,使重定向器相对于访问控制系统,接受的请求信息要少一些。
3,访问规则语法
访问控制规则的语法如下: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负载。
4,Squid如何匹配访问规则
回想一下squid在搜索ACL元素时使用的“或”逻辑。在acl里的任何单值都可以导致匹配。
然而,访问规则恰好相反。对http_access和其他规则设置,squid使用“与”逻辑。
人们易犯的典型错误是编写永不正确的规则。例如:acl A src 1.2.3.4 acl B src 5.6.7.8 http_access allow A B
该规则永不正确,因为某个源IP地址不可能同时等同于1.2.3.4和5.6.7.8。这条规则的真正意图是:acl A src 1.2.3.4 5.6.7.8 http_access allow A
对某个ACL值的匹配算法是,squid在访问列表里找到匹配规则时,搜索终止。假如没有访问规则导致匹配,默认动作是列表里最后一条规则的取反。例如,考虑如下简单访问配置:acl Bob ident bob http_access allow Bob

假如用户Mary发起请求,她会被拒绝。列表里最后的(唯一的)规则是allow规则,它不匹配用户名mary。这样,默认的动作是allow的取反,故请求被拒绝。类似的,假如最后的规则是deny规则,默认动作是允许请求。在访问列表的最后加上一条,明确允许或拒绝所有请求,是好的实际做法。为清楚起见,以前的示例应该如此写:acl All src 0/0 acl Bob ident bob http_access allow Bob http_access deny All
src 0/0 ACL表示匹配每一个和任意类型的请求。
5,访问列表风格
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

http://home.arcor.de/pangj/squid/index.html <<Squid中文权威指南>>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  squid 访问 规则