红联Linux门户
Linux帮助

《Squid 中文权威指南》续 (四)

发布时间:2009-03-25 19:56:24来源:红联作者:gary168
[i=s] 本帖最后由 gary168 于 2009-3-25 20:01 编辑 [/i]

2.16.66.0/255.255.255.0
acl Bar src 172.16.66.0/24
acl Bar src 172.16.66.0

当你指定掩码时,squid 会检查你的工作。如果你的掩码在IP 地址的非零位之外,squid会告警。例如,下列行导致告警:
acl Foo src 127.0.0.1/8
aclParseIpData: WARNING: Netmask masks away part of the specified IP in 'Foo'

这里的问题是/8 掩码(255.0.0.0)在最后三个字节里都是零值,但是IP 地址127.0.0.1不是这样的。squid 警告你这个问题,以便你消除歧义。正确的写法是:
acl Foo src 127.0.0.1/32
or:
acl Foo src 127.0.0.0/8

有时候你可能想列举多个相邻子网,在这样的情况下,通过指定地址范围很容易做到。例如:
acl Bar src 172.16.10.0-172.16.19.0/24

这等价但高效于下面的行:
acl Foo src 172.16.10.0/24
acl Foo src 172.16.11.0/24
acl Foo src 172.16.12.0/24
acl Foo src 172.16.13.0/24
acl Foo src 172.16.14.0/24
acl Foo src 172.16.15.0/24
acl Foo src 172.16.16.0/24
acl Foo src 172.16.18.0/24
acl Foo src 172.16.19.0/24

注意使用IP 地址范围,掩码只能取一个。你不能为范围里的地址设置多个不同掩码。

你也能在IP ACL 里指定主机名,例如:
acl Squid dst www.squid-cache.org

squid 在启动时,将主机名转换成IP 地址。一旦启动,squid 不会对主机名的地址发起第二次DNS 查询。这样,假如在squid 运行中地址已改变,squid 不会注意到。

假如主机名被解析成多个IP 地址,squid 将每一个增加到ACL 里。注意你也可以对主机名使用网络掩码。

在基于地址的ACL 里使用主机名通常是坏做法。squid 在初始化其他组件之前,先解析配置文件,所以这些DNS 查询不使用squid 的非阻塞IP 缓存接口。代替的,它们使用阻塞机制的gethostbyname()函数。这样,将ACL 主机名转换到IP 地址的过程会延缓squid 的启动。除非绝对必要,请在src,dst,和myip ACL 里避免使用主机名。

