文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>squid学习摘要

squid学习摘要

时间:2006-03-27  来源:rwen2012

配置文件描述符: 在你的Unix shell 中能找到系统的文件描述符限制
sh$ ulimit -n unlimited
sh$ ulimit -n
4096
在配置文件描述符限制时,我推荐设置系统级限制的数量为每个进程限制的2 倍。 3.3.1.2 Linux 在Linux 上配置文件描述符有点复杂。在编译squid 之前,你必须编辑系统include 文件中的一个,然后 执行一些shell 命令。请首先编辑/usr/include/bits/types.h 文件,改变__FD_SETSIZE 的值:
#define _ _FD_SETSIZE 8192
下一步,使用这个命令增加内核文件描述符的限制:
# echo 8192 >; /proc/sys/fs/file-max
最后,增加进程文件描述符的限制,在你即将编译squid 的同一个shell 里执行:
sh# ulimit -Hn 8192
该命令必须以root 运行,仅仅运行在bash shell。不必重启机器。 使用这个技术,你必须在每一次系统启动后执行上述echo 和ulimit 命令,或者至少在squid 启动之前。 假如你使用某个rc.d 脚本来启动squid,那是一个放置这些命令的好地方。  
3.3.3 临时端口范围
 临时端口号的短缺对非常忙的代理服务器(例如每秒数百个连接)来说,会较大的影响性能。这
是因为一些TCP 连接在它们被关闭时进入TIME_WAIT 状态。当连接进入TIME_WATI 状态时,临时端口号不 能被重用。 你能使用netstat 命令来显示有多少个连接进入这个状态: % netstat -n | grep TIME_WAIT 在Linux 上,简单的写一对数字到下列指定文件:
# echo "1024 40000" >; /proc/sys/net/ipv4/ip_local_port_range
不要忘记将这些命令加到你的系统启动脚本中,以使机器每一次重启后都生效。
 
3.4.1 configure 选项
--enable-dlmalloc[=LIB]
在一些系统上,内建的内存分配机制(malloc)在使用squid 时表现不尽人意。使用--enable-dlmalloc
选项将squid 源代码包中的dlmalloc 包编译和链接进来。假如你的系统中已安装dlmalloc,你能使用 =LIB 参数指定库的路径。请见http://g.oswego.edu/dl/html/malloc.html更多关于dlmalloc 的信息。
--enable-async-io[=N_THREADS]
同步I/O 是squid 技术之一,用以提升存储性能。aufs 模块使用大量的线程来执行磁盘I/O 操作。该代
码仅仅工作在linux 和solaris 系统中。=N_THREADS 参数改变squid 使用的线程数量。aufs 和同步I/O 在8.4 章中被讨论。
请注意--enable-async-io 是打开其他三个./configure 选项的快捷方式,它等同于:
--with-aufs-threads=N_THREADS
--with-pthreads
--enable-storeio=ufs,aufs
--with-pthreads
--enable-cachemgr -hostname[=hostname]
cachemgr 是一个CGI程序,你能使用它来管理查询squid。默认cachemgr的hostname值是空的,但你能使
用该选项来指定一个默认值。例如:
% ./configure --enable-cachemgr-hostname=mycache.myorg.net

