Squid是搭建强大的正向代理服务器和反向代理服务器软件。所有设置说明均在官方Wiki书籍中译本:Squid权威指南。
Squid配置文件squid.conf中用acl定义控制列表是顺序无关的,但http_access设置访问控制则与顺序密切相关。初用Squid,被设置顺序搞得很疑惑,于是想出"一句话规则"来理解。
http_access可以设置很多类型的允许(allow)/禁止(deny)访问。主要的类型有:
- src :源地址,即连接该代理服务器的主机的IP地址或地址段
- dst :目标地址,即连接该代理服务器的主机欲访问的IP地址或地址段
- dstdomain :目标域名,即连接该代理服务器的主机欲访问的域名
- time :时间
- 其它详见访问控制
每一次客户端请求代理服务器都会产生组合(源地址src,目标地址dst,目标域名dstdomain,时间time,等等….),服务器端拿着此组合,按http_access的顺序进行匹配(只匹配相同的类型),直到第一次匹配到allow或deny的http_access,如果是allow,则允许访问,不再匹配;如果是deny,则禁止访问,不再匹配。
注意:如果一条组合匹配到最后都没有匹配到allow或deny,那么如果它最后进行匹配的http_access是allow,则deny此次请求;否则allow此次请求。
还有,如果http_access allow后面有两个及以上的值,那么唯当这些值都为真,该请求才能被allow。
例子:
- 只允许192.168.1.0/24子网访问,但不允许访问cctv.com
acl all src all
acl allowip src 192.168.1.0/24
acl badsite dstdomain www.cctv.com
http_access deny badsite
http_access allow allowip
http_access deny all
当非此子网访问时,遇到最后一条deny all会匹配源IP地址,被deny掉,注意,前面两条控制并未匹配到。当该子网访问但未访问cctv.com时,遇到allow allowip被allow放行。当有人访问cctv.com,无论是不是此子网,它都被deny badsite这条规则deny掉。
注意,如果allowip和badsite这两条规则调换就阻止不了访问cctv.com了。
- 所有人允许访问google.com,不允许访问其它网站
acl all src all
acl goodsite dstdomain .google.com
http_access allow goodsite
http_access deny all
按照一句话规则解释得通。
如果要控制上网时间,则上网时间应该设置在子网访问控制的前面,否则就无法控制时间了。
可以得出,控制范围越小的放在越前面,allow和deny构成成一对来控制。