squid服务的应用[转]

原贴:http://blog.ixpub.net/8400463/viewspace-3985

網絡依然還是計算機,Sun還是Sun!

squid服务的应用[转]

上一篇 / 下一篇  2007-09-15 04:27:50 / 个人分类:Linux學習

初始化cache
)P PZv] i `0# /s/squid/sbin/squid -z IXPUB技术博客0j gSo4LO5q
启动squid
`;Z(jY `0# /s/squid/etc/rc.d/squid.sh start
H)T`0w&| z;q0@ 设置ipfilter
7Em#q-^ e!v9U5k0为了实现透明的功能,需要将所有对80端口的请求转到squid的3128端口上,以实现对客户端透明的功能。在/etc/ipnat.rules中加入:
t[c0}R Y0rdr fxp1 0.0.0.0/0 port 80 -> 127.0.0.1 3128
;c?2r!E!}Ob0刷新ipnat配置:
@V4l3o(V@ a2_0# ipnat -Cf /etc/ipnat.rules
/IS` p iq-z/z0一切完成,客户端无需任何设置,根本感觉不到代理的存在,而且访问速度明显变快
 
透明代理 IXPUB技术博客(e,xRv/V,fG4^ ~1S
httpd_accel_host virtual
*Dt;]p&|3h%E fA0httpd_accel_port 80
(F&]f F}j/ndL ]LY0httpd_accel_with_proxy on
7`lb)C-khdl0httpd_accel_user_host_header on IXPUB技术博客 w U)f w#wL M
在Linux上,可以用iptables/ipchains直接将对Web端口80的请求直接转发到Squid端口3128,由Squid接手,而用户浏览器仍然认为它访问的是对方的80端口。例如以下这条命令:
iptables -t nat -A PREROUTING -s 192.168.0.200/32 -p tcp --dport 80 -j REDIRECT 3128
GdHe/'{'S,I0就是将192.168.0.200的所有针对80端口的访问重定向到3128端口。
IXPUB技术博客pPcCQ ~VM&mR
普通代理 服务器
nZ)O&qTPv dY4]K0在这个例子中,代理服务器同时也是网关,内部网络接口eth0的IP地址为192.168.0.1,外部网络接口eth1的IP地址为202.103.x.x。下面是一个基本的代理所需要配置选项:
u0p6EjQa7l,B0http_port 192.168.0.1:3128 IXPUB技术博客uNX0GzfIH8aj
  默认端口是3128,当然也可以是任何其它端口,只要不与其它服务发生冲突即可。为了 安全起见,在前面加上IP地址,Squid就不会监听外部的网络接口。 IXPUB技术博客G+U&f&|B k0/!Cl
  下面的配置选项是服务器 管理者的电子邮件,当错误发生时,该地址会显示在错误页面上,便于用户联系:
b&T3L({R.PoI_V0/ V0cache_mgr start@soocol.com
  以下这些参数告诉Squid缓存的文件系统、位置和缓存策略:
1u+rU+hvQ0cache_dir ufs /var/squid IXPUB技术博客Q.bt V'l+R I
cache_mem 32MB
_/G6d6Y)v8I3c%f,s0cache_swap_low 90 IXPUB技术博客!g b x,] I/y
cache_swap_high 95
  在这里,Squid会将/var/squid目录作为保存缓存数据的目录,每次处理的缓存大小是32兆字节,当缓存空间使用达到95%时,新的内容将取代旧的而不直接添加到目录中,直到空间又下降到90%才停止这一活动。如果不想Squid缓存任何文件,如某些存储空间有限的专有系统,可以使用null文件系统(这样不需要那些缓存策略):
t3XX9C8}1A*O+^]|2/J0cache_dir null /tmp
  下面的几个关于缓存的策略配置中,较主要的是第一行,即用户的访问记录,通过分析它来了解所有用户访问的详尽地址
Z.[Iesd(a&Q0cache_access_log /var/squid/access.log IXPUB技术博客4k(u*i p3CYI:uOI
cache_log /var/squid/cache.log IXPUB技术博客9C| p _z0O'u-Mh
cache_store_log /var/squid/store.log
  下面这行配置是在较新版本中出现的参数,告诉Squid在错误页面中显示的服务器名称:
8y^ R9Ss k Y;f0visible_hostname No1.proxy
  以下配置告诉Squid如何处理用户,对每个请求的IP地址作为单独地址处理:
YgPLoiG"m0client_mask 255.255.255.255
 
 
################################################################################
K:w/PaW"X,PM;E0第4章 快速配置向导
4.1 squid.conf 语法
Squid 的配置文件相对规范。它与其他许多unix 程序相似。每行以配置指令开始,后面跟着数字值或关键字。在读取配置文件时,squid 忽略空行和注释掉的行(以#开始)。如下是一些配置行示例: IXPUB技术博客@Hp/[D@pTb
cache_log /squid/var/cache.log
1gpZ4N;~0# define the localhost ACL IXPUB技术博客ubW4Lz O
acl Localhost src 127.0.0.1/32 IXPUB技术博客OxV h*?7m Vq
connect_timeout 2 minutes IXPUB技术博客*? v7uXtS$O6~
log_fqdn on
某些指令取唯一值。在这些情形下,重复赋予该指令不同的值,将覆盖前面的值。例如, IXPUB技术博客G:P5G-?/` ~
下面是一个连接超时值。第一行无效,因为第二行覆盖了它: IXPUB技术博客8Xzah4p-z };@
connect_timeout 2 minutes
1o9WP5HE$v"Cy0connect_timeout 1 hour
另外,某些指令取列表值。在这些情形下,每一个新增的值都有效。"扩展方式"指令以这种方法工作:
&^|)z*p7f)lH0extension_methods UNGET IXPUB技术博客.qw`@K z./
extension_methods UNPUT
6[R6J$^6V+V-gcL0extension_methods UNPOST
对这些基于列表的指令,你通常能在同一行中赋予多个值:
R/]H0OiOH3Y+v0extension_methods UNGET UNPUT UNPOST
许多指令有通用类型。例如,连接超时值是一个时间规范,在数字后面跟着时间单元。例如:
&n"xtQ-/&X0connect_timeout 3 hours IXPUB技术博客rc c+{:i]P[#w+ee!M3y
client_lifetime 4 days IXPUB技术博客:u*f1sl1i'm
negative_ttl 27 minutes
类似的,大量的指令指向文件大小或者内存额度。例如,你可以这样编写大小规范:十进制数字后面跟bytes,KB,MB 或GB.例如:
[tS7X+s!@T0minimum_object_size 12 bytes
pBv#l [0request_header_max_size 10 KB IXPUB技术博客)c n:{0} f$tyZ
maximum_object_size 187 MB
另一种值得提起的类型是触发器,它的值是on 或者off。许多指令使用该类型。例如:
(xo4BGoF!]0server_persistent_connections on
&Anv4c!_lIaI4C0strip_query_terms off
Fs?I&P:y*c0prefer_direct on
通常,配置文件指令能以任何顺序出现。然而,如果某个指令指向的值被其他指令所定义,那么顺序就很重要。访问控制列表是个好的例子。acl 被用在http_access 规则之前必须被定义:
m9w)l`*C6]/H5fA0acl Foo src 1.2.3.4 IXPUB技术博客| s tk6bc
http_access deny Foo
squid.conf 文件里的许多东西是大小写敏感的,例如指令名。你不能将http_port 写成HTTP_port。
默认的squid.conf 文件包含了对每个指令的大量注释,以及指令的默认值。例如: IXPUB技术博客/UgdYNIAD3~
# TAG: persistent_request_timeout
P2FN+pGF&R&[5g"D:Y0# How long to wait for the next HTTP request on a persistent
#C0P8A3tHm0# connection after the previous request completes.
8k+M-RR;_;p0# IXPUB技术博客 qd;S%EO1]8?
#Default: IXPUB技术博客K DV] o l(Iu/s7y
# persistent_request_timeout 1 minute
每次安装squid 后,当前默认配置文件存放在$prefix/etc 目录下的squid.conf.default。既然指令每次都有所改变,你能参考该文档,以获取最近的更新。
该章剩下的部分是关于在开始运行squid 之前,你必须知道的少数指令。
IXPUB技术博客[xun&m+K4j /5?
4.2 User IDs
你可能知道,unix 进程和文件拥有文件和组属主的属性。你必须选择某个用户和组给squid。该用户和组的组合,必须对大部分squid 相关的文件和目录有读和写的权限。
我高度推荐创建名为"squid"的用户和组。这避免了某人利用squid 来读取系统中的其他文件。假如不止一个人拥有对squid 的管理权限,你可以将他们加到squid 组里。
unix 进程继承了它们父进程的属主属性。那就是说,假如你以joe 用户来启动squid,squid 也以joe 来运行。假如你不想以joe 来运行squid,你需要预先改变你的用户ID。这是su 命令的典型功能。例如: IXPUB技术博客%XwaN$i'W9WO
joe% su - squid
A8}`e.f/k3i:| Z%ub0squid% /usr/local/squid/sbin/squid
不幸的是,运行squid 并非总是如此简单。在某些情况下,你必须以root 来启动squid,这依赖于你的配置。例如,仅仅root 能绑定TCP 套接字到特权端口上,如80。假如你必须以root 来启动squid,你必须设置cache_effective_user 指令。它告诉squid,在执行完需要特别权限的任务后,变成哪个用户。例如:
9r&FqIN-K0cache_effective_user squid
你提供的该名字必须是有效用户(在/etc/passwd 文件里)。请注意仅仅当你以root 来启动squid 时,你才需要用到该指令。仅仅root 有能力来随意改变用户身份。假如你以joe 来启动squid,它不能改变到squid 用户。
你可能尝试不设置cache_effective_user,直接以root 来运行squid。假如你试过,你会发现squid 拒绝运行。这违背了安全规则。假如外部 攻击者有能力危及或利用squid,他能获取对系统的全部访问权。尽管我们努力使squid 安全和少bug,但还是稳重点好。
假如你没有设置cache_effective_user,以root 来启动squid,squid 使用nobody 作为默认值。不管你选择什么用户ID , 请确认它有对下面目录的读访问权:$prefix/etc,$prefix/libexec,$prefix/share。该用户ID 也必须有对日志文件和缓存目录的写访问 IXPUB技术博客)dei0bE
权。
squid 也有一个cache_effective_group 指令,但你也许不必设置它。默认的,squid 使用cache_effective_user 的默认组(从/etc/passwd 文件读取)。

+Odl;Fyg+d#A04.3 端口号
http_port 指令告诉squid 在哪个端口侦听HTTP 请求。默认端口是3128:
*G2JFl:C,j0http_port 3128
假如你将squid 作为加速器运行(见15 章),你也许该将它设为80。
你能使用附加的http_port 行,来指示squid 侦听在多个端口上。假如你必须支持客户组(它们被配置得不一致),这点就经常有用。例如,来自某个部门的浏览器发送请求到3128,
*O%X+a$w&bV/s0然而另一个部门使用80 端口。简单的将两个端口号列举出来:
Ac3E$B7]+o l8N&xA9^xe0http_port 3128
,D2f m0DV%y7/$AUT0http_port 8080
你也能使用http_port 指令来使squid 侦听在指定的接口地址上。当squid 作为防火墙运行时,它有两个网络接口:一个内部的和一个外部的。你可能不想接受来自外部的http 请求。为了使squid 仅仅侦听在内部接口上,简单的将IP 地址放在端口号前面: IXPUB技术博客Q/z#wTD3Q z9/ w
http_port 192.168.1.1:3128

;B)Y&A"Yl(?7]!h04.4 日志文件路径
我将在第13 章讨论所有squid 的日志细节。你现在你关注的唯一事情是,squid 将它的日志放在何处。默认的日志目录是squid 安装位置下的logs 目录。例如,假如你在./configure IXPUB技术博客?xj1WL
时没有使用--prefix=选项,那么默认的日志文件路径是/usr/local/squid/var/logs。
你必须确认日志文件所存放的磁盘位置空间足够。在squid 写日志时如果接受到错误,它会退出和重启。该行为的主要理由应引起你的注意。squid 想确认你不会丢失任何重要的日志信息,特别是你的系统被滥用或者被攻击时。
squid 有三个主要的日志文件:cache.log,access.log,store.log.第一个文件即cache.log,包含状态性的和调试性的消息。当你刚开始运行squid 时,你应密切的关注该文件。假如squid拒绝运行,理由也许会出现在cache.log 文件的结尾处。在正常条件下,该文件不会变得很大。也请注意,假如你以-s 选项来运行squid,重要的cache.log 消息也可被送到你的syslog进程。通过使用cache_log 指令,你可以改变该日志文件的路径: IXPUB技术博客|P3x j5Uv
cache_log /squid/logs/cache.log
access.log 文件包含了对squid 发起的每个客户请求的单一行。每行平均约150 个字节。也就是说,在接受一百万条客户请求后,它的体积约是150M。请使用cache_access_log 指令来改变该日志文件的路径: IXPUB技术博客.D3OT.q U
cache_access_log /squid/logs/access.log
假如因为某些理由,你不想squid 记录客户端请求日志,你能指定日志文件的路径为/dev/null.
store.log 文件对大多数cache 管理员来说并非很有用。它包含了进入和离开缓存的每个目标的记录。平均记录大小典型的是175-200 字节。然而,squid 不在store.log 里对cache点击创建接口,所以它比access.log 包含少得多的记录。请使用cache_store_log 指令来改变它的位置: IXPUB技术博客)C~)Z}:_ P w
cache_store_log /squid/logs/store.log
通过指定路径为none,你能轻易的完全禁止store.log 日志: IXPUB技术博客4G7S B!g_4c
cache_store_log none
假如你不小心,squid 的日志文件增加没有限制。某些操作系统对单个文件强制执行2G的大小限制,即使你有充足的磁盘空间。超过该限制会导致写错误,这样squid 就会退出。为了保证日志文件大小合理,你应创建任务来有规律的重命名和打包日志。squid 有内建功能来使这个容易做到。请见13.7 章关于日志轮循的解释。

