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。

例子:

  1. 只允许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了。

  1. 所有人允许访问google.com,不允许访问其它网站
      acl all src all 
     acl goodsite dstdomain .google.com
     http_access allow goodsite
     http_access deny all

按照一句话规则解释得通。

如果要控制上网时间,则上网时间应该设置在子网访问控制的前面,否则就无法控制时间了。

可以得出,控制范围越小的放在越前面,allow和deny构成成一对来控制。