Squid中文权威指南(第6章)译者序:本人在工作中维护着数台Squid服务器,多次参阅DuaneWessels(他也是Squid的创始人)的这本书,原书名是Squid:TheDefinitiveGuide,由O'Reilly出版。我在业余时间把它翻译成中文,希望对中文Squid用户有所帮助。对普通的单位上网用户,Squid可充当代理服务器;而对Sina,NetEase这样的大型站点,Squid又充当WEB加速器。这两个角色它都扮演得异常优秀。窗外繁星点点,开源的世界亦如这星空般美丽,而Squid是其中耀眼的一颗星。对本译版有任何问题,请跟我联系,我的Email是:yonghua_peng@yahoo.com.cn彭勇华目录6.访问控制.............................................................................................................................26.1访问控制元素............................................................................................................26.1.1一些基本的ACL类型.....................................................................................26.1.2ACL类型..........................................................................................................66.1.3外部ACL.......................................................................................................186.1.4处理长ACL列表...........................................................................................196.1.5Squid如何匹配访问控制元素.......................................................................206.2访问控制规则..........................................................................................................216.2.1访问规则语法...............................................................................................236.2.2Squid如何匹配访问规则...............................................................................236.2.3访问列表风格...............................................................................................246.2.4延时检查.......................................................................................................256.2.5减缓和加速规则检查...................................................................................266.3常见用法..................................................................................................................266.3.1仅仅允许本地客户.......................................................................................276.3.2阻止恶意客户...............................................................................................276.3.3内容过滤.......................................................................................................276.3.4在工作时间的受限使用...............................................................................286.3.5阻止squid与非HTTP服务器会话................................................................286.3.6授予某些用户特殊的访问...........................................................................296.3.7阻止邻近cache的滥用..................................................................................306.3.8使用IP地址拒绝请求...................................................................................316.3.9http_reply_access示例...................................................................................316.3.10阻止对本地站点的cache命中....................................................................316.4测试访问控制..........................................................................................................32Squid中文权威指南16.访问控制6.1访问控制元素ACL元素是Squid的访问控制的基础。这里告诉你如何指定包括IP地址,端口号,主机名,和URL匹配等变量。每个ACL元素有个名字,在编写访问控制规则时需要引用它们。基本的ACL元素语法如下:aclnametypevalue1value2...例如:aclWorkstationssrc10.0.0.0/16在多数情况下,你能对一个ACL元素列举多个值。你也可以有多个ACL行使用同一个名字。例如,下列两行配置是等价的:aclHttp_portsport8080008080aclHttp_portsport80aclHttp_portsport8000aclHttp_portsport80806.1.1一些基本的ACL类型Squid大约有25个不同的ACL类型,其中的一些有通用基本类型。例如,src和dstACL使用IP地址作为它们的基本类型。为避免冗长,我首先描述基本类型,然后在接下来章节里描述每种ACL类型。6.1.1.1IP地址使用对象:src,dst,myipsquid在ACL里指定IP地址时,拥有强有力的语法。你能以子网,地址范围,域名等形式编写地址。squid支持标准IP地址写法(由”.”连接的4个小于256的数字)和无类域间路由规范。另外,假如你忽略掩码,squid会自动计算相应的掩码。例如,下例中的每组是相等的:aclFoosrc172.16.44.21/255.255.255.255aclFoosrc172.16.44.21/32aclFoosrc172.16.44.21aclXyzsrc172.16.55.32/255.255.255.248aclXyzsrc172.16.55.32/28aclBarsrc172.16.66.0/255.255.255.0aclBarsrc172.16.66.0/24Squid中文权威指南2aclBarsrc172.16.66.0当你指定掩码时,squid会检查你的工作。如果你的掩码在IP地址的非零位之外,squid会告警。例如,下列行导致告警:aclFoosrc127.0.0.1/8aclParseIpData:WARNING:NetmaskmasksawaypartofthespecifiedIPin'Foo'这里的问题是/8掩码(255.0.0.0)在昀后三个字节里都是零值,但是IP地址127.0.0.1不是这样的。squid警告你这个问题,以便你消除歧义。正确的写法是:aclFoosrc127.0.0.1/32or:aclFoosrc127.0.0.0/8有时候你可能想列举多个相邻子网,在这样的情况下,通过指定地址范围很容易做到。例如:aclBarsrc172.16.10.0-172.16.19.0/24这等价但高效于下面的行:aclFoosrc172.16.10.0/24aclFoosrc172.16.11.0/24aclFoosrc172.16.12.0/24aclFoosrc172.16.13.0/24aclFoosrc172.16.14.0/24aclFoosrc172.16.15.0/24aclFoosrc172.16.16.0/24aclFoosrc172.16.18.0/24aclFoosrc172.16.19.0/24注意使用IP地址范围,掩码只能取一个。你不能为范围里的地址设置多个不同掩码。你也能在IPACL里指定主机名,例如:aclSquiddst在启动时,将主机名转换成IP地址。一旦启动,squid不会对主机名的地址发起第二次DNS查询。这样,假如在squid运行中地址已改变,squid不会注意到。假如主机名被解析成多个IP地址,squid将每一个增加到ACL里。注意你也可以对主机名使用网络掩码。在基于地址的ACL里使用主机名通常是坏做法。squid在初始化其他组件之前,先解析配置文件,所以这些DNS查询不使用squid的非阻塞IP缓存接口。代替的,它们使用阻塞机制的gethostbyname()函数。这样,将ACL主机名转换到IP地址的过程会延缓squid的启动。除非绝对必要,请在src,dst,和myipACL里避免使用主机名。squid以一种叫做splaytree的数据结构在内存里存储IP地址ACL(请见)。splaytree有一些有趣的自我调整的特性,其中之一是在查询发生时,列表会自动纠正它自己的位置。当某个匹配元素在列表里发现时,该元素变成新的树根。在该方法中,昀近参考的条目会移动到树的顶部,这减少了将来查询的时间。属于同一ACL元素的所有的子网和范围不能重迭。如果有错误,squid会警告你。例如,如