访问控制
要想查看目前代理服务器正在连接什么东西需要查看access.log,由于是个文件,如果想实时监控的话可以使用tail的-f命令来follow这个文件。
开始扫描《squid中午权威指南》里头提到了splay tree,一定要研习一番
访问控制ACL(要求彼此之间没有交集)
acl name type value1 value2 …
6.1.1 type大约有25个
6.1.1.1 ip地址:src,dst,myip,以下三种表达方式是相同的,最好不要使用域名,直接使用ip
acl Xyz src 172.16.55.32/255.255.255.248
acl Xyz src 172.16.55.32/28 #我觉得还是这种最帅气
acl Xyz src 172.16.55.32 #这种不知道对不对(对的,已验证)
另外,支持这种写法:
acl Bar src 172.16.10.0-172.16.19.0/24
6.1.1.2 域名:srcdomain, dstdomain,和cache_host_domain指令
URL hostname | Matches ACL lrrr.org? | Matches ACL .lrrr.org? |
Yes | Yes | |
No | Yes | |
No | No |
6.1.1.3 用户名:ident, proxy_auth
6.1.1.4 正则表达式:scrdom_regex, dstdom_regex, url_regex, urlpath_regex, browser, referer_regex, ident_regex, proxy_auth_regex, reg_mime_type, rep_mime_type
6.1.1.5 TCP端口号:port, myport
acl Foo port 123
acl Foo port 1-1024
6.1.1.6 自主系统号:src_as, dst_as ***用不上吧
6.1.2.1 src
使用ip地址控制客户对Squid的访问,如果是url也会被dns到ip,可以使用dstdomain来解决
6.1.2.3 myip
指Squid的IP地址
6.1.2.4 dstdomain
基于名字的访问控制,对url的主机名部分使用字符串比较功能
6.1.2.5 srcdomain
客户反向DNS查询
6.1.2.6 port
访问目标的端口
6.1.2.7 myport
squid的监听端口,可以不止一个
6.1.2.8 method
HTTP请求方法:GET, POST, PUT等
6.1.2.9 proto
指URL访问协议:http, https ftp, gopher, urn, whois, cache_object
6.1.2.10 time
控制基于时间的访问
acl Working_hours MTWHF 08:00-17:00
6.1.2.11 ident***用不上
6.1.2.12 proxy_auth
6.1.2.16 maxconn 最大连接数
acl OverConnLimit maxconn 4
http_access deny OverConnLimit
6.1.2.17 arp
在同一子网基于物理地址的控制
acl WinBoxes arp 00:00:21:55:ed:22
acl WinBoxes arp 00:00:21:ff:55:38
6.1.2.18 srcdom_regex:使用正则表达式匹配客户域名,依然需要
6.1.2.19 dstdom_regex:与dstdomain类似,只是使用了正则
6.1.2.20 url_regex:用于匹配URL请求的任何部分,包括传输协议和原始服务器主机名
acl FTPMP3 url_regex -i ^ftp://.*\.mp3$
6.1.2.21 urlpath_regex:前者排除传输协议和主机名后就是他
6.1.2.22 browser 对客户HTTP请求里user-agent头执行正则表达式匹配
acl AuidoFileUploads req_mime_type -i ^audio/
6.1.2.23 req_mime_type 对原始服务器HTTP响应里content-type头部正则匹配
acl JavaDownload rep_mime_type application/x-java
http_reply_access deny JavaDownload
6.1.2.26 proxy_auth_regex对代理认证用户名使用正则
acl Admins proxy_auth_regex -i ^admin
6.2 访问控制规则
前面是访问控制(acl)元素的建立。接着通过前面的元素建立访问控制规则,用来拒绝或允许某些动作,语法:access_list allow|deny [!]ACLname ...
6.2.2 如何匹配访问规则
逐条处理,acl是"或"逻辑,访问规则使用"与"逻辑
access_list allow ACL1 ACL2 ACL3请求必须匹配任何一个,因此要将最少匹配放在首位
对某个ACL值的匹配算法是,squid在访问列表里找到匹配规则时,搜索终止。假如没有访问规则导致匹配,默认动作是列表里最后一条规则的取反。例如,考虑如下简单访问配置:
acl Bob ident bob
http_access allow Bob
假如用户Mary发起请求,她会被拒绝。列表里最后的(后面没有访问列表了)规则是allow规则,它不匹配用户名mary。这样,默认的动作是allow的取反,故请求被拒绝。类似的,假如最后的规则是deny规则,默认动作是允许请求。在访问列表的最后加上一条,明确允许或拒绝所有请求,是好的实际做法。为清楚起见,以前的示例应该如此写:(这样,所有的src都会卡在下面最后一条上,因为都会匹配ALL)
acl All src 0/0
acl Bob ident bob
http_access allow Bob
http_access deny All
src 0/0 ACL表示匹配每一个和任意类型的请求。