Squid 4中重叠dstdomain ACL条目触发不同行为(警告/错误终止)的技术咨询
问题场景还原
我最近在配置Squid 4的dstdomain ACL时碰到了一个特别费解的问题:同样是域名条目存在重叠,却触发了完全不同的系统行为——一种是仅发警告不影响服务运行,另一种直接报错导致Squid异常终止。
情况1:仅触发警告,服务正常启动
我的Squid主配置/etc/squid/squid.conf里有这样的ACL规则:
acl dst_domains dstdomain "/etc/squid/dst_domains.txt" http_access allow localnet dst_domains
当/etc/squid/dst_domains.txt里的条目是父域名通配规则在前,子域名条目在后的顺序:
.googlecloud.com .updates.googlecloud.com test.updates.googlecloud.com
Squid启动时只会在/var/log/squid/cache.log里输出警告,服务正常运行:
2023/09/08 19:31:21 kid1| WARNING: '.updates.googlecloud.com' is a subdomain of '.googlecloud.com'
2023/09/08 19:31:21 kid1| WARNING: You should remove '.updates.googlecloud.com' from the ACL named 'dst_domains'
2023/09/08 19:31:21 kid1| WARNING: 'test.updates.googlecloud.com' is a subdomain of '.googlecloud.com'
2023/09/08 19:31:21 kid1| WARNING: You should remove 'test.updates.googlecloud.com' from the ACL named 'dst_domains'
情况2:触发错误,服务异常终止
但当我把域名条目改成精确子域名在前,父域名通配规则在后的顺序:
us-docker.pkg.dev .pkg.dev
Squid直接报错并终止运行:
2023/09/08 19:47:47 kid1| ERROR: 'us-docker.pkg.dev' is a subdomain of '.pkg.dev'
2023/09/08 19:47:47 kid1| ERROR: You need to remove 'us-docker.pkg.dev' from the ACL named 'dst_domains'
2023/09/08 19:47:47 kid1| storeDirWriteCleanLogs: Starting...
2023/09/08 19:47:47 kid1| Finished. Wrote 0 entries.
2023/09/08 19:47:47 kid1| Took 0.03 seconds ( 0.00 entries/sec).
2023/09/08 19:47:47 kid1| FATAL: Bungled /etc/squid/squid.conf line 57: acl dst_domains dstdomain "/etc/squid/dst_domains.txt"
2023/09/08 19:47:47 kid1| Squid Cache (Version 4.13): Terminated abnormally.
核心疑问
为什么同样是子域名与父域名重叠,仅仅是条目顺序不同,就会导致警告和错误两种完全不同的结果?
技术原因分析
这个差异其实是Squid 4针对dstdomain ACL的重叠检查逻辑导致的,核心要抓住两个关键点:
- 域名规则的类型差异:带前缀点的域名(比如
.pkg.dev)是通配匹配规则,会匹配该域名下所有的子域名;不带前缀点的域名(比如us-docker.pkg.dev)是精确匹配规则,仅匹配该域名本身。 - 重叠检查的顺序敏感性:
- 当先加载父域名通配规则(
.googlecloud.com),再加载子域名条目时,Squid判定子域名条目是父规则的冗余子集——父规则已经能覆盖子域名的匹配需求,所以仅发出警告提醒清理冗余,不会阻止服务启动。 - 当先加载精确匹配的子域名(
us-docker.pkg.dev),再加载父域名通配规则(.pkg.dev)时,Squid认为这种顺序会导致匹配逻辑歧义:通配规则会不会覆盖之前的精确匹配?用户的真实需求到底是精确匹配还是通配匹配?为了避免用户出现意料之外的访问控制结果,Squid会直接抛出错误并终止服务,强制用户修正配置顺序或删除重叠条目。
- 当先加载父域名通配规则(
验证与解决方案
如果把第二种情况的条目顺序调换,改成先写.pkg.dev再写us-docker.pkg.dev,Squid就只会触发警告而不会终止服务。当然,从配置规范角度,建议直接删除冗余的子域名条目,保持ACL规则的简洁性,从根源上避免这类问题。
备注:内容来源于stack exchange,提问作者John Heyer