&}-Y_B5y{7nn&~04.5 访问控制
在第6 章里有更多的关于访问控制的描述。现在,我只讲述少量的访问控制方法,以使热心的读者能快速开始使用squid。
squid 默认的配置文件拒绝每一个客户请求。在任何人能使用代理之前,你必须在squid.conf 文件里加入附加的访问控制规则。最简单的方法就是定义一个针对客户IP 地址的ACL 和一个访问规则,告诉squid 允许来自这些地址的HTTP 请求。squid 有许多不同的ACL类型。src 类型匹配客户IP 地址,squid 会针对客户HTTP 请求检查http_access 规则。这样,你需要增加两行:
v,k$@m2{ A0acl MyNetwork src 192.168.0.0/16
1Bq!E?V!i0http_access allow MyNetwork
请将这些行放在正确的位置。http_access 的顺序非常重要,但是acl 行的顺序你不必介意。你也该注意默认的配置文件包含了一些重要的访问控制,你不应该改变或删除它们,除非你完全理解它们的意义。在你第一次编辑squid.conf 文件时,请看如下注释: IXPUB技术博客3C&r)[#/t W3B2FH
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
在该注释之后,以及"http_access deny all"之前插入你自己的新规则。
为了彻底说明,如下是一个合理的初始访问控制配置,包括推荐的默认控制和早先的例子:
d?Ex:J&/6EdK0acl All src 0/0 IXPUB技术博客 ^XYI)bo
acl Manager proto cache_object IXPUB技术博客2xN6wng3hm!q
acl Localhost src 127.0.0.1/32 IXPUB技术博客Z2_ b7wQ(w `)Q@
acl Safe_ports port 80 21 443 563 70 210 280 488 591 777 1025-65535 IXPUB技术博客9dHUUR?T4RhA,r:S
acl SSL_ports 443 563 IXPUB技术博客w y%AaE%N
acl CONNECT method CONNECT IXPUB技术博客3m q&[J8`u/W
acl MyNetwork src 192.168.0.0/16 IXPUB技术博客E H4h;qQ
http_access allow Manager Localhost IXPUB技术博客8v~Q[&Q"Th X
http_access deny Manager IXPUB技术博客 p:T*Tnk
http_access deny !Safe_ports IXPUB技术博客9i-?T&Y+t;q1C
http_access deny CONNECT !SSL_ports
w2/fzi:LI6Z0http_access allow MyNetwork
z8_~*j%hi0http_access deny All
IXPUB技术博客9}X/q2i"DaP
4.6 可见主机名
希望你不必担心visible_hostname 指令。然而,假如squid 不能发现它所运行的机器的主机名,你就必须设置它。如果发生这样的事,squid 抱怨和拒绝运行: IXPUB技术博客!L.XEMN/Q4v6Byh r
% squid -Nd1
G'n1o;Fa:oO0FATAL: Could not determine fully qualified hostname. Please set 'visible_hostname'
有大量的理由使squid 需要知道主机名: IXPUB技术博客1R Z-PF(~l/^/Ag
+ 主机名出现在squid 的错误消息里,这帮助用户验证潜在问题的源头。
5jn5r /9uJ:M!I0+ 主机名出现在squid 转发的cache 单元的HTTP Via 头里。当请求到达原始主机时,Via头包含了在传输过程中涉及的代理列表。squid 也使用Via 头来检测转发环路。我将在第10章里讨论转发环路。
squid 对特定事务使用内部URL,例如 FTP 目录列表的图标。当squid 对FTP 目录产生HTML 页面时,它插入小图标用以指明该目录中的文件类型。图标URL 包含了cache 的主机名,以便web 浏览器能直接从squid 请求它们。
每个从squid 响应的HTTP 回复包含了X-Cache 头。这并非官方HTTP 头。它是一个扩展头,用以指明该响应是cache 点击还是cache 丢失。既然请求和响应可能经过多个cache,每个X-Cache 头包含了cache 报告点击或丢失的名字。如下是一个通过2 个cache 的响应示例: IXPUB技术博客;}"Lx[:F])rx
HTTP/1.0 200 OK
gBMVh*V2FNt0Date: Mon, 29 Sep 2003 22:57:23 GMT IXPUB技术博客(IE%|4Kf
Content-type: text/html
!Q?/$~ Um0W:sN,h$d0Content-length: 733 IXPUB技术博客"y1j9d"VE:^5_`B
X-Cache: HIT from bo2.us.ircache.net
}C3_J0{d ers&Zsm0X-Cache: MISS from bo1.us.ircache.net
squid 在启动时试图自动获取主机名。首先它调用gethostname()函数,这通常能返回正确的主机名。接着,squid 调用gethostbyname()函数尝试对主机名进行DNS 查询。该函数典型的返回IP 地址和系统的规范名。假如gethostbyname() 成功,squid 在错误消息里,Via 头里等地方使用这个规范名。
因为大量的理由,squid 可能不能检测到它的规范主机名,包括: IXPUB技术博客w c,Wi*Pi
+ 主机名可能未设置。
wK`S0{4o^Ao0+ 主机名可能从DNS 区域或/etc/hosts 文件里丢失。
squid 系统的DNS 客户端配置可能不正确或丢失。在unix 系统上,你该检查/etc/resolv.conf 和/etc/host.conf 文件。
假如你看到上述的致命错误,你必须修正主机名和DNS 信息,或者显式的给squid 指明主机名。在大多数情况下,请确认"hostname"命令返回一个完全规范的主机名,并且在/etc/hosts 文件里增加这个接口。假如这样不成功,请在squid.conf 里设置可见主机名:
lP Vm x/i0visible_hostname squid.packet-pushers.net
IXPUB技术博客0X `~ XE(f
4.7 管理联系信息
你应该设置cache_mgr 指令作为对用户的帮助。它是一个email 地址,假如问题发生,用户能写信给它。cache_mgr 地址默认出现在squid 的错误消息里。例如:
@j5{"]0S0cache_mgr squid@web-cache.net

qi`-])E ?'qc04.8 下一步
在创建了初步的配置文件后,你多少准备首次运行squid 了。请遵循下面章节的建议。
当你掌握了启动和停止squid 后,你该花费一些时间来改善配置文件。你可能想增加更高级的访问控制,这在第6 章里有描述。既然我在这里没有讨论磁盘cache,你该花些时间阅读第7 和第8 章。
第5章 运行Squid
5.1 squid 命令行选项
在开始其他事情之前,让我们先看一下squid 的命令行选项。这里的许多选项你从不会使用,另外有些仅仅在调试问题时有用。
-a port IXPUB技术博客+lg4FMe?%Rn
指定新的http_port 值。该选项覆盖了来自squid.conf 的值。然而请注意,你能在squid.conf里指定多个值。-a 选项仅仅覆盖配置文件里的第一个值。(该选项使用字母a 是因为在Harvest cache 里,HTTP 端口被叫做ASCII 端口)
-d level
(Y~$X*Md0让squid 将它的调试信息写到标准错误(假如配置了,就是cache.log 和syslog)。level参数指定了显示在标准错误里的消息的最大等级。在多数情况下,d1 工作良好。请见16.2章关于调试等级的描述。
-f file IXPUB技术博客8TE4i(q#~D%^
指定另一个配置文件。
-h IXPUB技术博客|Qx6N g~8LI
显示用法。
-k function
M af[3L*qd|0指示squid 执行不同的管理功能。功能参数是下列之一:reconfigure,rotate,shutdown,interrupt,kill,debug,check,or parse。 IXPUB技术博客Wv/C kYh
+ reconfigure 导致运行中的squid 重新读取配置文件。
#p;MB0I&H+t%d0+ rotate导致squid 滚动它的日志,这包括了关闭日志,重命名,和再次打开它们。
-K,G`f}v0+ shutdown 发送关闭squid 进程的信号。
3d sO#FW/]e0+ interrupt 立刻关闭squid,不必等待活动会话完成。
!uBA+L5N#m f8e0+ kill 发送KILL 信号给squid,这是关闭squid 的最后保证。
9e g&m/@4q.Q0P0+ debug 将squid 设置成完全的调试模式,假如你的cache 很忙,它能迅速的用完你的磁盘空间。 IXPUB技术博客o2h v0O!mj(]
+ check 简单的检查运行中的squid 进程,返回的值显示squid 是否在运行。 IXPUB技术博客 Ji$B:f${lK4Y |
+ 最后,parse 简单的解析squid.conf 文件,如果配置文件包含错误,进程返回非零值。
-s
H+b!S)Ls-M3n0激活将日志记录到syslog 进程。squid 使用LOCAL4 syslog 设备。0 级别调试信息以优先级LOG_WARNING 被记录,1 级别消息以LOG_NOTICE 被记录。更高级的调试信息不会被发送到syslogd.你可以在/etc/syslogd.conf 文件里使用如下接口:
u ?ak3b'[0local4.warning /var/log/squid.log
-u port
"[#z Qy$a2i(Y[:X0指定另一个ICP 端口号,覆盖掉squid.conf 文件里的icp_port。
-v
(_k'THE,J JjH lW0打印版本信息。
-z
?RS,h!_#l0初始化cache,或者交换,目录。在首次运行squid,或者增加新的cache 目录时,你必须使用该选项。
-C
1T|7v/A3i,Fy#s0阻止安装某些信号句柄,它们捕获特定的致命信号例如SIGBUS 和SIGSEGV。正常的,这些信号被squid 捕获,以便它能干净的关闭。然而,捕获这些信号可能让以后调试问题困难。使用该选项,致命的信号导致它们的默认动作,通常是coredump。
-D IXPUB技术博客VUO ] M&_:U3L
禁止初始化DNS 测试。正常情况下,squid 直到验证它的DNS 可用才能启动。该选项阻止了这样的检测。你也能在squid.conf 文件里改变或删除dns_testnames 选项。
-F
/8P/S'f X_0让squid 拒绝所有的请求,直到它重新建立起存储元数据。假如你的系统很忙,该选项可以减短重建存储元数据的时间。然而,如果你的cache 很大,重建过程可能会花费很长的时间。
-N
2]~ nU(z0W:R0阻止squid 变成后台服务进程。
-R
iu+^suu0VTp0阻止squid 在绑定HTTP 端口之前使用SO_REUSEADDR 选项。
-V IXPUB技术博客2Q4HhQ,LV8e
激活虚拟主机加速模式。类似于squid.conf 文件里的httpd_accel_host virtual 指令。
-X
8Aq t1nV _[4PV0强迫完整调试模式,如你在squid.conf 文件里指定debug_options ALL,9 一样。
-Y
F4W:}M#?}0在重建存储元数据时,返回ICP_MISS_NOFETCH 代替ICP_MISS.忙碌的父cache 在重建时,该选项可以导致最少的负载。请见10.6.1.2 章。

;b m3|LK05.2 对配置文件查错
在开启squid 之前,你应该谨慎的验证配置文件。这点容易做到,运行如下命令即可: IXPUB技术博客y9O/`%C]pd;u}G
%squid -k parse
假如你看不到输出,配置文件有效,你能继续后面的步骤。
然而,如果配置文件包含错误,squid 会告诉你: IXPUB技术博客zc}a1VRI
squid.conf line 62: http_access allow okay2
3|,GYQ!m~0aclParseAccessLine: ACL name 'okay2' not found.
这里你可以看到,62 行的http_access 指令指向的ACL 不存在。有时候错误信息很少: IXPUB技术博客 n5IZR `nU8n v'{
FATAL: Bungled squid.conf line 76: memory_pools
在这个情形里,我们忘记了在76 行的memory_pools 指令后放置on 或off。
建议你养成习惯:在每次修改配置文件后,使用squid -k parse。假如你不愿麻烦,并且你的配置文件有错误,squid 会告诉你关于它们而且拒绝启动。假如你管理着大量的cache,也许你会编辑脚本来自动启动,停止和重配置squid。你能在脚本里使用该功能,来确认配置文件是有效的。
IXPUB技术博客J?/$mzEJ
5.3 初始化cache 目录
在初次运行squid 之前,或者无论何时你增加了新的cache_dir,你必须初始化cache 目录。命令很简单:
2KR.}#Zw*W {WP0%squid –z
对UFS 相关的存储机制(ufs,aufs,and diskd;见第8 章),该命令在每个cache_dir 下面创建了所需的子目录。你不必担心squid 会破坏你的当前cache 目录(如果有的话)。
在该阶段属主和许可权是通常遇到的问题。squid 在特定的用户ID 下运行,这在squid.conf 文件里的cache_effective_user 里指定。用户ID 必须对每个cache_dir 目录有读和写权限。否则,你将看到如下信息: IXPUB技术博客 /}(X:c y%X
Creating Swap Directories
]9wq#Nl6l#s c1o0FATAL: Failed to make swap directory /usr/local/squid/var/cache/00:
#]DU6IFII_*_"U0(13) Permission denied
在这样的情形下,你该确认/usr/local/squid/var/cache 目录的所有组成都可被squid.conf给定的用户ID 访问。最终的组件--cache 目录--必须对该用户ID 可写。
cache 目录初始化可能花费一些时间,依赖于cache 目录的大小和数量,以及磁盘驱动器的速度。假如你想观察这个过程,请使用-X 选项: IXPUB技术博客.[g2RJ;k
%squid –zX
IXPUB技术博客2ZO(R!B z
5.4 在终端窗口里测试squid
一旦你已经初始化cache 目录,就可以在终端窗口里运行squid,将日志记录到标准错误。这样,你能轻易的定位任何错误或问题,并且确认squid 是否成功启动。使用-N 选项来保持squid 在前台运行,-d1 选项在标准错误里显示1 级别的调试信息。
K)kR? l-]V8s0%squid -N -d1
你将看到类似于以下的输出:
"z"w)v,a(WY Y*@z02003/09/29 12:57:52| Starting Squid Cache
/_7lJ-]P}#[4E)~0version 2.5.STABLE4 for i386-unknown-freebsd4.8... IXPUB技术博客0C z6Bw*|%C+X
2003/09/29 12:57:52| Process ID 294 IXPUB技术博客p(hbIM,W
2003/09/29 12:57:52| With 1064 file descriptors available IXPUB技术博客y;O d&aYqc~8ZZ
2003/09/29 12:57:52| DNS Socket created on FD 4 IXPUB技术博客wF*yh#H
2003/09/29 12:57:52| Adding nameserver 206.107.176.2 from /etc/resolv.conf IXPUB技术博客m2B:N0s i#U
2003/09/29 12:57:52| Adding nameserver 205.162.184.2 from /etc/resolv.conf IXPUB技术博客.`2H)L;/fu;|P8Y
2003/09/29 12:57:52| Unlinkd pipe opened on FD 9 IXPUB技术博客@[h;S"KdUpf
2003/09/29 12:57:52| Swap maxSize 102400 KB, estimated 7876 objects IXPUB技术博客8G Y{,r"Od5B0Q v
2003/09/29 12:57:52| Target number of buckets: 393 IXPUB技术博客;n:F;R:X3j)|d
2003/09/29 12:57:52| Using 8192 Store buckets IXPUB技术博客0CFN1R#p"f9`
2003/09/29 12:57:52| Max Mem size: 8192 KB
)^AI5}D4e"O,r+|02003/09/29 12:57:52| Max Swap size: 102400 KB IXPUB技术博客 c c2Pm/K8P5oy
2003/09/29 12:57:52| Rebuilding storage in /usr/local/squid/var/cache (DIRTY)
,j)R_Kut3C4e02003/09/29 12:57:52| Using Least Load store dir selection
!fB#C2rIK]'I02003/09/29 12:57:52| Set Current Directory to /usr/local/squid/var/cache IXPUB技术博客X/xY y#DJ)k
2003/09/29 12:57:52| Loaded Icons.
o lA9T"O@02003/09/29 12:57:52| Accepting HTTP connections at 0.0.0.0, port 3128, FD 11. IXPUB技术博客N+k9Z H[D
2003/09/29 12:57:52| Accepting ICP messages at 0.0.0.0, port 3130, FD 12.
J$u[Q XVN J02003/09/29 12:57:52| WCCP Disabled.
7xV.f;b9[5Z02003/09/29 12:57:52| Ready to serve reques
假如你看到错误消息,你该首先修正它。请检查输出信息的开始几行以发现警告信息。最普通的错误是文件/目录许可问题,和配置文件语法错误。假如你看到一条不引起注意的错误消息,请见16 章中关于squid 故障处理的建议和信息。如果还不行,请检查squid FAQ,或查找邮件列表来获得解释。
一旦你见到"Ready to serve requests"消息,就可用一些HTTP 请求来测试squid。配置你的浏览器使用squid 作为代理,然后打开某个web 页面。假如squid 工作正常,页面被迅速载入,就象没使用squid 一样。另外,你可以使用squidclient 程序,它随squid 发布:
A0@ Ec*ts0% squidclient http://www.squid-cache.org/
假如它正常工作,squid 的主页html 文件会在你的终端窗口里滚动。一旦确认squid 工作正常,你能中断squid 进程(例如使用ctrl-c)并且在后台运行squid。

'l+S&ne:b3N05.5 将squid 作为服务进程运行
正常情况下你想将squid 以后台进程运行(不出现在终端窗口里)。最容易的方法是简单执行如下命令: IXPUB技术博客!PCF8t"Bs4Qk
%squid –s
-s 选项导致squid 将重要的状态和警告信息写到syslogd。squid 使用LOCAL4 设备,和LOG_WARNING 和LOG_NOTICE 优先权。syslog 进程实际可能会或不会记录squid 的消息,这依赖于它被如何配置。同样的消息被写进cache.log 文件,所以假如你愿意,忽略-s 选项也是安全的。
当你不使用-N 选项来启动squid,squid 自动在后台运行并且创建父/子进程对。子进程做所有的实际工作。父进程确认子进程总在运行。这样,假如子进程意外终止,父进程启动另外一个子进程以使squid 正常工作。通过观察syslog 消息,你能看到父/子进程交互作用。 IXPUB技术博客2N'A5p.w+Z3yZ
Jul 31 14:58:35 zapp squid[294]: Squid Parent: child process 296 started
这里显示的父进程ID 是294,子进程是296。当你查看ps 的输出,你可以看到子进程以(squid)形式出现:
5C h*}kM"`Q0%ps ax | grep squid IXPUB技术博客f1sWJ(T]s
294 ?? Is 0:00.01 squid -sD
@"`U H r0296 ?? S 0:00.27 (squid) -sD (squid)
假如squid 进程意外终止,父进程启动另一个。例如:
2V;eXv,@ JA0Jul 31 15:02:53 zapp squid[294]: Squid Parent: child process 296 exited due to signal 6 IXPUB技术博客&|_|)|&x*p y
Jul 31 15:02:56 zapp squid[294]: Squid Parent: child process 359 started
在某些情形下,squid 子进程可能立即终止。为了防止频繁的启动子进程,假如子进程连续5 次没有运行至少10 秒钟,父进程会放弃。
'?9L[ F&f{V!z0Jul 31 15:13:48 zapp squid[455]: Squid Parent: child process 474 exited with status 1 IXPUB技术博客#lY1G'E0pz
Jul 31 15:13:48 zapp squid[455]: Exiting due to repeated, frequent failures
如果发生这样的事,请检查syslog 和squid 的cache.log 以发现错误。

];G6e MT-O2V n B4a05.5.1 squid_start 脚本
当squid 以后台进程运行时,它查找squid 执行程序目录下的名为squid_start 的文件。假如发现,该程序在父进程创建子进程之前被执行。你能使用该脚本完成特定的管理任务,例如通知某人squid 在运行,管理日志文件等。除非squid_start 程序存在,squid 不会创建子进程。
squid_start 脚本在你使用绝对或相对路径启动squid 时才开始工作。换句话说,squid 不使用PATH 环境变量来定位squid_start.这样,你应该养成习惯这样启动squid: IXPUB技术博客'unoL(y
% /usr/local/squid/sbin/squid –sD
而不要这样:
zj~TUdx3G0%squid –sD