--enable-arp-acl
squid 在一些操作系统中支持ARP,或者以太地址访问控制列表。该代码使用非标准的函数接口,来执行
ARP访问控制列表,所以它默认被禁止。假如你在linux或solaris上使用squid,你可能用的上这个功能。 --enable-ssl
使用该选项赋予squid 终止SSL/TLS 连接的能力。注意这仅仅工作在web加速器中用以加速请求。更多细
节请见15.2.2 章节。
--enable-err-languages="lang1 lang2 ..."
squid支持定制错误消息,错误消息可以用多种语言报告。该选项指定复制到安装目录
($prefix/share/errors)的语言。假如你不使用该选项,所有可用语言被安装。想知道何种语言可用,请 见源代码包里errors目录下的目录列表。如下显示如何激活多种语言:
% ./configure --enable-err-languages="Dutch German French" ...
--enable-default-err-language=lang
该选项设置error_directory 指令的默认值。例如,假如你想使用荷兰语,你能这样指定:
% ./configure --enable-default-err-language=Dutch
你也能在squid.conf 里指定error_directory 指令,在附录A 中有描述。假如你忽略该选项,英语是默
认错误语言。
--enable-ipf-transparent
在第9章中,我将描述如何配置squid来拦截缓存。一些操作系统使用IP Filter包来协助拦截缓存。在这
些环境下你应该使用该./configure 选项。如果你使用了该选项,但是编译器提示src/client_side.c文 件出错,那是因为IP Filter包没有或没有正确的安装在你的系统中。 --enable-pf-transparent
你可能需要指定该选项,使用PF包过滤器在操作系统中拦截HTTP。PF是OpenBSD的标准包过滤器,也可能
被发布到其他系统中。假如你使用该选项,但是编译器提示src/client_side.c 文件出错,那是因为PF 没有实际安装到你的系统中。 --enable-linux-netfilter
Netfilter 是linux 2.4 系列内核的包过滤器名字。假如你想在linux2.4或以后的版本中使用HTTP拦截功
能,那么激活该选项。 3.6 安装
在安装完后,你将在squid 的安装目录里
libexec/cachemgr.cgi
cachemgr.cgi是Squid管理功能的CGI接口。为了使用它,你需要拷贝该程序到你的WEB服务器的cgi-bin目
录。在14.2章中有更多描述。
etc/squid.conf
这是squid的主要配置文件。初始的该文件包含了大量的注释,用以解释每一个选项做什么。在你理解了
这些配置指令后,建议你删除这些注释,让配置文件更小和更容易阅读。注意假如该文件存在,安装过程 不会覆盖该文件。 etc/squid.conf.default
这是从源代码目录中拷贝过来的默认配置文件。在升级了squid安装后,你也许发现有一份当前默认配置
文件的拷贝是有用的。可能会增加新的配置指令,一些存在的旧指令可能有所改变。 var
var目录包含了不是很重要的和经常变化的文件。这些文件你不必正常的备份它们。
var/logs
var/logs目录是squid 不同日志文件的默认位置。当你第一次安装squid 时,它是空的。一旦squid开始
运行,你能在这里看到名字为access.log,cache.log和store.log这样的文件。 var/cache
假如你不在squid.conf文件里指定,这是默认的缓存目录(cache_dir)。
    3.8 重运行configure 有时候你可能发现有必要重新运行./configure。例如,假如你调整了内核参数,你必须再次运 行./configure以使它能发现新设置。当你阅读本书时,你也发现你必须使用./configure选项来激活所需 的功能。 以相同的选项重运行./configure,使用如下命令:
