🔗 Squid 中的访问控制
🔗 基础:各部分如何协同工作
Squid 的访问控制机制相对全面,但有些用户难以理解。它包含两个不同的组件:ACL 元素 和 访问列表。访问列表由一个 允许 或 拒绝 操作后跟一系列 ACL 元素组成。
加载配置文件时,Squid 会将所有 acl 行(指令)处理到内存中,作为可以针对任何请求事务执行的测试。下一节 ACL 元素 将概述测试的类型。这些测试本身什么也不做。例如,“星期日”这个词匹配一个星期中的某一天,但它并不表明您正在阅读这篇文章的哪一天。
要处理事务,需要使用另一种类型的行。每次需要执行处理操作时,都会运行一个检查来测试将要为该事务执行的操作或限制。下一节 访问列表 将概述检查的类型,然后详细介绍这些检查如何工作。
🔗 ACL 元素
此处信息对版本 3.1 有效。有关可用类型配置指南的最新列表,请参阅 acl。 |
Squid 了解以下类型的 ACL 元素
🔗 可用的 ACL 类型
- src:源(客户端)IP 地址
- dst:目标(服务器)IP 地址
- myip:客户端连接的本地 IP 地址
- arp:以太网(MAC)地址匹配
- srcdomain:源(客户端)域名
- dstdomain:目标(服务器)域名
- srcdom_regex:源(客户端)正则表达式模式匹配
- dstdom_regex:目标(服务器)正则表达式模式匹配
- src_as:源(客户端)自治系统编号
- dst_as:目标(服务器)自治系统编号
- peername:分配给预期发送请求的 cache_peer 的名称标签。
- time:一天中的时间,以及一周中的某一天
- url_regex:URL 正则表达式模式匹配
- urlpath_regex:URL 路径正则表达式模式匹配,不包括协议和主机名
- port:目标(服务器)端口号
- myport:客户端连接的本地端口号
- myportname:客户端连接的 Squid 监听端口的名称标签
- proto:传输协议(http、ftp 等)
- method:HTTP 请求方法(get、post 等)
- http_status:HTTP 响应状态(200 302 404 等)
- browser:请求用户代理头部的正则表达式模式匹配
- referer_regex:请求 http-referer 头部的正则表达式模式匹配
- ident:用户名上的字符串匹配
- ident_regex:用户名上的正则表达式模式匹配
- proxy_auth:通过外部进程进行用户身份验证
- proxy_auth_regex:通过外部进程进行用户身份验证的正则表达式模式匹配
- snmp_community:SNMP community 字符串匹配
- maxconn:限制单个客户端 IP 地址的最大连接数
- max_user_ip:限制一个用户可以登录的最大 IP 地址数
- req_mime_type:请求 Content-Type 头部的正则表达式模式匹配
- req_header:请求头内容上的正则表达式模式匹配
- rep_mime_type:响应(下载内容)Content-Type 头部的正则表达式模式匹配。此类型只能在 http_reply_access 指令中使用,不能在 http_access 中使用。
- rep_header:响应头内容上的正则表达式模式匹配。此类型只能在 http_reply_access 指令中使用,不能在 http_access 中使用。
- external:通过 external_acl_type 定义的外部 acl 辅助程序进行查找
- user_cert:与用户 SSL 证书中的属性进行匹配
- ca_cert:与用户颁发的 CA SSL 证书中的属性进行匹配
- ext_user:与 external_acl_type 定义的外部 acl 辅助程序返回的 user= 字段进行匹配
- ext_user_regex:与 external_acl_type 定义的外部 acl 辅助程序返回的 user= 字段进行正则表达式模式匹配
备注:
并非所有 ACL 元素都可以与所有类型的访问列表(如下所述)一起使用。例如,snmp_community 仅在使用 snmp_access 时才有意义。src_as 和 dst_as 类型仅在 cache_peer_access 行中使用。
arp ACL 需要 Squid-3.1 及更早版本的特殊配置选项 –enable-arp-acl,对于较新的 Squid 版本,EUI-48(又名 MAC 地址)支持默认启用。此外,ARP / EUI-48 代码不能移植到所有操作系统。它在 Linux、Solaris 和某些 *BSD 变体上运行。
SNMP ACL 元素和访问列表需要 –enable-snmp 配置选项。
某些 ACL 元素可能导致处理延迟。例如,使用 srcdomain 和 srcdom_regex 需要对客户端的 IP 地址进行反向 DNS 查找。此查找会增加请求的延迟。
每个 ACL 元素都被分配一个唯一的名称。命名的 ACL 元素由一个值列表组成。在检查匹配项时,多个值使用 OR 逻辑。换句话说,当其值中的任何一个匹配时,ACL 元素即被匹配。
您不能为两种不同类型的 ACL 元素赋予相同的名称。这将导致语法错误。
您可以将相同 ACL 名称的不同值放在不同的行上。Squid 会将它们合并为一个列表。
🔗 访问列表
有许多不同的访问列表
- http_access:允许 HTTP 客户端(浏览器)访问 HTTP 端口。这是主要的访问控制列表。
- http_reply_access:允许 HTTP 客户端(浏览器)接收对其请求的响应。这进一步限制了 http_access 授予的权限,主要用于与 rep_mime_type acl 结合使用以阻止不同内容类型。
- icp_access:允许邻居缓存通过 ICP 查询您的缓存。
- miss_access:允许某些客户端通过您的缓存转发缓存未命中。这进一步限制了 http_access 授予的权限,主要用于通过拒绝同级缓存转发未命中来强制同级关系。
- cache:定义不应缓存的响应。
- url_rewrite_access:控制哪些请求被发送到重定向器池。
- ident_lookup_access:控制哪些请求需要进行 Ident 查找。
- always_direct:控制哪些请求应始终直接转发到源服务器。
- never_direct:控制哪些请求永远不应直接转发到源服务器。
- snmp_access:控制 SNMP 客户端对缓存的访问。
- broken_posts:定义 Squid 在 POST 消息体后附加额外的 CRLF 的请求,因为某些损坏的源服务器需要这样做。
- cache_peer_access:控制哪些请求可以转发到给定的邻居(cache_peer)。
- htcp_access:控制哪些远程机器能够发出 HTCP 请求。
- htcp_clr_access:控制哪些远程机器能够发出 HTCP CLR 请求。
- request_header_access:控制在违反 HTTP 协议时移除哪些请求头。
- reply_header_access:控制在违反 HTTP 协议时从传递给客户端的响应头中移除哪些响应头。
- delay_access:控制哪些请求由哪个 延迟池 处理
- icap_access:(在 Squid-3.1 中被 adaptation_access 替换)哪些请求可以发送到特定的 ICAP 服务器。
- adaptation_access:哪些请求可以发送到特定的 ICAP 或 eCAP 过滤器服务。
- log_access:控制哪些请求被记录。这是全局性的,会覆盖附加到 access_log 指令的特定文件访问列表。
备注:
访问列表规则由一个允许或拒绝关键字组成,后跟一个 ACL 元素名称列表。
访问列表由一个或多个访问列表规则组成。
访问列表规则按书写顺序检查。一旦找到匹配的规则,列表搜索就会终止。
如果规则包含多个 ACL 元素,则使用 AND 逻辑。换句话说,所有规则中的 ACL 元素都必须匹配,规则才算匹配。这意味着可以编写一个永远无法匹配的规则。例如,端口号永远无法同时等于 80 和 8000。
总结来说,ACL 逻辑可以描述为:(注意:下面的 AND/OR 仅用于说明,不是语法的一部分)
http_access allow|deny acl AND acl AND ...
OR
http_access allow|deny acl AND acl AND ...
OR
...
如果配置的规则都不匹配,则 Squid 会反转最后一条已配置规则的操作。例如,如果最后一条配置的 http_access 操作是“允许”,则 Squid 会拒绝访问。
有关特定指令的默认行为,请查阅指令文档。例如,如果根本没有配置 http_access 规则,Squid 会拒绝访问。
依赖于这些隐式默认值是危险的,因为当您添加或删除最后一条已配置规则时,Squid 的操作可能会“意外”更改。最好用一个明确匹配任何事务的规则来结束您的规则。例如:
http_access deny all
🔗 如何允许我的客户端使用缓存?
定义一个与您的客户端 IP 地址对应的 ACL。例如:
acl myclients src 172.16.5.0/24
接下来,在 http_access 列表中允许这些客户端。
http_access allow myclients
🔗 如何配置 Squid 不缓存特定服务器?
acl someserver dstdomain .someserver.com
cache deny someserver
🔗 如何实现 ACL 封禁列表?
例如,假设您想阻止用户访问烹饪食谱。
一种实现方法是拒绝访问包含“cooking”或“recipe”字样的任何 URL。您将使用以下配置行:
acl Cooking1 url_regex cooking
acl Recipe1 url_regex recipe
acl myclients src 172.16.5.0/24
http_access deny Cooking1
http_access deny Recipe1
http_access allow myclients
http_access deny all
url_regex 表示搜索整个 URL 以查找您指定的正则表达式。请注意,这些正则表达式区分大小写,因此包含“Cooking”的 URL 将不会被拒绝。
另一种方法是拒绝访问已知包含食谱的特定服务器。例如:
acl Cooking2 dstdomain www.gourmet-chef.com
http_access deny Cooking2
http_access allow all
dstdomain 表示在 URL 中搜索字符串“www.gourmet-chef.com”的主机名。请注意,当 URL 中使用 IP 地址(而不是域名)时,Squid 可能需要进行 DNS 查找以确定 ACL 是否匹配:如果 IP 地址的域名已在 Squid 的“FQDN 缓存”中,则 Squid 可以立即将目标域与访问控制进行比较。否则,Squid 将执行异步反向 DNS 查找,并在查找完成后评估 ACL。后续的 ACL 评估可能会使用(如果有)缓存的查找结果。
异步查找是为 http_access 和其他支持所谓“慢速”ACL 的指令执行的。如果某个指令不支持必需的异步 DNS 查找,那么现代 Squid 会使用“none”而不是实际域名来确定 dstdomain ACL 是否匹配,但您不应依赖此行为。要禁用 DNS 查找,请使用“-n”ACL 选项(在支持的地方)。
🔗 如何阻止特定用户或组访问我的缓存?
🔗 使用 Ident
您可以使用 ident 查找来允许特定用户访问您的缓存。这要求用户机器上运行 ident 服务器进程。在您的 squid.conf 配置文件中,您将编写如下内容:
ident_lookup_access allow all
acl friends ident kim lisa frank joe
http_access allow friends
http_access deny all
请注意,ident_lookup_access 仅允许/拒绝是否测试机器的 Ident。这不会直接改变对用户请求的访问。
🔗 是否有办法仅为主机执行 ident 查找并将结果与 squid.conf 中的用户列表进行比较?
您可以使用 ident_lookup_access 指令来控制 Squid 将为哪些主机发出 ident 查找请求。
此外,如果您在 squid.conf 中使用 ident ACL,那么即使 ident_lookup_access 未指示应提前执行 ident 查找,Squid 也会确保在评估 acl 时执行 ident 查找。
但是,Squid 不会等待查找完成,除非 ACL 规则需要它。考虑此配置:
acl host1 src 10.0.0.1
acl host2 src 10.0.0.2
acl pals ident kim lisa frank joe
http_access allow host1
http_access allow host2 pals
来自 10.0.0.1 的请求将立即被允许,因为该主机没有用户要求。但是,来自 10.0.0.2 的请求将在 ident 查找完成后才被允许,并且如果用户名在 kim、lisa、frank 或 joe 集合中。
🔗 使用代理身份验证
另一种选择是使用代理身份验证。在此方案中,您为个人分配用户名和密码。当他们第一次使用代理时,会被要求输入用户名和密码进行身份验证。
在 Squid 中,此身份验证通过外部进程处理。有关如何配置此信息,请参阅 SquidFaq/ProxyAuthentication。
🔗 是否有允许用户自行更改代理密码的 CGI 程序?
Pedro L Orso 已将 Apache 的 htpasswd 改编成一个名为 chpasswd.cgi 的 CGI 程序。
🔗 常见错误
🔗 AND/OR 逻辑
ACL 驱动指令的解释部分基于以下规则:
-
acl 条目的所有元素都被 OR 运算。.
-
access 条目的所有元素都被 AND 运算(例如 http_access 和 icp_access)。
例如,以下访问控制配置永远不会奏效:
acl ME src 10.0.0.1
acl YOU src 10.0.0.2
http_access allow ME YOU
为了允许请求,它必须匹配“ME”acl并且“YOU”acl。这是不可能的,因为任何 IP 地址只能匹配其中之一。这应该重写为:
acl ME src 10.0.0.1
acl YOU src 10.0.0.2
http_access allow ME
http_access allow YOU
或者,也可以这样:
acl US src 10.0.0.1 10.0.0.2
http_access allow US
🔗 允许/拒绝混淆
我已多次阅读我的 squid.conf,与我的同事交流过,阅读了 FAQ 和 Squid 文档,但就是弄不明白为什么以下内容不起作用。
我可以从我们这里的 Web 服务器机器成功访问 **cachemgr.cgi**,但我希望使用 MRTG 来监控我们代理的各个方面。当我尝试从代理运行的机器上使用 squidclient 或 GET cache_object 时,我总是收到访问被拒绝的错误。
acl manager proto cache_object
acl localhost src 127.0.0.1
acl server src 1.2.3.4
acl ourhosts src 1.2.0.0/24
http_access deny manager !localhost !server
http_access allow ourhosts
http_access deny all
这里的目的是允许来自localhost和server地址的缓存管理器请求,并拒绝所有其他请求。此策略已在此处表达:
http_access deny manager !localhost !server
这里的问题是,对于允许的请求,此访问规则不匹配。例如:
- 如果源 IP 地址是localhost,则“!localhost”为false,访问规则不匹配,因此 Squid 继续检查其他规则。
- 如果源 IP 地址是server,则“!server”为false,访问规则不匹配,因此 Squid 继续检查其他规则。
来自server地址的缓存管理器请求起作用,因为server是ourhosts的子集,并且第二条访问规则将匹配并允许请求。
请注意,这也意味着来自ourhosts的任何缓存管理器请求都将被允许。
为了正确实现所需的策略,应重写访问规则如下:
http_access allow manager localhost
http_access allow manager server
http_access deny manager
http_access allow ourhosts
http_access deny all
如果您正在使用 miss_access,请不要忘记也为缓存管理器添加 miss_access 规则。
miss_access allow manager
您可能会担心有五个访问规则而不是三个会影响缓存性能。根据我们的经验,事实并非如此。Squid 可以在不降低整体性能的情况下处理适量的访问控制检查。您可以自己验证这一点。
🔗 “src”和“srcdomain”ACL 类型之间的区别
对于 srcdomain ACL 类型,Squid 会对客户端 IP 地址进行反向查找,并将其结果与 acl 行中给出的域名进行比较。使用 src ACL 类型时,Squid 在启动时将主机名转换为 IP 地址,然后仅比较客户端的 IP 地址。src ACL 比 srcdomain 更受欢迎,因为它不需要为每个请求进行地址到名称的查找。
🔗 我设置了访问控制,但它们不起作用!为什么?
如果 ACL 出现问题并且您不知道它们为何不起作用,您可以使用此技巧来调试它们。
在 squid.conf 中,将第 33 部分的调试级别设置为 2。例如:
debug_options ALL,1 33,2
然后重新启动或重新配置 squid。
从现在开始,您的 cache.log 应该包含每条请求的日志,解释它是否被允许或拒绝,以及哪个 ACL 是最后匹配的。
如果这不能为您提供足够的信息来查明问题,您还可以启用 ACL 处理的详细调试信息:
debug_options ALL,1 33,2 28,9
然后像上面一样重新启动或重新配置 squid。
从现在开始,您的 cache.log 应该包含所有访问列表处理的详细跟踪。请注意,这每条请求可能有很多行。
另请参阅 TroubleShooting。
🔗 代理身份验证和邻居缓存
问题
[ Parents ]
/ \
/ \
[ Proxy A ] --- [ Proxy B ]
|
|
USER
代理 A 向代理 B 发送 ICP 查询,关于一个对象,代理 B 回复 ICP_HIT。代理 A 将 HTTP 请求转发给代理 B,但未传递身份验证详细信息,因此来自代理 A 的 HTTP GET 请求失败。
链中只允许 ONE 代理缓存“使用”代理身份验证请求头。一旦使用了该头,就不得将其传递给其他代理。
因此,您必须允许邻居缓存彼此之间请求,而无需代理身份验证。这可以通过在 http_access 行列表中先列出邻居 ACL 来轻松实现。例如:
acl proxy-A src 10.0.0.1
acl proxy-B src 10.0.0.2
acl user_passwords proxy_auth /tmp/user_passwds
http_access allow proxy-A
http_access allow proxy-B
http_access allow user_passwords
http_access deny all
Squid-2.5 允许此规则有两个例外,方法是定义适当的 cache_peer 选项:
cache_peer parent.foo.com parent login=PASS
这将按原样将用户的凭据转发给父代理,父代理因此能够再次进行身份验证。
这仅适用于Basic身份验证方案。如果启用了任何其他方案,它将失败。
cache_peer parent.foo.com parent login=*:somepassword
这将对父代理执行Basic身份验证,发送当前客户端连接的用户名,并始终以somepassword作为密码。父代理需要将子缓存的 IP 地址进行授权,就好像没有身份验证转发一样,并且需要通过一个特制的身份验证助手为所有用户名与somepassword执行客户端身份验证。目的是将客户端缓存的用户名记录到父代理的access.log中。您可以找到一个类似的半测试助手 parent_auth.pl。
🔗 是否有简单的方法来禁止所有目标地址,除了一个?
acl GOOD dst 10.0.0.1
http_access allow GOOD
http_access deny all
🔗 如何阻止访问色情网站?
通常,使用 Squid 拒绝色情内容最困难的部分是列出应被阻止的网站。您可能想自己维护这样的列表,或者从别处获取(见下文)。请注意,一旦您开始阻止 Web 内容,用户将尝试使用 Web 代理来规避色情过滤器,因此您还需要阻止所有 Web 代理(如果您不知道什么是 Web 代理,请访问 http://www.proxy.org)。
使用此类列表的 ACL 语法取决于其内容。如果列表包含正则表达式,请使用此方法:
acl PornSites url_regex "/usr/local/squid/etc/pornlist"
http_access deny PornSites
另一方面,如果列表包含源服务器主机名,只需在此示例中将 url_regex 更改为 dstdomain。
🔗 是否有人有色情网站等的封禁列表?
- 免费 ufdbGuard 重定向器的维护者拥有一个商业 URL 数据库。
请注意,一旦您开始阻止 Web 内容,用户将尝试使用 Web 代理来规避过滤,因此您还需要阻止所有 Web 代理。
🔗 Squid 不匹配我的子域
如果您使用的是 Squid-2.4 或更高版本,请注意 dstdomain ACL 对精确主机匹配和整个域匹配使用不同的语法。www.example.com 匹配精确主机www.example.com,而 .example.com 匹配整个域example.com(包括单独的 example.com)。
如果您的 dstdomain ACL 包含对域中的精确主机和整个域的匹配,而两者都在同一个域中(即,既有 www.example.com 也有 .example.com),则也会存在细微问题。根据您的数据顺序,这可能只会导致其中最具体的一个(例如 www.example.com)被使用。
Squid-2.4 及更高版本会在使用此类配置时发出警告。如果您的 Squid 在读取配置文件时没有发出警告,则您没有下面描述的问题。此外,这里的配置使用了 Squid-2.1 或更早版本的 dstdomain 语法。(Squid-2.2 及更高版本需要域名前加一个点)。
基于域名的访问控制存在一个细微问题,即当单个 ACL 元素的一个条目是另一个条目的子域时。例如,考虑以下列表:
acl FOO dstdomain boulder.co.us vail.co.us .co.us
首先,上述列表是错误的,因为前两个(boulder.co.us 和 vail.co.us)是不必要的。匹配前两个之一的任何域名也将匹配最后一个(co.us)。好的,但为什么会发生这种情况?
问题源于用于在访问控制列表中索引域名的数据结构。Squid 对域名列表使用Splay 树。与其他基于树的数据结构一样,搜索算法需要一个比较函数,该函数对任何一对键(域名)返回 -1、0 或 +1。这类似于 strcmp() 的工作方式。
问题在于,说 co.us 小于、等于或大于 boulder.co.us 是不正确的。
例如,如果您说 co.us 小于 fff.co.us,那么 Splay 树搜索算法可能永远不会发现 co.us 是 kkk.co.us 的匹配项。
同样,如果您说 co.us 大于 fff.co.us,那么 Splay 树搜索算法可能永远不会发现 co.us 是 bbb.co.us 的匹配项。
底线是,您不能让一个条目成为另一个条目的子域。Squid 会在检测到此条件时警告您。
🔗 为什么 Squid 会拒绝某些端口号?
允许 Squid 连接到某些端口号是危险的。例如,已证明有人可以使用 Squid 作为 SMTP(电子邮件)中继。正如您可能知道的,SMTP 中继是垃圾邮件发送者能够淹没我们邮箱的方式之一。为防止邮件中继,Squid 会在 URL 端口号为 25 时拒绝请求。作为防止其他不太常见的攻击的预防措施,也应该阻止其他端口。
有两种方法可以通过端口号进行过滤:允许特定端口或拒绝特定端口。默认情况下,Squid 执行第一种方法。这是默认 squid.conf 中的 ACL 条目:
acl Safe_ports port 80 21 443 563 70 210 1025-65535
http_access deny !Safe_ports
上述配置会拒绝 URL 端口号不在列表中的请求。该列表允许连接到 HTTP、FTP、Gopher、SSL、WAIS 的标准端口以及所有非特权端口。
另一种方法是拒绝危险端口。危险端口列表应如下所示:
acl Dangerous_ports port 7 9 19 22 23 25 53 109 110 119
http_access deny Dangerous_ports
…可能还有许多其他端口。
有关已知端口和协议列表,请参阅系统上的 /etc/services 文件。
🔗 Squid 是否支持使用如 mySQL 这样的数据库来存储 ACL 列表?
是的,Squid 支持通过 external_acl_type 指令与外部数据源进行 ACL 交互。LDAP 和 NT 域组成员资格的辅助程序已包含在发行版中,并且很容易编写其他辅助程序以适应您的环境。
🔗 如何允许单个地址访问特定 URL?
此示例仅允许 special_client 访问 special_url。任何其他尝试访问 special_url 的客户端都将被拒绝。
acl special_client src 10.1.2.3
acl special_url url_regex ^https://squid.org.cn/Doc/FAQ/$
http_access allow special_client special_url
http_access deny special_url
🔗 如何在特定时间允许某些客户端使用缓存?
假设您有两台工作站,它们应该只在工作时间(8:30 - 17:30)允许访问 Internet。您可以使用类似以下的方法:
acl FOO src 10.1.2.3 10.1.2.4
acl WORKING time MTWHF 08:30-17:30
http_access allow FOO WORKING
http_access deny FOO
🔗 如何在特定时间允许某些用户使用缓存?
acl USER1 proxy_auth Dick
acl USER2 proxy_auth Jane
acl DAY time 06:00-18:00
http_access allow USER1 DAY
http_access deny USER1
http_access allow USER2 !DAY
http_access deny USER2
🔗 带复杂网络掩码的 IP ACL 问题
以下 ACL 条目会产生不一致或意外的结果
acl restricted src 10.0.0.128/255.0.0.128 10.85.0.0/16
原因是 IP 访问列表存储在“splay”树数据结构中。这些树要求键(即地址/掩码对)遵循严格的排序顺序。复杂或非标准的网络掩码(如使用非 CIDR 网络掩码表示法的 255.0.0.128 网络掩码)会破坏键比较函数。
解决此问题的最佳方法是为每个 ACL 值使用单独的 ACL 名称。例如,将上面的内容更改为:
acl restricted1 src 10.0.0.128/255.0.0.128
acl restricted2 src 10.85.0.0/16
当然,您还必须重写您的 http_access 行。
🔗 是否可以根据 MAC 地址而不是 IP 设置 ACL?
是的,对于某些操作系统。ACL 类型名为 arp,取自 IPv4 中用于获取 EUI-48 / MAC 地址的 ARP 协议。Linux、Solaris 以及可能的 BSD 变体都支持此 ACL。
MAC 地址仅对同一子网中的客户端可用。如果客户端位于不同的子网,则 Squid 无法找出其 MAC 地址,因为当数据包被路由时,MAC 会被路由器的 MAC 替换。
在您的 squid.conf 中添加一些 arp ACL 条目
acl M1 arp 01:02:03:04:05:06
acl M2 arp 11:12:13:14:15:16
http_access allow M1
http_access allow M2
http_access deny all
运行 squid -k parse 以确认 ARP / EUI 支持可用,并且 ACL 将会正常工作。
🔗 是否可以限制来自客户端的连接数?
是的,将 maxconn ACL 类型与 http_access deny 结合使用。例如:
acl losers src 1.2.3.0/24
acl 5CONN maxconn 5
http_access deny 5CONN losers
在上述配置中,当源 IP 地址位于 1.2.3.0/24 子网中的客户端尝试同时建立 6 个或更多连接时,Squid 会返回错误页面。除非您使用 deny_info 功能,否则错误消息只会显示“access denied”(拒绝访问)。
maxconn ACL 需要 client_db 功能。如果您已禁用 client_db(例如通过 client_db off),那么 maxconn ACL 将不起作用。
请注意,maxconn ACL 类型有点棘手,因为它使用了小于比较。当已建立的连接数 *大于* 您指定的数值时,ACL 会匹配。因此,您不希望将 maxconn ACL 与 http_access allow 一起使用。
另请注意,您可以使用 maxconn 结合用户类型(ident、proxy_auth),而不是 IP 地址类型。
🔗 我试图拒绝 foo.com,但不起作用。
在 Squid-2.3 中,我们改变了 Squid 匹配子域的方式。.foo.com 和 foo.com 之间存在差异。前者匹配 foo.com 中的任何域,而后者仅精确匹配“foo.com”。因此,如果您想拒绝 bar.foo.com,应该这样写:
acl yuck dstdomain .foo.com
http_access deny yuck
🔗 我想自定义或创建自己的错误消息。
您可以通过 Customizable Error Messages 中描述的方式自定义现有错误消息。您还可以创建新的错误消息,并与 deny_info 选项结合使用。
例如,假设您希望用户在请求匹配您的色情内容列表的内容时看到一条特殊消息。首先,在 /usr/local/squid/etc/errors 目录中创建一个名为 ERR_NO_PORNO 的文件。该文件可能包含类似以下内容:
Our company policy is to deny requests to known porno sites. If you
feel you've received this message in error, please contact
the support staff (support@this.company.com, 555-1234).
接下来,像这样设置您的访问控制:
acl porn url_regex "/usr/local/squid/etc/porno.txt"
deny_info ERR_NO_PORNO porn
http_access deny porn
(additional http_access lines ...)
🔗 我想在错误消息中使用本地时区。
默认情况下,Squid 在所有生成的错误消息中使用 GMT 作为时间戳。这样做是为了让缓存能够参与不同时区缓存层次结构,而不会出现关于时间的混淆。
要更改 Squid 生成的错误消息中的时间戳,您必须更改 Squid 签名。请参阅 MiscFeatures 中的“可自定义错误消息”。签名默认使用 %T 作为时间戳,但如果您愿意,可以使用 %t 代替,以使用本地时区的时间戳。
🔗 我想将 ACL 参数放在外部文件中。
作者:Adam Aube
Squid 可以从外部文件读取 ACL 参数。为此,首先将 ACL 参数(每行一个)放在一个文件中。然后,在 squid.conf 的 ACL 行中,将文件的完整路径放在双引号中。
例如,而不是
acl trusted_users proxy_auth john jane jim
您将拥有:
acl trusted_users proxy_auth "/usr/local/squid/etc/trusted_users.txt"
在 trusted_users.txt 中,有:
john
jane
jim
🔗 我想根据用户的 MS Windows 组成员身份授权用户
在 workaround.org 上有一个关于如何使用基于 LDAP 的组成员身份检查的出色资源。
此处的 Squid Wiki 中的 LDAP 或 Active Directory 配置示例也可能很有用。
🔗 ACL 名称的最大长度
默认情况下,ACL 名称的最大长度为 32-1 = 31 个字符,但可以通过编辑源代码来更改:在 defines.h 中
#define ACL_NAME_SZ 32
🔗 快速和慢速 ACL
某些 ACL 类型需要 Squid 可能尚未提供的信息。检查它们需要暂停当前请求的工作,查询某个外部源,并在所需信息可用时恢复工作。例如,DNS、身份验证器或外部授权脚本就是这种情况。因此,ACL 可以分为 **快速** ACL(无需访问外部源即可满足)和 **慢速** ACL(需要)。
截至 squid 3.1.0.7,快速 ACL 包括:
- all (内置)
- src
- dstdomain
- dstdom_regex
- myip
- arp
- src_as
- peername
- time
- url_regex
- urlpath_regex
- port
- myport
- myportname
- proto
- method
- http_status {R}
- browser
- referer_regex
- snmp_community
- maxconn
- max_user_ip
- req_mime_type
- req_header
- rep_mime_type {R}
- user_cert
- ca_cert
慢速 ACL 包括:
- dst
- dst_as
- srcdomain
- srcdom_regex
- ident
- ident_regex
- proxy_auth
- proxy_auth_regex
- external
- ext_user
- ext_user_regex
此列表可能不完整或已过时。有关详细信息,请参阅您的 squid.conf.documented 文件。标记有 {R} 的 ACL 类型是*回复* ACL,请参阅专门的 FAQ 章节。
Squid 会缓存 ACL 查找的结果,只要可能。因此,慢速 ACL 不一定总是需要访问外部数据源。
了解 ACL 类型的行为很重要,因为并非所有 ACL 匹配指令都支持所有类型的 ACL。一些检查点*不会*暂停请求:它们会立即允许(或拒绝)。如果必须检查一个慢速 ACL,并且检查结果未缓存,则相应的 ACL 结果将如同其未匹配一样。换句话说,这类 ACL 通常在所有访问检查子句中都不可靠。
以下是 **慢速** 访问子句:
- http_access
- adapted_http_access
- http_reply_access
- url_rewrite_access
- storeurl_access
- location_rewrite_access
- always_direct
- never_direct
- cache
这些是 **快速** 访问子句:
- icp_access
- htcp_access
- htcp_clr_access
- miss_access
- ident_lookup_access
- reply_body_max_size {R}
- authenticate_ip_shortcircuit_access
- log_access
- header_access
- delay_access
- snmp_access
- cache_peer_access
- ssl_bump
- sslproxy_cert_error
- follow_x_forwarded_for
因此,最安全的做法是仅在快速访问子句中使用快速 ACL,而在慢速访问子句中使用任何类型的 ACL。
一个可能的解决方法可以缓解这种特性的影响,即利用缓存,在慢速子句中设置一些“无用”的 ACL 检查,以便后续的快速子句可以拥有一个缓存的结果进行评估。
回到 FAQ 索引
导航: 网站搜索、网站页面、分类、🔼 向上