红联Linux门户
Linux帮助

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

发布时间:2009-03-25 20:05:09来源:红联作者:gary168
6.1.2.19 dstdom_regex

dstdom_regex ACL 也与dstdomain 相似。下面的例子匹配以www 开头的主机名:
acl WebSite dstdom_regex -i ^www\.

如下是另一个有用的正则表达式,用以匹配在URL 主机名里出现的IP 地址:
acl IPaddr dstdom_regex [0-9]$

这样可以工作,因为squid 要求URL 主机名完全可验证。既然全局顶级域名中没有以数字结尾的,该ACL 仅仅匹配IP 地址,它以数字结尾。


6.1.2.20 url_regex

url_regex ACL 用于匹配请求URL 的任何部分,包括传输协议和原始服务器主机名。例如,如下ACL 匹配从FTP 服务器的MP3 文件请求:
acl FTPMP3 url_regex -i ^ftp://.*\.mp3$


6.1.2.21 urlpath_regex

urlpath_regex 与url_regex 非常相似,不过传输协议和主机名不包含在匹配条件里。这让某些类型的检测非常容易。例如,假设你必须拒绝URL 里的"sex",但仍允许在主机名里含有"sex"的请求,那么这样做:
acl Sex urlpath_regex sex

另一个例子,假如你想特殊处理cgi-bin 请求,你能这样捕获它们:
acl CGI1 urlpath_regex ^/cgi-bin

当然,CGI 程序并非总在/cgi-bin/目录下,这样你应该编写其他的ACL 来捕获它们。


6.1.2.22 browser

大部分HTTP 请求包含了User-Agent 头部。该头部的值典型如下:
Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686)

browser ACL 对user-agent 头执行正则表达式匹配。例如,拒绝不是来自Mozilla 浏览器的请求,可以这样写:
acl Mozilla browser Mozilla
http_access deny !Mozilla

在使用browser ACL 之前,请确认你完全理解cache 接受到的User-Agent 字符串。某些user-agent 与它们的来源相关。甚至squid 可以重写它转发的请求的User-Agent 头部。某些浏览器例如Opera 和KDE 的Konqueror,用户可以对不同的原始服务器发送不同的user-agent字串,或者干脆忽略它们。


6.1.2.23 req_mime_type

req_mime_type ACL 指客户HTTP 请求里的Content-Type 头部。该类型头部通常仅仅出现在请求消息主体里。POST 和PUT 请求可能包含该头部,但GET 从不。你能使用该类型ACL 来检测某些文件上传,和某些类型的HTTP 隧道请求。

req_mime_type ACL 值是正则表达式。你可以这样编写ACL 去捕获音频文件类型:
acl AuidoFileUploads req_mime_type -i ^audio/


6.1.2.24 rep_mime_type

该类型ACL 指原始服务器的HTTP 响应里的Content-Type 头部。它仅在使用http_reply_access 规则时才有用。所有的其他访问控制形式是基于客户端请求的。该ACL 基于服务器响应。

假如你想使用squid 阻塞Java 代码,你可以这样写:
acl JavaDownload rep_mime_type application/x-java
http_reply_access deny JavaDownload


6.1.2.25 ident_regex

在本节早些时讲过ident ACL。ident_regex 允许你使用正则表达式,代替严格的字符串匹配,这些匹配是对ident 协议返回的用户名进行。例如,如下ACL 匹配包含数字的用户名:
acl NumberInName ident_regex [0-9]


6.1.2.26 proxy_auth_regex

该ACL 允许对代理认证用户名使用正则表达式。例如, 如下ACL 匹配
admin,administrator 和administrators:
acl Admins proxy_auth_regex -i ^admin


6.1.3 外部ACL

Squid 2.5 版本介绍了一个新特性:外部ACL。你可以指示squid 发送某些信息片断到外部进程,然后外部的辅助程序告诉squid,数据匹配或不匹配。