%config.status --recheck
另一个技术是`touch config.status`文件,它更新了该文件的时间戳。这导致make在编译源代码之前, 重新运行./configure脚本:
% touch config.status
% make
如果增加或删除./configure选项,你必须重新敲入完整的命令行。假如你记不住以前的选项,请查看 config.status文件的顶部。例如:
% head config.status
#! /bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
Squid 中文权威指南 16
# This directory was configured as follows,
# on host foo.life-gone-hazy.com:
#
# ./configure --enable-storeio=ufs,diskd --enable-carp \
# --enable-auth-modules=NCSA
# Compiler output produced by configure, useful for debugging
# configure, is in ./config.log if it exists.
在运行./configure之后,你必须再次编译和安装squid。安全起见,建议先运行make clean:
%make clean
%make
请回想一下,./configure会缓存它在你系统中发现的东西。在这样的形式下,你可能想清除这些缓存, 从头开始编译过程。假如喜欢,你可以简单的删除config.cache 文件。然后,下一次./configure运行时 ,它不会使用以前的数值。你也能恢复squid源代码树到它的configure之前的状态,使用如下命令:
%make distclean
这将删除所有的目标文件和其他被./configure和make程序产生的文件。         4.2 User IDs 你可能知道,unix 进程和文件拥有文件和组属主的属性。你必须选择某个用户和组给squid。该用户和组 的组合,必须对大部分squid 相关的文件和目录有读和写的权限。 我高度推荐创建名为"squid"的用户和组。这避免了某人利用squid 来读取系统中的其他文件。假如不止 一个人拥有对squid 的管理权限,你可以将他们加到squid 组里。 unix 进程继承了它们父进程的属主属性。那就是说,假如你以joe 用户来启动squid,squid 也以joe 来 运行。假如你不想以joe 来运行squid,你需要预先改变你的用户ID。这是su 命令的典型功能。例如:
joe% su - squid
squid% /usr/local/squid/sbin/squid
不幸的是,运行squid 并非总是如此简单。在某些情况下,你必须以root 来启动squid,这依赖于你的配 置。例如,仅仅root 能绑定TCP 套接字到特权端口上,如80。假如你必须以root 来启动squid,你必须 设置cache_effective_user 指令。它告诉squid,在执行完需要特别权限的任务后,变成哪个用户。例如 :
cache_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 也必须有对日志文件和缓存目录的写访问
权。
squid 也有一个cache_effective_group 指令,但你也许不必设置它。默认的,squid 使用 cache_effective_user 的默认组(从/etc/passwd 文件读取)。         4.3 端口号 http_port 指令告诉squid 在哪个端口侦听HTTP 请求。默认端口是3128:
http_port 3128
假如你将squid 作为加速器运行(见15 章),你也许该将它设为80。 你能使用附加的http_port 行,来指示squid 侦听在多个端口上。假如你必须支持客户组(它们被配置得 不一致),这点就经常有用。例如,来自某个部门的浏览器发送请求到3128,
然而另一个部门使用80 端口。简单的将两个端口号列举出来:
http_port 3128
http_port 8080
你也能使用http_port 指令来使squid 侦听在指定的接口地址上。当squid 作为防火墙运行时,它有两个 网络接口:一个内部的和一个外部的。你可能不想接受来自外部的http 请求。为了使squid 仅仅侦听在 内部接口上,简单的将IP 地址放在端口号前面:
http_port 192.168.1.1:3128
      4.4 日志文件路径 我将在第13 章讨论所有squid 的日志细节。你现在你关注的唯一事情是,squid 将它的日志放在何处。 默认的日志目录是squid 安装位置下的logs 目录。例如,假如你在./configure
时没有使用--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 指令,你可以 改变该日志文件的路径:
cache_log /squid/logs/cache.log
access.log 文件包含了对squid 发起的每个客户请求的单一行。每行平均约150 个字节。也就是说,在 接受一百万条客户请求后,它的体积约是150M。请使用cache_access_log 指令来改变该日志文件的路径
cache_access_log /squid/logs/access.log
假如因为某些理由,你不想squid 记录客户端请求日志,你能指定日志文件的路径为/dev/null. store.log 文件对大多数cache 管理员来说并非很有用。它包含了进入和离开缓存的每个目标的记录。平 均记录大小典型的是175-200 字节。然而,squid 不在store.log 里对cache点击创建接口,所以它比 access.log 包含少得多的记录。请使用cache_store_log 指令来改变它的位置:
cache_store_log /squid/logs/store.log
通过指定路径为none,你能轻易的完全禁止store.log 日志:
cache_store_log none
假如你不小心,squid 的日志文件增加没有限制。某些操作系统对单个文件强制执行2G的大小限制,即使 你有充足的磁盘空间。超过该限制会导致写错误,这样squid 就会退出。为了保证日志文件大小合理,你 应创建任务来有规律的重命名和打包日志。squid 有内建功能来使这个容易做到。请见13.7 章关于日志 轮循的解释。      
4.5 访问控制
为了彻底说明,如下是一个合理的初始访问控制配置,包括推荐的默认控制和早先的例子:
acl All src 0/0
acl Manager proto cache_object
acl Localhost src 127.0.0.1/32
acl Safe_ports port 80 21 443 563 70 210 280 488 591 777 1025-65535
acl SSL_ports 443 563
acl CONNECT method CONNECT
acl MyNetwork src 192.168.0.0/16
http_access allow Manager Localhost
http_access deny Manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow MyNetwork
http_access deny All
         