squid 以一种叫做splay tree 的数据结构在内存里存储IP 地址ACL ( 请见http://www.link.cs.cmu.edu/splay/)。splay tree 有一些有趣的自我调整的特性,其中之一是在查询发生时,列表会自动纠正它自己的位置。当某个匹配元素在列表里发现时,该元素变成新的树根。在该方法中,最近参考的条目会移动到树的顶部,这减少了将来查询的时间。

属于同一ACL 元素的所有的子网和范围不能重迭。如果有错误,squid 会警告你。例如,如下不被允许:
acl Foo src 1.2.3.0/24
acl Foo src 1.2.3.4/32

它导致squid 在cache.log 里打印警告:
WARNING: '1.2.3.4' is a subnetwork of '1.2.3.0/255.255.255.0'
WARNING: because of this '1.2.3.4' is ignored to keep splay tree searching predictable
WARNING: You should probably remove '1.2.3.4' from the ACL named 'Foo'

在该情形下,你需要修正这个问题,可以删除其中一个ACL 值,或者将它们放置在不同的ACL 列表中。


6.1.1.2 域名

使用对象:srcdomain,dstdomain,和cache_host_domain 指令域名简单的就是DNS 名字或区域。例如,下面是有效的域名:
www.squid-cache.org
squid-cache.org
org

域名ACL 有点深奥,因为相对于匹配域名和子域有点微妙的差别。当ACL 域名以"."开头,squid 将它作为通配符,它匹配在该域的任何主机名,甚至域名自身。相反的,如果ACL 域名不以"."开头,squid 使用精确的字符串比较,主机名同样必须被严格检查。

表6-1 显示了squid 的匹配域和主机名的规则。第一列显示了取自URL 请求的主机名(或者srcdomain ACL 的客户主机名)。第二列指明是否主机名匹配lrrr.org。第三列显示是否主机名匹配.lrrr.org ACL。你能看到,唯一的不同在第二个实例里。
Table 6-1. Domain name matching
___________________________________________________________________
__URL hostname_____Matches ACL lrrr.org? ____Matches ACL .lrrr.org?
__lrrr.org_________Yes_______________________Yes
__i.am.lrrr.org____No________________________Yes
__iamlrrr.org______No________________________No
___________________________________________________________________
**说明:为了表现表格形状,“__”仅代表空格分隔符,没有任何实际意义(段誉 注释)。

域名匹配可能让人迷惑,所以请看第二个例子以便你能真正理解它。如下是两个稍微不同的ACL:
acl A dstdomain foo.com
acl B dstdomain .foo.com

用户对http://www.foo.com/的请求匹配ACL B,但不匹配A。ACL A 要求严格的字符串
匹配,然而ACL B 里领头的点就像通配符。

另外,用户对http://foo.com/的请求同时匹配A 和B。尽管在URL 主机名里的foo.com前面没有字符,但ACL B 里领头的点仍然导致一个匹配。

squid 使用splay tree 的数据结构来存储域名ACL,就像它处理IP 地址一样。然而,squid的域名匹配机制给splay tree 提供了一个有趣的问题。splay tree 技术要求唯一键去匹配任意特定搜索条目。例如,让我们假设搜索条目是i.am.lrrr.org。该主机名同时匹配.lrrr.org和.am.lrrr.org。事实上就是两个ACL 值匹配同一个主机名扰乱了splay 机制。换句话说,在配置文件里放置如下语句是错误的:
acl Foo dstdomain .lrrr.org .am.lrrr.org

假如你这样做,squid 会产生如下警告信息:
WARNING: '.am.lrrr.org' is a subdomain of '.lrrr.org'
WARNING: because of this '.am.lrrr.org' is ignored to keep splay tree searching predictable
WARNING: You should probably remove '.am.lrrr.org' from the ACL named 'Foo'

在该情况下你应遵循squid 的建议。删除其中一条相关的域名,以便squid 明确知道你的意图。注意你能在不同的ACL 里任意使用这样的域名:
acl Foo dstdomain .lrrr.org
acl Bar dstdomain .am.lrrr.org

这是允许的,因为每个命名ACL 使用它自己的splay tree.


6.1.1.3 用户名

使用对象:ident,proxy_auth

该类型的ACL 被设计成匹配用户名。squid 可能通过RFC 1413 ident 协议或者通过HTTP验证头来获取用户名。用户名必须被严格匹配。例如,bob 不匹配bobby。squid 也有相关的ACL 对用户名使用正则表达式匹配(ident_regex 和proxy_auth_regex)。

你可以使用单词"REQUIRED"作为特殊值去匹配任意用户名。假如squid 不能查明用户名,ACL 不匹配。当使用基于用户名的访问控制时,squid 通常这样配置。


6.1.1.4 正则表达式

使用对象:srcdom_regex,dstdom_regex,url_regex,urlpath_regex,browser,referer_regex,ident_regex,proxy_auth_regex,req_mime_type,rep_mime_type

大量的ACL 使用正则表达式来匹配字符串(完整的正则表达式参考,请见O'Reilly 的Mastering Regular Expressions 一书)。对squid 来说,最常使用的正则表达式功能用以匹配字符串的开头或结尾。例如,^字符是特殊元字符,它匹配行或字符串的开头:
^http://

该正则表达式匹配任意以http://开头的URL。$也是特殊的元字符,因为它匹配行或字
符串的结尾:
.jpg$

实际上,该示例也有些错误,因为.字符也是特殊元字符。它是匹配任意单个字符的通配符。我们实际想要的应该是:
\.jpg$
文章评论

共有 0 条评论