ACL简介 Squid ACL(Access Control List,访问控制列表)提供了代理控制的功能。 通过设置ACL,Squid可以针对源地址、目标地址、访问的URL路径、访问的时间等各种条件进行过滤,从而实现对网络流量的精细控制。
基本的ACL元素语法:
1 acl name type value1 value2 ...
可以对一个ACL元素列举多个值,也可以多个ACL行使用同一个名字。例如,以下两种配置方式是等价的
1 acl safe_ports port 80 443 8080
等价于
1 2 3 acl safe_ports port 80 acl safe_ports port 443 acl safe_ports port 8080
ACL使用方法实例 实例1:只允许网段10.206.216.0/24的客户机访问Squid, 拒绝其他客户端请求 修改squid.conf,添加如下几行配置
1 2 3 acl clients src 10.206.216.0/24 http_access allow clients http_access deny all
使用如下命令校验配置文件,重启Squid
1 2 squid -k parse # 校验Squid配置文件 squid -k reconfigure # 重新加载配置
实例2:只允许访问指定的域名或IP 修改squid.conf,添加如下几行配置
1 2 3 4 5 6 7 acl SSL_ports port 443 http_access deny CONNECT !SSL_ports acl allow_domain dstdomain www.baidu.com .google.com acl allow_ip dst 180.101.50.188 142.250.199.100 http_access allow allow_domain http_access allow allow_ip
注: 当ACL域名以”.”开头,squid将它作为通配符,它匹配在该域的任何主机名,甚至域名自身。如果ACL域名不以”.”开头,squid使用精确的字符串比较。
测试:
1 2 3 4 5 6 7 8 9 curl -x localhost:3128 https://www.baidu.com curl -x localhost:3128 https://www.google.com curl -x localhost:3128 180.101.50.188 curl -x localhost:3128 142.250.199.100 都应该返回200 OK 访问其他domain或IP, 返回403 Forbidden curl -x localhost:3128 https://www.4399.com curl: (56) Received HTTP code 403 from proxy after CONNECT
实例3:允许非443端口的FQDN通过 实际场景中,HTTPS server未必都是443标准端口。 比方说,我需要允许www.yourserver.com:8080
这个FQDN通过,拒绝其他HTTPS请求。 squid.conf可以配置如下
1 2 3 4 5 6 acl SSL_ports port 8080 http_access deny CONNECT !SSL_ports acl PORT_8080 port 8080 acl allow_domain_8080 dstdomain www.yourserver.com http_access allow allow_domain_8080 PORT_8080
测试:
1 2 curl -x peter:123@localhost:3128 https://www.yourserver.com:8080 返回200 OK,或者超时, 不会返回403 Forbidden
实例4:只允许通过认证的客户访问Squid 参考: 给Squid代理添加basic认证
一个综合案例 配置squid.conf,需求如下:
只允许通过HTTP basic认证的客户访问Squid
对于通过认证的客户, 只允许如下FQDN通过,拒绝其他的FQDN
Squid.conf配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS # auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/squid_user auth_param basic children 5 auth_param basic realm Proxy Authentication Required auth_param basic credentialsttl 2 hours auth_param basic casesensitive on acl authUsers proxy_auth REQUIRED acl SSL_ports port 443 acl SSL_ports port 8080 http_access deny CONNECT !SSL_ports acl PORT_443 port 443 acl PORT_8080 port 8080 acl allow_domain dstdomain www.baidu.com .google.com acl allow_ip dst 180.101.50.188 142.250.199.100 http_access allow allow_domain PORT_443 authUsers http_access allow allow_ip PORT_443 authUsers # 同时满足allow_ip, PORT_443, authUsers这三个ACL的请求才允许通过; acl allow_domain_8080 dstdomain www.yourserver.com http_access allow allow_domain_8080 PORT_8080 authUsers http_access deny all
测试: 不带认证访问白名单的FQDN, 返回407
1 2 curl -x localhost:3128 https://www.baidu.com curl: (56) Received HTTP code 407 from proxy after CONNECT
认证正确,但访问不在白名单的FQDN,返回403
1 2 3 4 curl -x peter:123@localhost:3128 https://www.4399.com curl: (56) Received HTTP code 403 from proxy after CONNECT curl -x peter:123@localhost:3128 https://www.yourserver.com curl: (56) Received HTTP code 403 from proxy after CONNECT
认证正确,访问白名单的FQDN,返回200 OK
1 2 curl -x peter:123@localhost:3128 https://www.baidu.com curl -x peter:123@localhost:3128 https://www.yourserver.com:8080
参考 【1】 Squid中文权威指南 第6章 【2】 巧用Squid的ACL和访问列表实现高效访问控制