5.3 初始化cache 目录
在初次运行squid 之前,或者无论何时你增加了新的cache_dir,你必须初始化cache 目录。命令很简单
%squid –z
对UFS 相关的存储机制(ufs,aufs,and diskd;见第8 章),该命令在每个cache_dir 下面创建了所需的 子目录。你不必担心squid 会破坏你的当前cache 目录(如果有的话)。 在该阶段属主和许可权是通常遇到的问题。squid 在特定的用户ID 下运行,这在squid.conf 文件里的 cache_effective_user 里指定。用户ID 必须对每个cache_dir 目录有读和写权限。否则,你将看到如下 信息:
Creating Swap Directories
FATAL: Failed to make swap directory /usr/local/squid/var/cache/00:
(13) Permission denied
在这样的情形下,你该确认/usr/local/squid/var/cache 目录的所有组成都可被squid.conf给定的用户 ID 访问。最终的组件--cache 目录--必须对该用户ID 可写。 cache 目录初始化可能花费一些时间,依赖于cache 目录的大小和数量,以及磁盘驱动器的速度。假如你 想观察这个过程,请使用-X 选项:
%squid –zX
       
5.6 启动脚本
通常你希望squid 在每次计算机重启后自动启动。对不同的操作系统,它们的启动脚本如何工作也很不同 。我在这里描述一些通用的环境,但对你自己的特殊操作系统,也许该有特殊的处理方法。
5.6.1 /etc/rc.local
最容易的机制之一是/etc/rc.local 脚本。这是个简单的shell 脚本,在每次系统启动时以root 运行。 使用该脚本来启动squid 非常容易,增加一行如下:
/usr/local/squid/sbin/squid –s
当然你的安装位置可能不同,还有你可能要使用其他命令行选项。不要在这里使用-N选项。 假如因为某些理由,你没有使用cache_effective_user 指令,你可以尝试使用su 来让squid以非root 用 户运行:
/usr/bin/su nobody -c '/usr/local/squid/sbin/squid -s'
5.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 的基本脚本:
#!/bin/sh
# this script starts and stops Squid
case "$1" in
start)
/usr/local/squid/sbin/squid -s
echo -n ' Squid'
;;
stop)
/usr/local/squid/sbin/squid -k shutdown
;;
esac
Linux 用户可能在启动squid 之前需要设置文件描述符限制。例如:
echo 8192 >; /proc/sys/fs/file-max
limit -HSn 8192
为了使用该脚本,先找到脚本存放的目录。给它一个有意义的名字,类似于其他的系统启动脚本。可以是 S98squid 或squid.sh。通过重启计算机来测试该脚本,而不要假想它会正常工作。
5.6.3 /etc/inittab
某些操作系统支持另一种机制,是/etc/inittab 文件。在这些系统中,init 进程启动和停止基于运行等 级的服务。典型的inittab 接口类似如此:
sq:2345nce:/usr/local/squid/sbin/squid –s
使用该接口,init 进程启动squid 一次并且随后忘记它。squid 确认它驻留在运行状态,象前面描述的 一样。或者,你能这样做:
sq:2345:respawn:/usr/local/squid/sbin/squid –Ns
这里我们使用了respawn 选项,假如进程不存在init 会重启squid。假如使用respawn,请确认使用-N 选 项。 在编辑完inittab 文件后,使用下面的命令来使init 重新读取它的配置文件和启动squid:
# init q
        5.9 重配置运行中的squid 进程 在你了解了更多关于squid 的知识后,你会发现对squid.conf 文件做了许多改动。为了让新设置生效, 你可以关闭和重启squid,或者在squid 运行时,重配置它。 重配置运行中的squid 最好的方法是使用squid -k reconfigure 命令:
