[root@localhost Packages]# rpm -Uvh squid-3.1.4-1.el6.i686.rpm warning: squid-3.1.4-1.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY Preparing... ########################################### [100%] 1:squid ########################################### [100%]
[root@localhost Packages]# chkconfig --level 2345 squid on
[root@localhost Packages]# service squid start Starting squid: . [ OK ]Squid主配置文件/etc/squid /squid.conf
某些人认为 squid 依赖于 L1 和 L2 的特殊值,会执行得更好或更差。这点听起来有关系,即小目录比大目录被检索得更快。
Squid 大约有 25 个不同的 ACL 类型,其中的一些有通用基本类型。例如,src和 dst ACL 使用 IP 地址作为它们的基本类型。为避免冗长,我首先描述基本类型,然后在接下来章节里描述每种 ACL 类型。1.1 IP 地址使用对象:src,dst,myip
1.2 域名使用对象:srcdomain,dstdomain,和 cache_host_domain 指令1.3 用户名
使用对象:ident,proxy_auth
1.4 正则表达式
使用对象:srcdom_regex, dstdom_regex, url_regex, urlpath_regex, browser,
referer_regex, ident_regex, proxy_auth_regex, req_mime_type,
rep_mime_type
1.5 TCP 端口号
使用对象:port,myport
1.6 自主系统号
使用对象:src_as,dst_as
例1:禁止IP地址为192.168.16.200的客户机上网acl badclientip1 src 192.168.16.200
http_access deny badclientip1例2:禁止子网192.168.1.0的所有客户机上网acl badclientnet1 src 192.168.1.0/24http_access deny badclientnet1例3:禁止用户访问IP地址为210.21.118.68的网站acl badsrvip1 dst 210.21.118.68http_access deny badsrvip1
例4:禁止用户访问域名为www.163.com的网站
acl baddomain1 dstdomain www.163.com
http_access deny baddomain1
例5:禁止用户访问域名含有163.com的网站
acl badurl1 url_regex -i 163.com
http_access deny badurl1
例6:禁止用户访问含有sex关键字的URL
acl badurl2 url_regex -i sex
http_access deny badurl2
例7:限制IP地址为192.168.16.200客户机并发最大连接数为5
acl clientip1 src 192.168.16.200
acl conn5 maxconn 5
http_access deny clientip1 conn5
maxconn ACL 指来自客户 IP 地址的大量同时连接。某些 squid 管理员发现这是个有用的方法,用以阻止用户滥用代理或者消耗过多资源。
例8:禁止192.168.2.0子网内的所有客户机在周一到周五的9:00到18:00上网
acl clientnet1 src 192.168.2.0/255.255.255.0
acl worktime time MTWHF 9:00-18:00
http_access deny clientnet1 worktime
time ACL 允许你控制基于时间的访问,时间为每天中的具体时间,和每周中的每天。日期以单字母来表示,见如下表。时间以 24 小时制来表示。开始时间必
须小于结束时间,这样在编写跨越 0 点的 time ACL 时可能有点麻烦。
Table 6-2. Day codes for the time ACL
Code Day
S Sunday
M Monday
T Tuesday
W Wednesday
H Thursday
F Friday
A Saturday
D All weekdays (M-F)
让我们看一个麻烦的例子。也许你是某个 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:00http_access allow !Peak ...
例9:禁止客户机下载*.mp3、*.exe、*.zip和*.rar类型的文件
acl badfile1 urlpath_regex -i \.mp3$ \.exe$ \.zip$ \.rar$
http_access deny badfile1
例10:禁止QQ通过Squid代理上网
acl qq url_regex -i tencent.com
http_access deny qq
Squid按照顺序读取访问控制列表的,在获得匹配的访问控制语句后,不再继续向下查找如果有多条访问控制语句,必须注意它们的顺序
修改完配置文件后,需要使用命令使新的配置生效:/etc/rc.d/init.d/squid reload
访问控制规则的语法如下:
access_list allow|deny [!]ACLname ...
例如:
http_access allow MyClients
http_access deny !Safe_Ports
http_access allow GameSites AfterHours
当读取配置文件时,squid 仅仅扫描一遍访问控制行。这样,在访问列表里引用ACL 元素之前,你必须在 acl 行里定义它们。甚至,访问列表规则的顺序也非常
重要。你以怎样的顺序编写访问列表,那么 squid 就按怎样的顺序来检查它们。将最常用的 ACL 放在列表的开始位置,可以减少 squid 的 CPU 负载。 对大部分访问列表,deny 和 allow 的意义明显。然而,它们中的某些,却并非如此含义清楚。请谨慎的编写 always_direct,never_direct,和 no_cache 规则。在 always_direct 中,allow 规则意味着匹配的请求直接转发到原始服务器。always_direct deny 规则意味着匹配的请求不强迫发送到原始服务器,但假如邻居cache不可到达,那可能还是会这么做。no_cache 规则也有点麻烦。这里,你必须对不必被 cache 的请求使用 deny。
对该匹配规则来说,请求必须匹配 ACL1,ACL2,ACL3 中的任何一个。假如这些 ACL中的任何一个不匹配请求,squid 停止搜索该规则,并继续处理下一条。对某个
规则来说,将最少匹配的 ACL 放在首位,能使效率最佳。考虑如下示例:
acl A method http
acl B port 8080
http_access deny A B
该 http_access 规则有点低效,因为 A ACL 看起来比 B ACL 更容易匹配。反转顺序应该更好,以便 squid 仅仅检查一个 ACL,而不是两个:
http_access deny B A
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