ess 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 表示匹配每一个和任意类型的请求。
6.2.3 访问列表风格
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
6.2.4 延时检查
某些ACL 不能在一个过程里被检查,因为必要的信息不可用。ident,dst,srcdomain 和proxy_auth 类型属于该范畴。当squid 遇到某个ACL 不能被检查时,它延迟决定并且发布对必要信息的查询(IP 地址,域名,用户名等)。当信息可用时,squid 再次在列表的开头位置检查这些规则。它不会从前次检查剩下的位置继续。假如可能,你应该将这些最可能被延时的ACL 放在规则的顶部,以避免不必要的,重复的检查。
因为延时的代价太大,squid 会尽可能缓存查询获取的信息。ident 查询在每个连接里发生,而不是在每个请求里。这意味着,当你使用ident 查询时,持续HTTP 连接切实对你有利。DNS 响应的主机名和IP 地址也被缓存,除非你使用早期的外部dnsserver 进程。代理验
证信息被缓存,请见6.1.2.12 章节的描述。
6.2.5 减缓和加速规则检查
Squid 内部考虑某些访问规则被快速检查,其他的被减缓检查。区别是squid 是否延迟它的决定,以等待附加信息。换句话说,在squid 查询附加信息时,某个减缓检查会被延时,例如:
+ 反向DNS 查询:客户IP 地址的主机名
+ RFC 1413 ident 查询:客户TCP 连接的用户名
+ 验证器:验证用户信用
+ DNS 转发查询:原始服务器的IP 地址
+ 用户定义的外部ACL