%squid -k reconfigure
当你运行该命令时,HUP 信号被发送到运行中的squid 进程。然后squid 读取和解析squid.conf 文件。    
5.10 滚动日志文件
除非你在squid.conf 里禁止,squid 会写大量的日志文件。你必须周期性的滚动日志文件,以阻止它们 变得太大。squid 将大量的重要信息写入日志,假如写不进去了,squid 会发生错误并退出。为了合理控 制磁盘空间消耗,在cron 里使用如下命令:
%squid -k rotate
例如,如下任务接口在每天的早上4 点滚动日志:
0 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 限制,或者编写脚本用于将日志文件移动到其他位置。       6.1.2.6 port 你很可能想使用port ACL 来限制对某些原始服务器端口号的访问。就像我即将讲到的,squid 其实不连 接到某些服务,例如email 和IRC 服务。port ACL 允许你定义单独的端口或端口范围。例如:
acl 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:
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
http_access deny !Safe_ports
这是个较明智的配置。它允许用户连接到任何非特权端口(1025-65535),但仅仅指定的特权端口可以 被连接。假如你的用户试图访问某个URL如下:http://www.lrrr.org:123/,squid会返回访问拒绝错误消 息。在某些情形下,为了让你的用户满意,你可能需要增加另外的端口号。 宽松的做法是,拒绝对特别危险的端口的访问。Squid FAQ 包括了如下示例:
acl Dangerous_ports 7 9 19 22 23 25 53 109 110 119
http_access deny Dangerous_ports
使用Dangerous_ports 的弊端是squid 对几乎每个请求都要搜索整个列表。这对CPU 造成了额外的负担。 大多数情况下,99%到达squid的请求是对80端口的,它不出现在危险端口列表里。所有请求对该表的搜索 不会导致匹配。当然,整数比较是快速的操作,不会显然影响性能。    
6.1.2.7 myport
squid 也有myport ACL。port ACL 指向原始服务器的端口号,myport 指向squid 自己的端口号,用以接 受客户请求。假如你在http_port 指令里指定不止一个端口号,那么squid 就可以在不同的端口上侦听。 假如你将squid 作为站点HTTP 加速器和用户代理服务器,那么myport ACL 特别有用。你可以在80 上接 受加速请求,在3128 上接受代理请求。你可能想让所有人访问加速器,但仅仅你自己的用户能以代理形 式访问squid。你的ACL 可能如下:
acl AccelPort myport 80
acl ProxyPort myport 3128
acl MyNet src 172.16.0.0/22
http_access allow AccelPort # anyone
http_access allow ProxyPort MyNet # only my users
http_access deny ProxyPort # deny others
   