squid 附带着大量的外部ACL 辅助程序;大部分用于确定命名用户是不是某个特殊组的成员。请见12.5 章关于这些程序的描述,以及关于如何编写你自己的程序的信息。现在,我解释如何定义和使用外部ACL 类型。

external_acl_type 指令定义新的外部ACL 类型。如下是通用语法:
external_acl_type type-name [options] format helper-command

type-name 是用户定义的字串。你也可以在acl 行里引用它。

Squid 当前支持如下选项(options):

ttl=n
时间数量,单位是秒,用以缓存匹配值的时间长短。默认是3600 秒,或1 小时。

negative_ttl=n
时间数量,单位是秒,用以缓存不匹配值的时间长短。默认是3600 秒,或1 小时。

concurrency=n
衍生的辅助程序的数量,默认是5。

cache=n
缓存结果的最大数量。默认是0,即不限制cache 大小。

格式是以%字符开始的一个或多个关键字。squid 当前支持如下格式:

%LOGIN
从代理验证信用选项里获取的用户名。

%IDENT
从RFC 1413 ident 获取的用户名。

%SRC
客户端IP 地址。

%DST
原始服务器IP 地址。

%PROTO
传输协议(例如HTTP,FTP 等)

%PORT
原始服务器的TCP 端口。

%METHOD
HTTP 请求方法。

%
HTTP 请求头部的值;例如,%导致squid 发送这样的字串到验证器:"Mozilla/4.0 (compatible; MSIE 6.0; Win32)"

%
选择某些数量的基于列表的HTTP 头部,例如Caceh-Control;例如,给出如下HTTP头部:
X-Some-Header: foo=xyzzy, bar=plugh, foo=zoinks

对%的取值,squid 发送这样的字串到外部ACL 进程:
foo=xyzzy, foo=zoinks

%
与%相同,除了";"是列表分隔符外。你能使用任何非字母数字的字符作为分隔符。

辅助命令是squid 为辅助程序衍生的命令。你也可以在这里包含命令参数。例如,整条命令可能类似如此:
/usr/local/squid/libexec/my-acl-prog.pl -X -5 /usr/local/squid/etc/datafile

将这些放在一个长行里。squid 不支持如下通过反斜杠分隔长行的技术,所以请记住所有这些必须放在单行里:
external_acl_type MyAclType cache=100 %LOGIN % \
/usr/local/squid/libexec/my-acl-prog.pl -X -5 \
/usr/local/squid/share/usernames \
/usr/local/squid/share/useragents

现在你知道如何定义外部ACL,下一步是编写引用它的acl 行。这相对容易,语法如下:
acl acl-name external type-name [args ...]

如下是个简单示例:
acl MyAcl external MyAclType

squid 接受在type-name 后面的任意数量的参数。这些在每个请求里被发送到辅助程序。
请见12.5.3 章,我描述了unix_group 辅助程序,作为该功能的示例。


6.1.4 处理长ACL 列表

ACL 列表某些时候非常长。这样的列表在squid.conf 文件里难以维护。你也可能想从其他资源里自动产生squid ACL 列表。在如此情况下,你可以从外部文件里包含ACL 列表。语法如下:
acl name "filename"

这里的双引号指示squid 打开filename,并且将它里面的内容分配给ACL。例如,如下的ACL 太长了:
acl Foo BadClients 1.2.3.4 1.2.3.5 1.2.3.6 1.2.3.7 1.2.3.9 ...

你可以这样做:
acl Foo BadClients "/usr/local/squid/etc/BadClients"

将IP 地址放在BadClients 文件里:
1.2.3.4
1.2.3.5
1.2.3.6
1.2.3.7
1.2.3.9
...

文件可以包含以#开头的注释。注意在该文件里的每个IP 地址必须是一个单独的行。acl行里的任何地方,以空格来分隔值,新行是包含ACL 值的文件的分界。


6.1.5 Squid 如何匹配访问控制元素
文章评论

共有 0 条评论