d Lv/]Z5k]"TO05.6 启动脚本
通常你希望squid 在每次计算机重启后自动启动。对不同的操作系统,它们的启动脚本如何工作也很不同。我在这里描述一些通用的环境,但对你自己的特殊操作系统,也许该有特殊的处理方法。

{_+m9w)dK"A05.6.1 /etc/rc.local
最容易的机制之一是/etc/rc.local 脚本。这是个简单的shell 脚本,在每次系统启动时以root 运行。使用该脚本来启动squid 非常容易,增加一行如下:
p~uP3[Z X0/usr/local/squid/sbin/squid –s
当然你的安装位置可能不同,还有你可能要使用其他命令行选项。不要在这里使用-N选项。
假如因为某些理由,你没有使用cache_effective_user 指令,你可以尝试使用su 来让squid以非root 用户运行: IXPUB技术博客6M p:c_ `U s)sW l+Z8H
/usr/bin/su nobody -c '/usr/local/squid/sbin/squid -s'

;FCFo3x5/:@05.6.2 init.d 和rc.d
init.d 和rc.d 机制使用独立的shell 脚本来启动不同的服务。这些脚本通常在下列目录之中:/sbin/init.d, /etc/init.d, /usr/local/etc/rc.d.脚本通常获取单一命令行参数,是start 或stop。某些系统仅仅使用start 参数。如下是启动squid 的基本脚本: IXPUB技术博客Pr*XA vdi
#!/bin/sh IXPUB技术博客C5J#cc.JX
# this script. starts and stops Squid
e8v#F|1dBZ)x0case "$1" in
8jx$nz!DE0start)
Cvo.YxoZ0/usr/local/squid/sbin/squid -s
O2z0po9FXU5f ` c UF-o0echo -n ' Squid'
+~x@ZQ0;; IXPUB技术博客$m&zC$J#KAd
stop)
!S ^(Q2_4l0/usr/local/squid/sbin/squid -k shutdown IXPUB技术博客;TzH-y _4_2j
;; IXPUB技术博客1l `3]"P H R H
esac
Linux 用户可能在启动squid 之前需要设置文件描述符限制。例如: IXPUB技术博客O@/s{T
echo 8192 >; /proc/sys/fs/file-max IXPUB技术博客U:}C:_y
limit -HSn 8192
为了使用该脚本,先找到脚本存放的目录。给它一个有意义的名字,类似于其他的系统启动脚本。可以是S98squid 或squid.sh。通过重启计算机来测试该脚本,而不要假想它会正常工作。

Px TFs7N05.6.3 /etc/inittab
某些操作系统支持另一种机制,是/etc/inittab 文件。在这些系统中,init 进程启动和停止基于运行等级的服务。典型的inittab 接口类似如此: IXPUB技术博客$k3lW yo[ ]
sq:2345nce:/usr/local/squid/sbin/squid –s
使用该接口,init 进程启动squid 一次并且随后忘记它。squid 确认它驻留在运行状态,象前面描述的一样。或者,你能这样做: IXPUB技术博客y0cJDX!Ik_
sq:2345:respawn:/usr/local/squid/sbin/squid –Ns
这里我们使用了respawn 选项,假如进程不存在init 会重启squid。假如使用respawn,请确认使用-N 选项。
在编辑完inittab 文件后,使用下面的命令来使init 重新读取它的配置文件和启动squid:
~*fM;~'/N0# init q

#C1x$Tf'Q,e05.7 chroot 环境
某些人喜欢在chroot 环境运行squid。这是unix 的功能,给予进程新的root 文件系统目录。在squid 受安全威胁时,它提供额外等级的安全保护。假如攻击者在某种程度上通过squid获取了对操作系统的访问权,她仅仅能访问在chroot 文件系统中的文件。在chroot 树之外的系统文件,她不可访问。
最容易在chroot 环境里运行squid 的方法是,在squid.conf 文件里指定新的root 目录,如下:
l/nL6I4^I1~0chroot /new/root/directory
chroot()系统调用需要超级用户权限,所以你必须以root 来启动squid。
chroot 环境不是为unix 新手准备的。它有点麻烦,因为你必须在新的root 目录里重复放置大量的文件。例如,假如默认的配置文件正常在/usr/local/squid/etc/squid.conf,并且你使用chroot 指令,那么文件必须位于/new/root/directory/usr/local/squid/etc/squid.conf.你必须将位于$prefix/etc,$prefix/share,$prefix/libexec 下的所有文件拷贝到chroot 目录。请确认$prefix/var 和cache 目录在chroot 目录中存在和可写。
同样的,你的操作系统需要将大量的文件放在chroot 目录里,例如/etc/resolv.conf 和/dev/null.假如你使用外部辅助程序,例如重定向器(见11 章)或者验证器(见12 章),你也需要来自/usr/lib 的某些共享库。你可以使用ldd 工具来查找给定的程序需要哪些共享库: IXPUB技术博客+D0{Xq|Z/^
% ldd /usr/local/squid/libexec/ncsa_auth IXPUB技术博客b?/F-o7N
/usr/local/squid/libexec/ncsa_auth:
+z@*CK2o`0libcrypt.so.2 =>; /usr/lib/libcrypt.so.2 (0x28067000)
S _ |.E'cDn0libm.so.2 =>; /usr/lib/libm.so.2 (0x28080000)
5e c)}3n D0libc.so.4 =>; /usr/lib/libc.so.4 (0x28098000)
你可以使用chroot 命令来测试辅助程序:
b"s7O*U5S*|Ao7j*{#dG0# chroot /new/root/directory /usr/local/squid/libexec/ncsa_auth IXPUB技术博客 w2i1Jw{8sux
/usr/libexec/ld-elf.so.1: Shared object "libcrypt.so.2" not found
更多的关于chroot 的信息,请见你系统中chroot()的manpage。