默认的squid.conf 文件有许多行限制缓存管理访问:
acl Manager proto cache_object
acl Localhost src 127.0.0.1
http_access allow Manager Localhost
http_access deny Manager
这些配置行仅允许来自本机地址的缓存管理请求,所有其他的缓存管理请求被拒绝。这意味着在squid 机 器上有帐号的人,能访问到潜在的敏感缓存管理信息。你也许想修改缓存管理访问控制,或对某些页面使 用密码保护。                   6.1.2.10 time time ACL 允许你控制基于时间的访问,时间为每天中的具体时间,和每周中的每天。日期以单字母来表 示,见如下表。时间以24 小时制来表示。开始时间必须小于结束时间,这样在编写跨越0 点的time ACL 时可能有点麻烦。
Code____Day
-----------------
S_______Sunday
M_______Monday
T_______Tuesday
W_______Wednesday
H_______Thursday
F_______Friday
A_______Saturday
D_______All weekdays (M-F)
-----------------
日期和时间由localtime()函数来产生。请确认你的计算机位于正确的时区,你也该让你的时钟与标准时 间同步。 为了编写time ACL 来匹配你的工作时间,你可以这样写:
acl Working_hours MTWHF 08:00-17:00
or:
acl Working_hours D 08:00-17:00
让我们看一个麻烦的例子。也许你是某个ISP,在下午8 点到早上4 点这段不忙的时间内放松访问。既然 该时间跨越子夜,你不能编写“20:00-04:00”。代替的,你需要把它们分成两个ACL 来写,或者使用否 定机制来定义非忙时。例如:
acl Offpeak1 20:00-23:59
acl Offpeak2 00:00-04:00
http_access allow Offpeak1 ...
http_access allow Offpeak2 ...
另外,你可以这样写:
acl Peak 04:00-20:00
http_access allow !Peak ...
尽管squid 允许,你也不应该在同一个time ACL 里放置多个日期和时间范围列表。对这些ACL 的解析不 一定是你想象的那样。例如,假如你输入:
acl Blah time M 08:00-10:00 W 09:00-11:00
实际能做到的是:
acl Blah time MW 09:00-11:00
解析仅仅使用最后一个时间范围。正确的写法是,将它们写进两行:
acl Blah time M 08:00-10:00
acl Blah time W 09:00-11:00
              6.1.2.16 maxconn maxconn ACL 指来自客户IP 地址的大量同时连接。某些squid 管理员发现这是个有用的方法,用以阻止 用户滥用代理或者消耗过多资源。 maxconn ACL 在请求超过指定的数量时,会匹配这个请求。因为这个理由,你应该仅仅在deny 规则里使 用maxconn。考虑如下例子:
acl OverConnLimit maxconn 4
http_access deny OverConnLimit
在该情况中,squid 允许来自每个IP 地址的同时连接数最大为4 个。当某个客户发起第五个连接时, OverConnLimit ACL 被匹配,http_access 规则拒绝该请求。         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 时你能看到以太网地址。例如:
acl WinBoxes arp 00:00:21:55:ed:22
acl WinBoxes arp 00:00:21:ff:55:38

6.2.2 Squid 如何匹配访问规则
回想一下squid 在搜索ACL 元素时使用的“或”逻辑。在acl 里的任何单值都可以导致匹配。 然而,访问规则恰好相反。对http_access 和其他规则设置,squid 使用“与”逻辑。考虑如下示例:
access_list allow ACL1 ACL2 ACL3
对该匹配规则来说,请求必须匹配ACL1,ACL2,ACL3 中的任何一个。假如这些ACL中的任何一个不匹配请求 ,squid 停止搜索该规则,并继续处理下一条。对某个规则来说,将最少匹配的ACL 放在首位,能使效率 最佳。
人们易犯的典型错误是编写永不正确的规则。例如:
acl A src 1.2.3.4
acl B src 5.6.7.8
http_access 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
   
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.3 常见用法
因为访问控制可能很复杂,本节包含一些示例。它们描述了一些访问控制的普通用法。你可以在实际中调整它们。 6.3.1 仅仅允许本地客户 几乎每个squid 安装后,都限制基于客户IP 地址的访问。这是保护你的系统不被滥用的最好的方法之一。做到这点最容易的方法是,编写包含IP 地址空间的ACL,然后允许该ACL 的HTTP 请求,并拒绝其他的。
acl All src 0/0
acl MyNetwork src 172.16.5.0/24 172.16.6.0/24
http_access allow MyNetwork
http_access deny All
也许该访问控制配置过于简单,所以你要增加更多行。记住http_access 的顺序至关重要。不要在deny all 后面增加任何语句。假如必要,应该在allow MyNetwork 之前或之后增加新规则。     6.3.2 阻止恶意客户 因为某种理由,你也许有必要拒绝特定客户IP 地址的访问。这种情况可能发生,例如,假如某个雇员或学生发起一个异常耗费网络带宽或其他资源的web 连接,在根本解决这个问题前,你可以配置squid 来阻止这个请求:
acl All src 0/0
acl MyNetwork src 172.16.5.0/24 172.16.6.0/24
acl ProblemHost src 172.16.5.9
http_access deny ProblemHost
http_access allow MyNetwork
http_access deny All
    6.3.4 在工作时间的受限使用 某些公司喜欢在工作时间限制web 使用,为了节省带宽,或者是公司政策禁止员工在工作时做某些事情。关于这个最难的部分是,所谓合适的和不合适的internet 使用之间的区别是什么。不幸的是,我不能对这个问题作出回答。在该例子里,假设你已收集了一份web站点域名列表,它包含已知的不适合于你的站点名,那么这样配置squid:
acl NotWorkRelated dstdomain "/usr/local/squid/etc/not-work-related-sites"
acl WorkingHours time D 08:00-17:30
http_access deny !WorkingHours NotWorkRelated
请注意在该规则里首先放置!WorkingHours ACL。相对于字符串或列表,dstdomain ACL产生的性能代价较大,但time ACL 检查却很简单。 下面的例子,进一步理解如何结合如下方法和前面描述的源地址控制,来控制访问。
acl All src 0/0
acl MyNetwork src 172.16.5.0/24 172.16.6.0/24
acl NotWorkRelated dstdomain "/usr/local/squid/etc/not-work-related-sites"
acl WorkingHours time D 08:00-17:30
http_access deny !WorkingHours NotWorkRelated
http_access allow MyNetwork
http_access deny All
上面的方法可行,因为它实现了我们的目标,在工作时间内拒绝某些请求,并允许来自你自己网络的请求。然而,它也许有点低效。注意NotWorkRelated ACL 在所有请求里被搜索,而不管源IP 地址。假如那个列表非常长,在列表里对外部网络请求的搜索,纯粹是浪费CPU 资源。所以,你该这样改变规则:
http_access deny !MyNetwork
http_access deny !WorkingHours NotWorkRelated
http_access Allow All
这里,将代价较大的检查放在最后。试图滥用squid 的外部用户不会再浪费你的CPU资源。       6.3.6 授予某些用户特殊的访问 使用基于用户名进行访问控制的组织,通常需要授予某些用户特殊的权限。在该简单示例里,有三个元素:所有授权用户,管理员用户名,限制访问的web 站点列表。正常的用户不允许访问受限站点,但管理员有维护这个列表的任务。他们必须连接到所有服务器,去验证某个特殊站点是否该放到受限站点列表里。如下显示如何完成这个任务:
auth_param basic program /usr/local/squid/libexec/ncsa_auth
/usr/local/squid/etc/passwd
acl Authenticated proxy_auth REQUIRED
acl Admins proxy_auth Pat Jean Chris
acl Porn dstdomain "/usr/local/squid/etc/porn.domains"
acl All src 0/0
http_access allow Admins
http_access deny Porn
http_access allow Authenticated
http_access deny All
首先,有三个ACL 定义。Authenticated ACL 匹配任何有效的代理验证信用。Admins ACL匹配来自用户Pat,Jean,和Chris 的有效信用。Porn ACL 匹配某些原始服务器主机名,它们在porn.domains 文件里找到。 该示例有四个访问控制规则。第一个仅仅检查Admins ACL,允许所有来自Pat,Jean,和Chris 的请求。对其他用户,squid 转移到下一条规则。对第二条规则,假如原始主机名位于porn.domains 文件,那么该请求被拒绝。对不匹配Porn ACL 的请求,squid 转移到第三条规则。第三条规则里,假如请求包含有效的验证信用,那么该请求被允许。外部验证器(这里的ncsa_auth)决定是否信用有效。假如它们无效,最后的规则出现,该请求被拒绝。 注意ncsa_auth 验证器并非必需。你可以使用12 章里描述的任何验证辅助程序。
 
相关阅读 更多 +
排行榜 更多 +
动物大战僵尸I

动物大战僵尸I

飞行射击 下载
龙兽争霸无限零件图纸

龙兽争霸无限零件图纸

飞行射击 下载
金属战士2最新版

金属战士2最新版

飞行射击 下载