[squid-users] Policy with multiple ACL calls
Amos Jeffries
squid3 at treenet.co.nz
Thu Mar 19 22:30:33 UTC 2026
On 20/03/2026 02:20, Andrey K wrote:
> Hello,
>
> I'd be curious to know, is the dstdomain ACL evaluated once per
> transaction or every time it occurs in the policy?
>
> For example, in the following simplified policy, will the Squid go
> through the long list of bank-sites once or six times?
>
> acl bank-sites dstdomain bank-sites.txt
> acl user1 proxy_auth user1
> acl user2 proxy_auth user2
> acl user3 proxy_auth user3
>
> http_access allow user1 bank-sites
> http_access allow user2 bank-sites
> http_access deny user3 bank-sites
>
> ssl_bump splice user1 bank-sites
> ssl_bump bump user2 bank-sites
> ssl_bump terminate user3 bank-sites
>
> I believe that the ACL is calculated only once and the result is reused.
No. The access control lines are tested top-down, left-to-right. Each
ACL is tested when it is encountered.
Some types (eg. that do helper lookup) have an internal cache of results
they can use to avoid repeated expensive tests. But all the "fast" type
ACLs like dstdomain are checked in full each time they are tested, since
a cache lookup is slower than re-doing the test.
>
> How do you think, would it be more efficient to use annotations, like in
> the following example?
>
> acl bank-sites dstdomain bank-sites.txt
> acl user1 proxy_auth user1
> acl user2 proxy_auth user2
> acl user3 proxy_auth user3
>
> acl annotate_banks annotate_client categories+=bank
> acl is_bank note categories bank
>
> # evaluate bank-sites just once and annotate a connection
> http_access deny bank-sites annotate_banks !all
>
> http_access allow user1 is_bank
> http_access allow user2 is_bank
> http_access deny user3 is_bank
>
> ssl_bump splice user1 is_bank
> ssl_bump bump user2 is_bank
> ssl_bump terminate user3 is_bank
>
* dstdomain is a string comparison between HTTP URL domain name, and the
configured ACL value.
* is_bank is a string comparison between the transaction annotation and
the configured ACL value.
- dstdomain MAY require a DNS lookup if the URL contains a raw-IP
address. There is a DNS cache speeding up most of the lookups, but they
still happen. You can use "-n" flag on the ACL to just compare the
raw-IP as string against the "dstdomain" list.
- is_bank requires the categories search and annotation marking to
occur before it will match. That occurs every time "bank-sites" ACL is
checked.
For efficiency, the best practice is:
A) place first the ACLs that will prune down future work fastest. That
goes for both the top-down and the left-to-right orders separately.
B) prefer doing "fast" group ACL tests before "slow" group ACL tests.
Unless this will break (A) and increase the total work by Squid.
C) make use of your knowledge of group/set elimination to reduce
repeatedly using ACL tests. Not having to test at all is faster than
even the "fast" ACL type checks.
Applying the above practices I would, ...
* ensure that there is a clean login in http_access before any of the
userN Acl tests:
> auth_param ...
> acl login proxy_auth REQUIRED
>
> ... allow things that do not require login
> http_access deny !login
> ... other things that do require login
* do the "is_bank" test before authentication username checks:
> http_access allow is_bank user1
> http_access allow is_bank user2
> http_access deny is_bank user3
>
> ssl_bump splice is_bank user1
> ssl_bump bump is_bank user2
> ssl_bump terminate is_bank user3
* use "all ACL" hack to prevent re-authentication of users:
> http_access allow is_bank user1 all
> http_access allow is_bank user2 all
> http_access deny is_bank user3 all
>
> ssl_bump splice is_bank user1 all
> ssl_bump bump is_bank user2 all
> ssl_bump terminate is_bank user3 all
* combine user1 and user2 to reduce http_access total checks
> acl bank-users any-of user1 user2
> http_access allow is_bank bank-users all
> http_access deny is_bank user3 all
>
> ssl_bump splice is_bank user1 all
> ssl_bump bump is_bank user2 all
> ssl_bump terminate is_bank user3 all
Also, I would highly recommend adding an ssl_bump rule to explicitly
indicate what is to happen to HTTP traffic that is not going to those
three userN. For example:
> ssl_bump splice all
Cheers
Amos
More information about the squid-users
mailing list