+Y}t w*Z%}05.8 停止squid
最安全的停止squid 的方法是使用squid -k shutdown 命令: IXPUB技术博客-h.e9Y~P`7z'i
%squid -k shutdown
该命令发送TERM 信号到运行中的squid 进程。在接受到TERM 信号后,squid 关闭进来的套接字以拒收新请求。然后它等待一段时间,用以完成外出请求。默认时间是30 秒,你可以在shutdown_lifetime 指令里更改它。
&Ckr E;a"^:^0假如因为某些理由,squid.pid 文件丢失或不可读,squid -k 命令会失败。在此情形下,你可以用ps 找到squid 的进程ID,然后手工杀死squid。例如:
%/,Y!|*NyJh^ z0%ps ax |grep squid
假如你看到不止一个squid 进程,请杀死以(squid)显示的那个。例如: IXPUB技术博客)T$X[.Fi4Y7I
% ps ax | grep squid
&h1U V'X pl+m` [k0294 ?? Is 0:00.01 squid -sD
R1V4dagN0296 ?? S 0:00.27 (squid) -sD (squid) IXPUB技术博客U0N;Dsjp6Z`iw
% kill -TERM 296
在发送TERM 信号后,你也许想查看日志,以确认squid 已关闭:
fC-t;B'ku#o0% tail -f logs/cache.log IXPUB技术博客-W,p|+]SC3f$v
2003/09/29 21:49:30| Preparing for shutdown after 9316 requests
a1e&f ByG02003/09/29 21:49:30| Waiting 10 seconds for active connections to finish
Rc7l"}oVI:C02003/09/29 21:49:30| FD 11 Closing HTTP connection
Eg Ky2xQV_7J(wC;RZ7q02003/09/29 21:49:31| Shutting down... IXPUB技术博客S&Z6L&cKPn
2003/09/29 21:49:31| FD 12 Closing ICP connection
m;Yu]*J'^!t-u~02003/09/29 21:49:31| Closing unlinkd pipe on FD 9
|B _ml @R02003/09/29 21:49:31| storeDirWriteCleanLogs: Starting...
tU-I,j^,Cg02003/09/29 21:49:32| Finished. Wrote 253 entries.
la;Mm`_+~9]K02003/09/29 21:49:32| Took 0.1 seconds (1957.6 entries/sec). IXPUB技术博客C8x2M(]0g#^
2003/09/29 21:49:32| Squid Cache (Version 2.5.STABLE4): Exiting normally.
假如你使用squid -k interrupt 命令,squid 立即关闭,不用等待完成活动请求。这与在kill 里发送INT 信号相同。
IXPUB技术博客!j1y IMefj&N(iH
5.9 重配置运行中的squid 进程
在你了解了更多关于squid 的知识后,你会发现对squid.conf 文件做了许多改动。为了让新设置生效,你可以关闭和重启squid,或者在squid 运行时,重配置它。
重配置运行中的squid 最好的方法是使用squid -k reconfigure 命令:
SN'UKbUBK*v0%squid -k reconfigure
当你运行该命令时,HUP 信号被发送到运行中的squid 进程。然后squid 读取和解析squid.conf 文件。假如操作成功,你可以在cache.log 里看到这些:
b"Jk3lLHsiS P02003/09/29 22:02:25| Restarting Squid Cache (version 2.5.STABLE4)...
2?Ud6aw5Ik)T/'m02003/09/29 22:02:25| FD 12 Closing HTTP connection
$Mz[2e5D;?.]E02003/09/29 22:02:25| FD 13 Closing ICP connection IXPUB技术博客mg$kU?6/J]
2003/09/29 22:02:25| Cache dir '/usr/local/squid/var/cache' size remains unchanged IXPUB技术博客.VKz"R;D$i)L/P
at 102400 KB
3^k5vQ+aID02003/09/29 22:02:25| DNS Socket created on FD 5 IXPUB技术博客:pa!BH1g*V.{.Z`
2003/09/29 22:02:25| Adding nameserver 10.0.0.1 from /etc/resolv.conf IXPUB技术博客xa8c.a)G'uV3F
2003/09/29 22:02:25| Accepting HTTP connections at 0.0.0.0, port 3128, FD 9. IXPUB技术博客?C{-|r8{/yc7Mr_
2003/09/29 22:02:25| Accepting ICP messages at 0.0.0.0, port 3130, FD 11.
9o'/"zIB$s02003/09/29 22:02:25| WCCP Disabled.
p[i0gmH8e O Ppk5f02003/09/29 22:02:25| Loaded Icons.
6[?,q~ m02003/09/29 22:02:25| Ready to serve requests.
在使用reconfigure 选项时你须谨慎,因为所做的改变可能会导致致命错误。例如,请注意squid 关闭和重新打开进来的HTTP 和ICP 套接字;假如你将http_port 改变为squid 不能打开的端口,它会发生致命错误并退出。
在squid 运行时,某些指令和和选项不能改变,包括: IXPUB技术博客p(I d7F8A$`Y/S*g-^a
+ 删除cache 目录(cache_dir 指令)
YS,r le0+ 改变store_log 指令
~f.o^eT xhTre0+ 改变coss cache_dir 的块大小数值。事实上,无论何时你改变了该值,你必须重新初始化coss cache_dir。 IXPUB技术博客aj3r3F/o|
+ coredump_dir 指令在重配置过程中不被检查。所以,在squid 已经启动了后,你不能让squid 改变它的当前目录。
solaris 用户在重配置squid 过程中可能遇到其他问题。solaris 的stdio 执行组件里的fopen()调用要求使用小于256 的未用文件描述符。FILE 结构以8 位值存储该文件描述符。正常情况下这不构成问题,因为squid 使用底层I/O(例如open())来打开cache 文件。然而,在重配置过程中的某些任务使用fopen(),这就有可能失败,因为前面的256 个文件描述符已被分配出去。
IXPUB技术博客w"C/gIL#j/r|
5.10 滚动日志文件
除非你在squid.conf 里禁止,squid 会写大量的日志文件。你必须周期性的滚动日志文件,以阻止它们变得太大。squid 将大量的重要信息写入日志,假如写不进去了,squid 会发生错误并退出。为了合理控制磁盘空间消耗,在cron 里使用如下命令:
@u*V r6w`.N H2|r0%squid -k rotate
例如,如下任务接口在每天的早上4 点滚动日志:
:_4RW6l(Z1R+^B00 4 * * * /usr/local/squid/sbin/squid -k rotate
该命令做两件事。首先,它关闭当前打开的日志文件。然后,通过在文件名后加数字扩展名,它重命名cache.log,store.log,和access.log。例如,cache.log 变成cache.log.0,cache.log.0变成cache.log.1,如此继续,滚动到logfile_rotate 选项指定的值。
squid 仅仅保存每个日志文件的最后logfile_rotate 版本。更老的版本在重命名过程中被删除。假如你想保存更多的拷贝,你需要增加logfile_rotate 限制,或者编写脚本用于将日志文件移动到其他位置。
请见13.7 章关于滚动日志的其他信息。
6.访问控制
6.1 访问控制元素
ACL 元素是Squid 的访问控制的基础。这里告诉你如何指定包括IP 地址,端口号,主机名,和URL 匹配等变量。每个ACL 元素有个名字,在编写访问控制规则时需要引用它们。基本的ACL 元素语法如下:
/[F%l+j*jQ0acl name type value1 value2 ...
例如: IXPUB技术博客XV*T5u1ZP
acl Workstations src 10.0.0.0/16
在多数情况下,你能对一个ACL 元素列举多个值。你也可以有多个ACL 行使用同一个名字。例如,下列两行配置是等价的: IXPUB技术博客 lx.O+_f$[(Pc'_
acl http_ports port 80 8000 8080
e:z.M&W1|s@0acl Http_ports port 80 IXPUB技术博客1d,Zgn/B
acl Http_ports port 8000 IXPUB技术博客q a5B Y$x+aqQ:oZ
acl Http_ports port 8080
6.1.1 一些基本的ACL 类型
Squid 大约有25 个不同的ACL 类型,其中的一些有通用基本类型。例如,src 和dst ACL使用IP 地址作为它们的基本类型。为避免冗长,我首先描述基本类型,然后在接下来章节里描述每种ACL 类型。
6.1.1.1 IP 地址
使用对象:src,dst,myip IXPUB技术博客&f:hTZ E)S1l/[:t+^
squid 在ACL 里指定IP 地址时,拥有强有力的语法。你能以子网,地址范围,域名等形式编写地址。squid 支持标准IP 地址写法(由”.”连接的4 个小于256 的数字)和无类域间路由规范。另外,假如你忽略掩码,squid 会自动计算相应的掩码。例如,下例中的每组是相等的:
B] Jbea G^0acl Foo src 172.16.44.21/255.255.255.255
&VZ E'H(h1P%x0acl Foo src 172.16.44.21/32
oG+V6A*U| oo0acl Foo src 172.16.44.21
(B6~;P1H0h0Y u/B0acl Xyz src 172.16.55.32/255.255.255.248
%ZRm/b+iU v0acl Xyz src 172.16.55.32/28
w9V3mu*J9G0acl Bar src 172.16.66.0/255.255.255.0 IXPUB技术博客Gz?)T h9}0n
acl Bar src 172.16.66.0/24 IXPUB技术博客7N.HE3B9vX t
acl Bar src 172.16.66.0
当你指定掩码时,squid 会检查你的工作。如果你的掩码在IP 地址的非零位之外,squid会告警。例如,下列行导致告警:
N6tq3TI r0acl Foo src 127.0.0.1/8 IXPUB技术博客2G&X$~McFX)s
aclParseIpData: WARNING: Netmask masks away part of the specified IP in 'Foo'
这里的问题是/8 掩码(255.0.0.0)在最后三个字节里都是零值,但是IP 地址127.0.0.1不是这样的。squid 警告你这个问题,以便你消除歧义。正确的写法是: IXPUB技术博客 [D g2i{#H
acl Foo src 127.0.0.1/32 IXPUB技术博客u:?(g1wvn
or: IXPUB技术博客l'WThY1?
acl Foo src 127.0.0.0/8
有时候你可能想列举多个相邻子网,在这样的情况下,通过指定地址范围很容易做到。例如:
8QI2RMm|+C0acl Bar src 172.16.10.0-172.16.19.0/24
这等价但高效于下面的行:
)uL0/ T*B'Z6s&xs0acl Foo src 172.16.10.0/24
;V:S&NK"ZJ U3LA$QC0acl Foo src 172.16.11.0/24
ky vxvBL6{0acl Foo src 172.16.12.0/24
9e hn5Rt4UVS0acl Foo src 172.16.13.0/24 IXPUB技术博客8K ^#p[?/X8{!v
acl Foo src 172.16.14.0/24 IXPUB技术博客!] is Ev)v
acl Foo src 172.16.15.0/24 IXPUB技术博客Z Pj{.saP2Wq
acl Foo src 172.16.16.0/24 IXPUB技术博客H Q7Ii Z{(UV
acl Foo src 172.16.18.0/24 IXPUB技术博客/D tU X9X
acl Foo src 172.16.19.0/24
注意使用IP 地址范围,掩码只能取一个。你不能为范围里的地址设置多个不同掩码。
你也能在IP ACL 里指定主机名,例如: IXPUB技术博客7l,p,y-f C*b:QnQ'S
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 会警告你。例如,如下不被允许: IXPUB技术博客/aL,q0@$X?K
acl Foo src 1.2.3.0/24
7` @MX jg/~mL0acl Foo src 1.2.3.4/32
它导致squid 在cache.log 里打印警告: IXPUB技术博客&[D?'_!r
WARNING: '1.2.3.4' is a subnetwork of '1.2.3.0/255.255.255.0'
1U%KCzC fT2G0WARNING: because of this '1.2.3.4' is ignored to keep splay tree searching predictable
E"H'H(A;kiU a+T4?o0WARNING: You should probably remove '1.2.3.4' from the ACL named 'Foo'
在该情形下,你需要修正这个问题,可以删除其中一个ACL 值,或者将它们放置在不同的ACL 列表中。
IXPUB技术博客 PD2[ }8s
6.1.1.2 域名
使用对象:srcdomain,dstdomain,和cache_host_domain 指令域名简单的就是DNS 名字或区域。例如,下面是有效的域名:
k(f2N+T!q1O5y TI$^0 www.squid-cache.org IXPUB技术博客],^.b8f] ?6[
squid-cache.org
(y'Q!FJ/? RU0org
域名ACL 有点深奥,因为相对于匹配域名和子域有点微妙的差别。当ACL 域名以"."开头,squid 将它作为通配符,它匹配在该域的任何主机名,甚至域名自身。相反的,如果ACL 域名不以"."开头,squid 使用精确的字符串比较,主机名同样必须被严格检查。
表6-1 显示了squid 的匹配域和主机名的规则。第一列显示了取自URL 请求的主机名(或者srcdomain ACL 的客户主机名)。第二列指明是否主机名匹配lrrr.org。第三列显示是否主机名匹配.lrrr.org ACL。你能看到,唯一的不同在第二个实例里。 IXPUB技术博客9ZZ*~(]'f
Table 6-1. Domain name matching IXPUB技术博客2~-[Y^E E-VI#Z
___________________________________________________________________
1/A6B3w ~{-|/rE9c0__URL hostname_____Matches ACL lrrr.org? ____Matches ACL .lrrr.org?
S{v`5q0S0__lrrr.org_________Yes_______________________Yes
$R.?4BRw/Ev0__i.am.lrrr.org____No________________________Yes
u6kU&l(`:|0__iamlrrr.org______No________________________No
N2r{o T%de/rI0___________________________________________________________________
a ~7J)jd [ DV mw0**说明:为了表现表格形状,“__”仅代表空格分隔符,没有任何实际意义(段誉 注释)。
域名匹配可能让人迷惑,所以请看第二个例子以便你能真正理解它。如下是两个稍微不同的ACL:
!LH1S,xy6b$~N.p0acl A dstdomain foo.com
G&j;~9MVqoA0acl B dstdomain .foo.com
用户对 http://www.foo.com/的请求匹配ACL B,但不匹配A。ACL A 要求严格的字符串 IXPUB技术博客)V3I1W kA;/l
匹配,然而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 机制。换句话说,在配置文件里放置如下语句是错误的: IXPUB技术博客cB|emJ.@&s
acl Foo dstdomain .lrrr.org   .am.lrrr.org
假如你这样做,squid 会产生如下警告信息:
2{#e(wn`-S b/f0WARNING: '.am.lrrr.org' is a subdomain of '.lrrr.org' IXPUB技术博客l5G2@r$VN8R
WARNING: because of this '.am.lrrr.org' is ignored to keep splay tree searching predictable
zm"V kO-EN K*^6x0WARNING: You should probably remove '.am.lrrr.org' from the ACL named 'Foo'
在该情况下你应遵循squid 的建议。删除其中一条相关的域名,以便squid 明确知道你的意图。注意你能在不同的ACL 里任意使用这样的域名: IXPUB技术博客%pu"~M%C#inw
acl Foo dstdomain .lrrr.org IXPUB技术博客`;Xw.{0{$G?
acl Bar dstdomain .am.lrrr.org
这是允许的,因为每个命名ACL 使用它自己的splay tree.

F!_ Yr*UU p06.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 通常这样配置。
IXPUB技术博客qs9St/D S&R@
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 来说,最常使用的正则表达式功能用以匹配字符串的开头或结尾。例如,^字符是特殊元字符,它匹配行或字符串的开头: IXPUB技术博客2WgRL Fa._
^http://
该正则表达式匹配任意以http://开头的URL。$也是特殊的元字符,因为它匹配行或字 IXPUB技术博客$V$Y]3k@KU6}2o?
符串的结尾: IXPUB技术博客U5f8jd)g&i
.jpg$
实际上,该示例也有些错误,因为.字符也是特殊元字符。它是匹配任意单个字符的通配符。我们实际想要的应该是:
Wpx g.nx0/.jpg$
反斜杠对这个"."进行转义。该正则表达式匹配以.jpg 结尾的任意字符串。假如你不使用^或$字符,正则表达式的行为就象标准子串搜索。它们匹配在字符串里任何位置出现的单词或词组。
对所有的squid 正则表达式类,你可以使用大小写敏感的选项。匹配是默认大小写敏感的。为了大小写不敏感,在ACL 类型后面使用-i 选项。例如:
#C6LghN7Y(Pqik0acl Foo url_regex -i ^http://www
IXPUB技术博客Qmb'F^,j:b
6.1.1.5 TCP 端口号
使用对象:port,myport
该类型是相对的。值是个别的端口号或端口范围。回想一下TCP 端口号是16 位值,这样它的值必须大于0 和小于65536。如下是一些示例:
_!uUZgB'c D vg,x d0acl Foo port 123
Dk*d ng V!y0acl Bar port 1-1024

k$|I6Op06.1.1.6 自主系统号
C{-c ^j-j-y#ep,OV0使用对象:src_as,dst_as IXPUB技术博客S$iH4ty]PK
Internet 路由器使用自主系统(AS)号来创建路由表。基本上,某个AS 号指向被同一组织管理的IP 网络范围。例如,我的ISP 分配了如下网络块:134.116.0.0/16, 137.41.0.0/16, 206.168.0.0/16,和其他更多。在Internet 路由表里,这些网络被公布为属于AS 3404。当路由器转发包时,它们典型的选择经过最少AS 的路径。假如这些对你不重要,请不必关注它们。AS 基础的ACL 仅仅被网络gurus 使用。
如下是基于AS 的类型如何工作的:当squid 首先启动时,它发送一条特殊的查询到某个whois 服务器。查询语句基本是:“告诉我哪个IP 网络属于该AS 号”。这样的信息被RADB收集和管理。一旦Squid 接受到IP 网络列表,它相似的将它们作为IP 基础的ACL 对待。
基于AS 的类型仅仅在ISP 将他们的RADB 信息保持与日更新时才工作良好。某些ISP更新RADB 比其他人做得更好;而许多根本不更新它。请注意squid 仅仅在启动或者reconfigure 时才将AS 号转换为网络地址。假如ISP 更新了它的RADB 接口,除非你重启或者重配置squid,squid 不会知道这个改变。
另外的情况是,在你的squid 启动时,RADB可能不可到达。假如Squid 不能联系上RADB服务器,它从访问控制配置里删除AS 接口。默认的whois 服务器是whois.ra.net,对许多用户来说太遥远了而不可信赖。

/f/m JPe*Sg0H06.1.2 ACL 类型
现在我们能把焦点放在ACL 类型自身上。我在这里按照重要性的降序来列举它们。

M4c-E^7xw m/F06.1.2.1 src
IP 地址在访问控制元素里是最普遍使用的。大部分站点使用IP 地址来控制客户允许或不允许访问Squid。src 类型指客户源IP 地址。也就是说,当src ACL 出现在访问控制列表里时,squid 将它与发布请求的客户IP 地址进行比较。
正常情况下你允许来自内网中主机的请求,并阻塞其他的。例如,假如你的单位使用192.168.0.0 子网,你可以这样指定ACL:
#_4d(dG%~.g-@[0acl MyNetwork src 192.168.0.0
假如你有许多子网,你能在同一个acl 行里面列举它们: IXPUB技术博客4Tsn.ox X
acl MyNetwork src 192.168.0.0 10.0.1.0/24 10.0.5.0/24 172.16.0.0/12
squid 有许多其他ACL 类型用以检查客户地址。srcdomain 类型比较客户的完整可验证域名。它要求反向DNS 查询,这可能会延缓处理该请求。srcdom_regex ACL 是类似的,但它允许你使用正则表达式来匹配域名。最后,src_as 类型比较客户的AS 号。

.U%jH3_Q-Y5T06.1.2.2 dst
dst 类型指向原始服务器(目标)IP 地址。在某些情况下,你能使用该类型来阻止你的用户访问特定web 站点。然而,在使用dst ACL 时你须谨慎。大部分squid 接受到的请求有原始服务器主机名。例如:
U5C |E;AZ z0GET http://www.web-cache.com/HTTP/1.0
这里, www.web-cache.com是主机名。当访问列表规则包含了dst 元素时,squid 必须找到该主机名的IP 地址。假如squid 的IP 缓存包含了该主机名的有效接口,这条ACL 被立即检测。否则,在DNS 查询忙碌时,squid 会延缓处理该请求。这对某些请求来说会造成延时。
为了避免延时,你该尽可能的使用dstdomain ACL 类型来代替dst。
如下是简单的dst ACL 示例:
@ SD xO'f3d/r)R0acl AdServers dst 1.2.3.0/24
请注意,dst ACL 存在的问题是,你试图允许或拒绝访问的原始服务器可能会改变它的IP 地址。假如你不关心这样的改变,那就不必麻烦去升级squid.conf。你可以在acl 行里放上主机名,但那样会延缓启动速度。假如你的ACL 需要许多主机名,你也许该预处理配置文件,将主机名转换成IP 地址。

'M)uJ^SR0s06.1.2.3 myip
myip 类型指Squid 的IP 地址,它被客户连接。当你在squid 机上运行netstat -n 时,你见到它们位于本地地址列。大部分squid 安装不使用该类型。通常所有的客户连接到同一个IP 地址,所以该ACL元素仅仅当系统有多个IP 地址时才有用。
为了理解myip为何有用,考虑某个有两个子网的公司网络。在子网1的用户是程序员和工程师。子网2包括会计,市场和其他管理部门。这样情况下的squid 有三个网络接口:一个连接子网1,一个连接子网2,第三个连接到外部因特网。
当正确的配置时,所有在子网1 的用户连接到squid 位于该子网的IP 地址,类似的,子网2 的用户连接到squid 的第二个IP 地址。这样你就可以给予子网1 的技术部员工完全的访问权,然而限制管理部门的员工仅仅能访问工作相关的站点。
ACL 可能如下:
3e q6m5we7Nq0acl Eng myip 172.16.1.5 IXPUB技术博客g:Lw9e*T8c
acl Admin myip 172.16.2.5
然而请注意,使用该机制你必须特别小心,阻止来自某个子网的用户连接squid 位于另一子网的IP 地址。否则,在会计和市场子网的聪明的用户,能够通过技术部子网进行连接,从而绕过你的限制。

hH a1H'Q]8x6tzT'W06.1.2.4 dstdomain
在某些情况下,你发现基于名字的访问控制非常有用。你可以使用它们去阻塞对某些站点的访问,去控制squid 如何转发请求,以及让某些响应不可缓存。dstdomain 之所以非常有用,是因为它检查请求url 里的主机名。
然而首先我想申明如下两行的不同: IXPUB技术博客R$G7t9vYY
acl A dst www.squid-cache.org IXPUB技术博客&{?m}5y%Ak R'/
acl B dstdomain www.squid-cache.org
A 实际上是IP 地址ACL。当Squid 解析配置文件时,它查询 www.squid-cache.org的IP地址,并将它们存在内存里。它不保存名字。假如在squid 运行时IP 地址改变了,squid 会继续使用旧的地址。
然而dstdomain ACL 以域名形式存储,并非IP 地址。当squid 检查ACL B 时,它对URL的主机名部分使用字符串比较功能。在该情形下,它并不真正关心是否 www.squid-cache.org IXPUB技术博客as%LV;[9hh:P
的IP 地址改变了。
使用dstdomain ACL 的主要问题是某些URL 使用IP 地址代替主机名。假如你的目标是使用dstdomain ACL 来阻塞对某些站点的访问,聪明的用户能手工查询站点的IP 地址,然后将它们放在URL 里。例如,下面的2 行URL 带来同样的页面:
/c4H6[E'x&UR J0 http://www.squid-cache.org/docs/FAQ/ IXPUB技术博客r-h+u(Cc/aX n
http://206.168.0.9/docs/FAQ/
第一行能被dstdomain ACL 轻易匹配,但第二行不能。这样,假如你依靠dstdomain ACL,你也该同样阻塞所有使用IP 地址代替主机名的请求。请见6.3.8 章节。
IXPUB技术博客y$v Dx9} G:O Gk
6.1.2.5 srcdomain
srcdomain ACL 也有点麻烦。它要求对每个客户IP 地址进行所谓的反向DNS 查询。技术上,squid 请求对该地址的DNS PTR 记录。DNS 的响应--完整可验证域名(FQDN)--是squid匹配ACL 值的东西。(请参考O'Reilly's DNS and BIND 找到更多关于DNS PTR 记录的信息)使用dst ACL,FQDN 查询会导致延时。请求会被延缓处理直到FQDN 响应返回。FQDN响应被缓存下来,所以srcdomain 查询通常仅在客户首次请求时延时。
不幸的是,srcdomain 查询有时不能工作。许多组织并没有保持他们的反向查询数据库与日更新。假如某地址没有PTR 记录,ACL 检查失败。在该情形下,请求可能会延时非常长时间(例如2 分钟)直到DNS 查询超时。假如你使用srcdomain ACL,请确认你自己的DNS in-addr.arpa 区域配置正确并且在工作中。假如这样,你可以使用如下的ACL: IXPUB技术博客#X3A)/WEC
acl LocalHosts srcdomain .users.example.com
IXPUB技术博客*m8BU,y_"M'X*fi
6.1.2.6 port
你很可能想使用port ACL 来限制对某些原始服务器端口号的访问。就像我即将讲到的,squid 其实不连接到某些服务,例如email 和IRC 服务。port ACL 允许你定义单独的端口或端口范围。例如:
E.` R6Gz |0l ]0acl HTTPports port 80 8000-8010 8080
HTTP 在设计上与其他协议类似,例如SMTP。这意味着聪明的用户通过转发email 消息到SMTP 服务器能欺骗squid。Email 转发是垃圾邮件的主要原因之一,我们必须处理它们。历史上,垃圾邮件有真正的邮件服务器。然而近来,越来越多的垃圾邮件制造者使用开放HTTP 代理来隐藏他们的踪迹。你肯定不想Squid 被当成垃圾邮件转发器。假如是这样,你的IP 地址很可能被许多邮件转发黑名单冻结(MAPS,ORDB,spamhaus 等)。除email 之外,还有其他许多TCP/IP 服务是squid 不与其通信的。这些包括IRC,Telnet,POP,和NNTP。你的针对端口的策略必须被配置成拒绝已知危险端口,并允许剩下的;或者允许已知安全端口,并拒绝剩下的。
我的态度比较保守,仅仅允许安全的端口。默认的squid.conf 包含了下面的安全端口ACL: IXPUB技术博客v@8o4EB
acl Safe_ports port 80 # http
0A%[a1}+n'PO0acl Safe_ports port 21 # ftp IXPUB技术博客qO rvz1_FRc
acl Safe_ports port 443 563 # https, snews
4z*Sl.K!H[0acl Safe_ports port 70 # gopher IXPUB技术博客lk!X0]3O-s} S!Iq
acl Safe_ports port 210 # wais IXPUB技术博客1K(cQI9s$@#L#RQ
acl Safe_ports port 1025-65535 # unregistered ports IXPUB技术博客!]#r[ /-l8{J
acl Safe_ports port 280 # http-mgmt
q Ep@@1T0acl Safe_ports port 488 # gss-http IXPUB技术博客,@?|{*W2A H1Q3N
acl Safe_ports port 591 # filemaker IXPUB技术博客 `4XzE2d
acl Safe_ports port 777 # multiling http IXPUB技术博客&J-_1qC9N,[+Wy
http_access deny !Safe_ports
这是个较明智的配置。它允许用户连接到任何非特权端口(1025-65535),但仅仅指定的特权端口可以被连接。假如你的用户试图访问某个URL如下: http://www.lrrr.org:123/,squid会返回访问拒绝错误消息。在某些情形下,为了让你的用户满意,你可能需要增加另外的端口号。
宽松的做法是,拒绝对特别危险的端口的访问。Squid FAQ 包括了如下示例:
7k-CB2a]!L:]7^7g0acl Dangerous_ports 7 9 19 22 23 25 53 109 110 119
y}+KA9l0http_access deny Dangerous_ports
使用Dangerous_ports 的弊端是squid 对几乎每个请求都要搜索整个列表。这对CPU 造成了额外的负担。大多数情况下,99%到达squid的请求是对80端口的,它不出现在危险端口列表里。所有请求对该表的搜索不会导致匹配。当然,整数比较是快速的操作,不会显然影响性能。
(译者注:这里的意思是,两者都要对列表进行搜索和匹配。在第一种情况下,它搜索安全端口列表并匹配80,显然第一个元素就匹配成功了。而第二种情况中,会搜索危险端口列表并试图匹配80,当然危险端口不会包括80,所以每次对80 的请求都要搜索完整个列表,这样就会影响性能。)

~:}Y_;[ y i{06.1.2.7 myport
squid 也有myport ACL。port ACL 指向原始服务器的端口号,myport 指向squid 自己的端口号,用以接受客户请求。假如你在http_port 指令里指定不止一个端口号,那么squid 就可以在不同的端口上侦听。
假如你将squid 作为站点HTTP 加速器和用户代理服务器,那么myport ACL 特别有用。你可以在80 上接受加速请求,在3128 上接受代理请求。你可能想让所有人访问加速器,但仅仅你自己的用户能以代理形式访问squid。你的ACL 可能如下:
y{;KN a%/'t0acl AccelPort myport 80 IXPUB技术博客7l0{eZ3X$y'r%{
acl ProxyPort myport 3128 IXPUB技术博客8C Y+Q+K3k q9xwHe
acl MyNet src 172.16.0.0/22 IXPUB技术博客@ v2t@"YmW
http_access allow AccelPort # anyone IXPUB技术博客 Or$g7pd4fx
http_access allow ProxyPort MyNet # only my users
_ z2J|b ro;c?_'h8P0http_access deny ProxyPort # deny others
IXPUB技术博客V4i nc2P mx%o
6.1.2.8 method
method ACL 指HTTP 请求方法。GET 是典型的最常用方法,接下来是POST,PUT,和其他。下例说明如何使用method ACL: IXPUB技术博客:x iH2W1FdZ{;U
acl Uploads method PUT POST
Squid 知道下列标准HTTP 方法:GET, POST, PUT, HEAD, CONNECT, TRACE,OPTIONS 和DELETE。另外,squid 了解下列来自WEBDAV 规范,RFC 2518 的方法:PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK。某些Microsoft 产品使用非标准的WEBDAV 方法,所以squid 也了解它们:BMOVE, BDELETE, BPROPFIND。最后,你可以在extension_methods 指令里配置squid 去理解其他的请求方法。请见附录A。
注意CONNECT 方法非常特殊。它是用于通过HTTP 代理来封装某种请求的方法(请见RFC 2817:Upgrading to TLS Within HTTP/1.1)。在处理CONNECT 方法和远程服务器的端口号时应特别谨慎。就像前面章节讲过的一样,你不希望squid 连接到某些远程服务。你该限制CONNECT 方法仅仅能连接到HTTPS/SSL 或NNTPS 端口(443 和563)。默认的squid.conf 这样做: IXPUB技术博客;whPJ2GGm
acl CONNECT method CONNECT IXPUB技术博客@T?YT O
acl SSL_ports 443 563 IXPUB技术博客w(p*l^*] u
http_access allow CONNECT SSL_ports
3K5}b4Oq'f UdD:Q7Z0http_access deny CONNECT
在该配置里,squid 仅仅允许加密请求到端口443(HTTPS/SSL)和563(NNTPS)。CONNECT 方法对其他端口的请求都被拒绝。
PURGE 是另一个特殊的请求方法。它是Squid 的专有方法,没有在任何RFC 里定义。它让管理员能强制删除缓存对象。既然该方法有些危险,squid 默认拒绝PURGE 请求,除非你定义了ACL 引用了该方法。否则,任何能访问cache 者也许能够删除任意缓存对象。我推荐仅仅允许来自localhost 的PURGE:
bA P9@"[[c[0acl Purge method PURGE
wC%eOMV4k0acl Localhost src 127.0.0.1 IXPUB技术博客;?4J3mE O"_cGU
http_access allow Purge Localhost IXPUB技术博客*{*Hz%WJ-`J O*f!ld
http_access deny Purge
关于从squid 的缓存里删除对象,请见7.6 章。
IXPUB技术博客QJ(h/@C n sg{
6.1.2.9 proto
该类型指URI 访问(或传输)协议。如下是有效值:http, https (same as HTTP/TLS), ftp,gopher, urn, whois, 和cache_object。也就是说,这些是被squid 支持的URL 机制名字。例如,假如你想拒绝所有的FTP 请求,你可以使用下列指令: IXPUB技术博客r X2wLw S `0a"R
acl FTP proto FTP IXPUB技术博客H1pWJ u,U
http_access deny FTP
cache_object机制是squid的特性。它用于访问squid的缓存管理接口,我将在14.2 章讨论它。不幸的是,它并非好名字,可能会被改变。
默认的squid.conf 文件有许多行限制缓存管理访问:
o-n|!i)H0acl Manager proto cache_object IXPUB技术博客_X+v'})H/v7Kw"c
acl Localhost src 127.0.0.1
xqSNZ0CX1o0http_access allow Manager Localhost IXPUB技术博客6^)lTLd3x2~QC$|4@h
http_access deny Manager
这些配置行仅允许来自本机地址的缓存管理请求,所有其他的缓存管理请求被拒绝。这意味着在squid 机器上有帐号的人,能访问到潜在的敏感缓存管理信息。你也许想修改缓存管理访问控制,或对某些页面使用密码保护。我将在14.2.2 章里谈论到。
IXPUB技术博客7v6Uw M8~E(KxK eW
6.1.2.10 time
time ACL 允许你控制基于时间的访问,时间为每天中的具体时间,和每周中的每天。日期以单字母来表示,见如下表。时间以24 小时制来表示。开始时间必须小于结束时间,这样在编写跨越0 点的time ACL 时可能有点麻烦。 IXPUB技术博客/`~4M+_E N*X*Ry
Code____Day
u2P n'G#n~ `j0----------------- IXPUB技术博客{!A$d |)vySY5u*N
S_______Sunday IXPUB技术博客i dhS-Sc
M_______Monday IXPUB技术博客"h]FM){y4SU
T_______Tuesday
OS4Y [5Ca0/L0W_______Wednesday
B4L[ HA4i5^0H_______Thursday
/9A?%Th`0F_______Friday
F~A'U)^X`%Puq0A_______Saturday
Lp&Odj4e1x7Y0D_______All weekdays (M-F)
xr&n*Ma9YD%h0^(V0-----------------
日期和时间由localtime()函数来产生。请确认你的计算机位于正确的时区,你也该让你的时钟与标准时间同步。
为了编写time ACL 来匹配你的工作时间,你可以这样写:
F!ZCW|~*yr%R0acl Working_hours MTWHF 08:00-17:00
-{iw!| R?O(q"E0or: IXPUB技术博客lfGk D!O
acl Working_hours D 08:00-17:00
让我们看一个麻烦的例子。也许你是某个ISP,在下午8 点到早上4 点这段不忙的时间内放松访问。既然该时间跨越子夜,你不能编写“20:00-04:00”。代替的,你需要把它们分成两个ACL 来写,或者使用否定机制来定义非忙时。例如: IXPUB技术博客.G7j6s*?;Wy![s
acl Offpeak1 20:00-23:59 IXPUB技术博客BLS$~J;j|c)i)r
acl Offpeak2 00:00-04:00
A we-/.V0http_access allow Offpeak1 ...
3k)v&]H4QJ6x0http_access allow Offpeak2 ...
另外,你可以这样写: IXPUB技术博客9r:VE5hEy*LJa
acl Peak 04:00-20:00
u:V{U2lj*p(bCe0http_access allow !Peak ...
尽管squid 允许,你也不应该在同一个time ACL 里放置多个日期和时间范围列表。对这些ACL 的解析不一定是你想象的那样。例如,假如你输入: IXPUB技术博客d0Ku|wa*B
acl Blah time M 08:00-10:00 W 09:00-11:00
实际能做到的是: IXPUB技术博客ze0g s |
acl Blah time MW 09:00-11:00
解析仅仅使用最后一个时间范围。正确的写法是,将它们写进两行: IXPUB技术博客 q:FP.j:d;Y6j
acl Blah time M 08:00-10:00
8iX:~1U IoF/s7g1h*/0acl Blah time W 09:00-11:00
IXPUB技术博客cL^6E R5_v(O
6.1.2.11 ident
ident ACL 匹配被ident 协议返回的用户名。这是个简单的协议,文档是RFC 1413。它工作过程如下:
1.用户代理(客户端)对squid 建立TCP 连接。
2.squid 连接到客户系统的ident 端口(113)。
3.squid 发送一个包括两个TCP 端口号的行。squid 端的端口号可能是3128(或者你在squid.conf 里配置的端口号),客户端的端口号是随机的。
4.客户端的ident 服务器返回打开第一个连接的进程的用户名。
5.squid 记录下用户名用于访问控制目的,并且记录到access.log。
当squid 遇到对特殊请求的ident ACL 时,该请求被延时,直到ident 查询完成。这样,ident ACL 可以对你的用户请求造成延时。
我们推荐仅仅在本地局域网中,并且大部分客户工作站运行ident 服务时,才使用ident ACL。假如squid 和客户工作站连在一个局域网里,ident ACL 工作良好。跨广域网使用ident难以成功。
ident 协议并非很安全。恶意的用户能替换他们的正常ident 服务为假冒服务,并返回任意的他们选择的用户名。例如,假如我知道从administrator 用户的连接总是被允许,那么我可以写个简单的程序,在回答每个ident 请求时都返回这个用户名。
你可以使用ident ACL 拦截cache(请见第9 章)。当squid 被配置成拦截cache 时,操作系统假设它自己是原始服务器。这意味着用于拦截TCP 连接的本地socket 地址有原始服务器的IP 地址。假如你在squid 上运行netstat -n 时,你可以看到大量的外部IP 地址出现在本地地址栏里。当squid 发起一个ident 查询时,它创建一个新的TCP 套接字,并绑定本地终点到同一个IP 地址上,作为客户TCP 连接的本地终点。既然本地地址并非真正是本地的(它可能与原始服务器IP 地址相距遥远),bind()系统调用失败。squid 将这个作为失败的ident查询来处理。
注意squid也有个特性,对客户端执行懒惰ident 查询。在该情形下,在等待ident 查询时,请求不会延时。在HTTP 请求完成时,squid 记录ident 信息,假如它可用。你能使用ident_lookup_access 指令来激活该特性,我将在本章后面讨论。

5y/G-V-c"|FdU(B7E06.1.2.12 proxy_auth
squid 有一套有力的,在某种程度上有点混乱的特性,用以支持HTTP 代理验证功能。使用代理验证,客户的包括头部的http 请求包含了验证信用选项。通常,这简单的是用户名和密码。squid 解密信用选项,并调用外部验证程序以发现该信用选项是否有效。
squid 当前支持三种技术以接受用户验证:HTTP 基本协议,数字认证协议,和NTLM。基本认证已经发展了相当长时间。按今天的标准,它是非常不安全的技术。用户名和密码以明文同时发送。数字认证更安全,但也更复杂。基本和数字认证在RFC 2617 文档里被描述。NTLM 也比基本认证更安全。然而,它是Microsoft 发展的专有协议。少数squid 开发者已经基本完成了对它的反向工程。
为了使用代理验证,你必须配置squid 使用大量的外部辅助程序。squid 源代码里包含了一些程序,用于对许多标准数据库包括LDAP,NTLM,NCSA 类型的密码文件,和标准Unix密码数据库进行认证。auth_param 指令控制对所有辅助程序的配置。我将在12 章里讨论这些细节。
auth_param 指令和proxy_auth ACL 是少数在配置文件里顺序重要的实例。你必须在proxy_auth ACL 之前定义至少一个验证辅助程序(使用auth_param)。假如你没有这样做,squid 打印出错误消息,并且忽略proxy_auth ACL。这并非致命错误,所以squid 可以启动,但所有你的用户的请求可能被拒绝。
proxy_auth ACL 取用户名作为值。然而,大部分安装里简单的使用特殊值REQUIRED:auth_param ...
^7o_E_^Y0acl Auth1 proxy_auth REQUIRED
在该情况中,任何具有有效信用选项的请求会匹配该ACL。假如你需要细化控制,你可以指定独立的用户名: IXPUB技术博客9qWg-`8Z:X
auth_param ...
N:F C!Fv{0acl Auth1 proxy_auth allan bob charlie
j.dE!/l:]+Rp]!s0acl Auth2 proxy_auth dave eric frank
代理验证不支持HTTP 拦截,因为用户代理不知道它在与代理服务器,而非原始服务器通信。用户代理不知道在请求里发送Proxy-Authorization 头部。见9.2 章更多细节。
IXPUB技术博客4g[? p'G
6.1.2.13 src_as
该类型检查客户源IP 地址所属的具体AS 号(见6.1.1.6 关于squid 如何将AS 号映射到IP 地址的信息)。作为示例, 我们虚构某ISP 使用AS 64222 并且通告使用10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 网络。你可以编写这样的ACL,它允许来自该ISP 地址空间的任何主机请求: IXPUB技术博客0`9nq0_z/ m/?1s"l/
acl TheISP src 10.0.0.0/8 IXPUB技术博客&Ui"T#n UcB
acl TheISP src 172.16.0.0/12 IXPUB技术博客+^(]l"x^2}
acl TheISP src 192.168.0.0/16
8VN%nVkp'L0http_access allow TheISP
当然,你还可以这样写: IXPUB技术博客/HZqzx Rv+bh
acl TheISP src_as 64222 IXPUB技术博客6P$O `S[u9X
http_access allow TheISP
第二种写法不但更短,而且假如ISP 增加了新的网络,你不必更新ACL 配置。

gV Z.y8P-q?"k1V06.1.2.14 dst_as
dst_as ACL 经常与cache_peer_access 指令一起使用。在该方法中,squid 使用与IP 路由一致的方式转发cache 丢失。考虑某ISP,它比其他ISP 更频繁的更换路由。每个ISP 处理他们自己的cache 代理,这些代理能转发请求到其他代理。理论上,ISP A 将ISP B 网络里主机的cache 丢失转发到ISP B 的cache 代理。使用AS ACL 和cache_peer_access 指令容易做到这点: IXPUB技术博客 t9KVt"B-Q
acl ISP-B-AS dst_as 64222 IXPUB技术博客iY(f)JuW.^
acl ISP-C-AS dst_as 64333
w"Ab#aHl[0cache_peer proxy.isp-b.net parent 3128 3130
W%L'AM$QJt0cache_peer proxy.isp-c.net parent 3128 3130 IXPUB技术博客#X#|8XDu,?{ j9b
cache_peer_access proxy.isb-b.net allow ISP-B-AS IXPUB技术博客3bdkU8zI6Rc r
cache_peer_access proxy.isb-c.net allow ISP-C-AS
我将在第10 章里讨论更多关于cache 协作。
IXPUB技术博客"T[g%wb)f?
6.1.2.15 snmp_community
snmp_community ACL 对SNMP 查询才有意义,后者被snmp_access 指令控制。例如,你可以这样写:
'R A0EZ"P]'^H0acl OurCommunityName snmp_community hIgHsEcUrItY IXPUB技术博客 A'U{M@*L,^e6E$T
acl All src 0/0
4P{'I/|'l0snmp_access allow OurCommunityName
(W R/q Wc/^7G2X0snmp_access deny All
在该情况中,假如community 名字设置为hIgHsEcUrItY,SNMP 查询才被允许。

3r8S_q fb"X+J06.1.2.16 maxconn
maxconn ACL 指来自客户IP 地址的大量同时连接。某些squid 管理员发现这是个有用的方法,用以阻止用户滥用代理或者消耗过多资源。
maxconn ACL 在请求超过指定的数量时,会匹配这个请求。因为这个理由,你应该仅仅在deny 规则里使用maxconn。考虑如下例子: IXPUB技术博客v%{?l9i1P)p
acl OverConnLimit maxconn 4
l kJp9?J OTt-w0http_access deny OverConnLimit
在该情况中,squid 允许来自每个IP 地址的同时连接数最大为4 个。当某个客户发起第五个连接时,OverConnLimit ACL 被匹配,http_access 规则拒绝该请求。
IXPUB技术博客V6K_q(F/v3K J
6.1.2.17 arp
arp ACL 用于检测cache 客户端的MAC 地址(以太网卡的物理地址)。地址解析协议(ARP)是主机查找对应于IP 地址的MAC 地址的方法。某些大学学生发现,在Microsoft Windows 下,他们可以改变系统的IP 地址到任意值,然后欺骗squid 的基于地址的控制。这时arp 功能就派上用场了,聪明的系统管理员会配置squid 检查客户的以太网地址。
不幸的是,该特性使用非移植性代码。假如你运行Solaris 或Linux,你能使用arp ACL。其他系统不行。当你运行./configure 时增加--enable-arp-acl 选项,就可以激活该功能。
arp ACL 有另一个重要限制。ARP 是数据链路层协议,假如客户主机和squid 在同一子网,它才能工作。你不容易发现不同子网主机的MAC 地址。假如在squid 和你的用户之间有路由器存在,你可能不能使用arp ACL。
现在你知道何时去使用它们,让我们看看arp ACL 实际上是怎样的。它的值是以太网地址,当使用ifconfig 和arp 时你能看到以太网地址。例如:
T4@e-y%YLh0acl WinBoxes arp 00:00:21:55:ed:22 IXPUB技术博客e7r(lZ&u~.R
acl WinBoxes arp 00:00:21:ff:55:38
IXPUB技术博客'_ ft"Q T7Ec^^r-V
6.1.2.18 srcdom_regex
srcdom_regex ACL 允许你使用正则表达式匹配客户域名。这与srcdomain ACL 相似,它使用改进的的子串匹配。相同的限制是:某些客户地址不能反向解析到域名。作为示例,下面的ACL 匹配以dhcp 开头的主机名: IXPUB技术博客 m%z1k^_y@*J5a
acl DHCPUser srcdom_regex -i ^dhcp
因为领头的^ 符号, 该ACL 匹配主机名dhcp12.example.com , 但不匹配host12.dhcp.example.com。
IXPUB技术博客&T!tKL&~7ro
6.1.2.19 dstdom_regex
dstdom_regex ACL 也与dstdomain 相似。下面的例子匹配以www 开头的主机名:
x7}#rc`?L0acl WebSite dstdom_regex -i ^www/.
如下是另一个有用的正则表达式,用以匹配在URL 主机名里出现的IP 地址:
#i*c@ MIpvO[@v0acl IPaddr dstdom_regex [0-9]$
这样可以工作,因为squid 要求URL 主机名完全可验证。既然全局顶级域名中没有以数字结尾的,该ACL 仅仅匹配IP 地址,它以数字结尾。
IXPUB技术博客&qyzp/wT
6.1.2.20 url_regex
url_regex ACL 用于匹配请求URL 的任何部分,包括传输协议和原始服务器主机名。例如,如下ACL 匹配从FTP 服务器的MP3 文件请求: IXPUB技术博客ROi4@)UI
acl FTPMP3 url_regex -i ^ftp://.*/.mp3$
IXPUB技术博客K4^_?+qR"J/I,|
6.1.2.21 urlpath_regex
urlpath_regex 与url_regex 非常相似,不过传输协议和主机名不包含在匹配条件里。这让某些类型的检测非常容易。例如,假设你必须拒绝URL 里的"sex",但仍允许在主机名里含有"sex"的请求,那么这样做:
.g"B"ARp*Gn t0acl Sex urlpath_regex sex
另一个例子,假如你想特殊处理cgi-bin 请求,你能这样捕获它们: IXPUB技术博客S6cO1H"@R P
acl CGI1 urlpath_regex ^/cgi-bin
当然,CGI 程序并非总在/cgi-bin/目录下,这样你应该编写其他的ACL 来捕获它们。
IXPUB技术博客l.X"m-p.Mf!J
6.1.2.22 browser
大部分HTTP 请求包含了User-Agent 头部。该头部的值典型如下:
,l2F,[.M;/:B [0Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686)
browser ACL 对user-agent 头执行正则表达式匹配。例如,拒绝不是来自Mozilla 浏览器的请求,可以这样写:
Mt*j-TAZ P;f9j0acl Mozilla browser Mozilla
c_B#eYh0http_access deny !Mozilla
在使用browser ACL 之前,请确认你完全理解cache 接受到的User-Agent 字符串。某些user-agent 与它们的来源相关。甚至squid 可以重写它转发的请求的User-Agent 头部。某些浏览器例如Opera 和KDE 的Konqueror,用户可以对不同的原始服务器发送不同的user-agent字串,或者干脆忽略它们。

L2|Ge8^c WZ06.1.2.23 req_mime_type
req_mime_type ACL 指客户HTTP 请求里的Content-Type 头部。该类型头部通常仅仅出现在请求消息主体里。POST 和PUT 请求可能包含该头部,但GET 从不。你能使用该类型ACL 来检测某些文件上传,和某些类型的HTTP 隧道请求。
req_mime_type ACL 值是正则表达式。你可以这样编写ACL 去捕获音频文件类型: IXPUB技术博客$qDsU~ K5G9AB
acl AuidoFileUploads req_mime_type -i ^audio/

cJ'C sG/R}06.1.2.24 rep_mime_type
该类型ACL 指原始服务器的HTTP 响应里的Content-Type 头部。它仅在使用http_reply_access 规则时才有用。所有的其他访问控制形式是基于客户端请求的。该ACL 基于服务器响应。
假如你想使用squid 阻塞Java 代码,你可以这样写:
7HL|l5R gp;B0acl JavaDownload rep_mime_type application/x-java IXPUB技术博客O3OA&o!F-nZ
http_reply_access deny JavaDownload
IXPUB技术博客n$m z_l.?C_
6.1.2.25 ident_regex
在本节早些时讲过ident ACL。ident_regex 允许你使用正则表达式,代替严格的字符串匹配,这些匹配是对ident 协议返回的用户名进行。例如,如下ACL 匹配包含数字的用户名: IXPUB技术博客7G'c#go V.R'fn2v,Ni
acl NumberInName ident_regex [0-9]

S.{%PL/K;K1G06.1.2.26 proxy_auth_regex
该ACL 允许对代理认证用户名使用正则表达式。例如, 如下ACL 匹配
Z}#_Q0A^0admin,administrator 和administrators: IXPUB技术博客*Od7C bu:M
acl Admins proxy_auth_regex -i ^admin

2Y~z2f'x~P0U/zG06.1.3 外部ACL
Squid 2.5 版本介绍了一个新特性:外部ACL。你可以指示squid 发送某些信息片断到外部进程,然后外部的辅助程序告诉squid,数据匹配或不匹配。
squid 附带着大量的外部ACL 辅助程序;大部分用于确定命名用户是不是某个特殊组的成员。请见12.5 章关于这些程序的描述,以及关于如何编写你自己的程序的信息。现在,我解释如何定义和使用外部ACL 类型。
external_acl_type 指令定义新的外部ACL 类型。如下是通用语法:
5lj5m!}.l&v0external_acl_type type-name [options] format helper-command
type-name 是用户定义的字串。你也可以在acl 行里引用它。
Squid 当前支持如下选项(options):
ttl=n IXPUB技术博客x8?(~.NBq
时间数量,单位是秒,用以缓存匹配值的时间长短。默认是3600 秒,或1 小时。
negative_ttl=n IXPUB技术博客 L`!V hm C?
时间数量,单位是秒,用以缓存不匹配值的时间长短。默认是3600 秒,或1 小时。
concurrency=n
:`,vb A"Gm P0衍生的辅助程序的数量,默认是5。
cache=n IXPUB技术博客:V [}2l{x8D
缓存结果的最大数量。默认是0,即不限制cache 大小。
格式是以%字符开始的一个或多个关键字。squid 当前支持如下格式:
%LOGIN IXPUB技术博客dA}^(xPr5m J1i!t
从代理验证信用选项里获取的用户名。
%IDENT IXPUB技术博客*{{#g2A?}^
从RFC 1413 ident 获取的用户名。
%SRC
/D.p4Jt LeE*Go.F,e)/0客户端IP 地址。
%DST
Zo7`R,qx3Gc0原始服务器IP 地址。
%PROTO
.V/.Mp7M2F zF0传输协议(例如HTTP,FTP 等)
%PORT IXPUB技术博客-@Al9P5H-E0Cr]U H
原始服务器的TCP 端口。
%METHOD
9O,q"q)m5x:Su6goz0HTTP 请求方法。
%{Header} IXPUB技术博客 O| }g/qRP
HTTP 请求头部的值;例如,%{User-Agent}导致squid 发送这样的字串到验证器:"Mozilla/4.0 (compatible; MSIE 6.0; Win32)"
%{Hdr:member}
yzE0U;w:w tF v0选择某些数量的基于列表的HTTP 头部,例如Caceh-Control;例如,给出如下HTTP头部: IXPUB技术博客-j;OT/Ds qL8`V
X-Some-Header: foo=xyzzy, bar=plugh, foo=zoinks
对%{X-Some-Header:foo}的取值,squid 发送这样的字串到外部ACL 进程:
1q"l5A;_-ET0foo=xyzzy, foo=zoinks
%{Hdr:;member} IXPUB技术博客@"y piu h(i
与%{Hdr:member}相同,除了";"是列表分隔符外。你能使用任何非字母数字的字符作为分隔符。
辅助命令是squid 为辅助程序衍生的命令。你也可以在这里包含命令参数。例如,整条命令可能类似如此:
O-H:r0Qz/~0/usr/local/squid/libexec/my-acl-prog.pl -X -5 /usr/local/squid/etc/datafile
将这些放在一个长行里。squid 不支持如下通过反斜杠分隔长行的技术,所以请记住所有这些必须放在单行里: IXPUB技术博客.~vB dZ,`+w,d,RS
external_acl_type MyAclType cache=100 %LOGIN %{User-Agent} / IXPUB技术博客:I.~/S^FIXAO
/usr/local/squid/libexec/my-acl-prog.pl -X -5 /
)A#Zm#LI0/usr/local/squid/share/usernames /
j$eQLV|uA:DcO0/usr/local/squid/share/useragents
现在你知道如何定义外部ACL,下一步是编写引用它的acl 行。这相对容易,语法如下: IXPUB技术博客7W eFa Dr'F/z4R
acl acl-name external type-name [args ...]
如下是个简单示例:
Y$kO}*H0acl MyAcl external MyAclType
squid 接受在type-name 后面的任意数量的参数。这些在每个请求里被发送到辅助程序。
PsZ t X]0请见12.5.3 章,我描述了unix_group 辅助程序,作为该功能的示例。

EE g5F|WBs2f0f8P06.1.4 处理长ACL 列表
ACL 列表某些时候非常长。?br />

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

 

<script language="javascript" type="text/javascript"> </script> id="xspace-phpframe" name="xspace-phpframe" marginwidth="0" src="about:blank" frameborder="0" width="0" height="0">

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值