[squid-users] Get IP of denied request
Alex Rousskov
rousskov at measurement-factory.com
Wed Nov 1 20:39:20 UTC 2023
On 2023-10-30 13:08, magri at web.de wrote:
> Am 27.10.23 um 16:22 schrieb Alex Rousskov:
>> 1. Enhance Squid to resolve transaction destination address once (on
>> first use/need). Remember/reuse resolved IP addresses. Log them via some
>> new %resolved_dst and %dst_resolution_detail codes.
>>
>> This improvement will help address a few use cases unrelated to this
>> discussion, but it will _not_ tell you which of the resolved addresses
>> actually matched which ACL. You will be able to guess in many cases, but
>> there will be exceptions.
>>
>>
>> 2. Add a Squid feature where an evaluated ACL can be configured to
>> annotate the transaction with the information about that evaluation.
>>
>> To start with, we can support annotations for _matched_ dst ACLs. For
>> example:
>>
>> # When matches, sets the following master transaction annotations:
>> # * badDestination_input: used destination address (IP or name)
>> # * badDestination_match: the matched destination IP
>> # * badDestination_value: the matched ACL parameter value
>> # * badDestination_ips: resolved destination IP(s)
>> # * badDestination_errors: DNS resolution and other error(s)
>> # * badDestination_matches: number of matches (this transaction)
>> # * badDestination_evals: number of evaluations (this transaction)
>> acl badDestination dst --on-match=annotate 127.0.0.0/24 10.0.0.1
>>
>> If the same ACL matches more than once, the last(?) match wins, but the
>> aclfoo_matches annotation can be used to detect these cases. The
>> aclfoo_evals annotation can be used to detect whether this ACL was
>> "reached" at all.
>>
>> If really needed, we can support turning individual annotations on and
>> off, but I doubt that complexity is worth associated performance
>> savings. After all, most ACLs will only match once per transaction
>> lifetime (for correctly written configurations). Access.log will be
>> configured to only log annotations of interest to the admin, of course.
>>
>>
>> The above approach can be extended to provide ACL debugging aid:
>>
>> # Dumps every mismatch information to cache.log at level 1
>> acl goodDestination dst --on-mismatch=log 127.0.0.0/24
>>
>> # Dumps every evaluation information to cache.log at level 1
>> acl redDestination dst --on-eval=log 127.0.0.0/24
>>
>>
>> 3. Add a Squid feature where Squid (optionally) maintains an internal
>> database of recent ACL evaluation history and makes that information
>> accessible via cache manager queries like "which ACLs matched
>> transaction X?" (where X is logged %master_xaction ID).
>>
>>
>> The three sketched options are not mutually exclusive, of course. All
>> require non-trivial code changes.
> Let me first ask some questions for clarification:
> - Does squid cache all ips from dns responses with multiple ips or only
> the one it uses for the request?
All.
> - If it caches more than one ip - does squid use more than one of these
> ips (e.g. as fallback or round robin) inside a single transaction or for
> multiple transactions?
A single transaction will go through several single-name IPs after
certain transaction failures, but not all failures are treated the same.
Multiple transactions may use multiple single-name IPs due to
round-robin rotation of cached IPs and other factors.
> Supposing squid uses only a single dst ip inside a single transaction,
> your first option would be sufficient for our purpose!
In my first option, logged %resolved_dst (and the corresponding master
transaction metadata) may contain multiple IPs (i.e. all resolved ones).
AFAICT, if any one of those IPs match a "dst" ACL address, then that
"dst" ACL should match, even if the transaction does not actually use
the matched address: The "dst" ACL matches based on request-target info,
not the _use_ of that info.
One of the difficulties here is to decide whether a transaction should
wait for both IPv4 and IPv6 addresses to be resolved:
If a transaction proceeds with one family of addresses, then there will
be no delays associated with waiting for the second one. However, in
that case, Squid may declare a "dst" ACL mismatch even though there
would have been a match if we waited for the second DNS answer! It feels
like for correctness sake, we must wait if a "dst" ACL needs checking or
a similar decision has to be made...
> Resolving the ip only once and storing it inside the transaction would
> also avoid ambiguous cases where different ips could theoretically be
> used in different acls or worse in acls and the real connection.
Yes, that is one of the positive side effects of that option.
> It could also improve the performance of acl evaluation because after
> the resolution of the dst ip all following dst acls would be evaluated
> fast(?).
A speedup is possible in some corner cases, but, in most cases, there
will be no difference in this area because "all following dst ACLs"
should "immediately" use _cached_ IP(s) in the current code AFAICT.
> Your second option sounds really nice for debugging purposes but IMHO
> these annotations should be optional because even if the performance
> penalty may(?) be neglectable they increase the size of the transaction
> object and this could accumulate if many acls are in use.
> Hence I would propose this as optional extension to the first option.
Yes, the second feature is optional (and orthogonal): If one does not
add "--on-match=annotate" to a "dst" ACL declaration, then they do not
get those annotations (and their overheads).
> Your third option seems not feasible for us, because the delay between a
> failed request and reporting of the failure often takes more than a day.
> The needed history would be quite excessive (with over 80 million
> requests a day).
Agreed.
Alex.
>>>>> Is there any way to get the ip logged that was used in the dst-acl
>>>>> aside
>>>>> from debug logging? Maybe through some annotation mechanism?
>>>>>
>>>>> Squid version is 6.2, as 6.4 crashes with assertion errors here, too.
>>>>>
>>>>> thanks,
>>>>> Martin
>>
>> _______________________________________________
>> squid-users mailing list
>> squid-users at lists.squid-cache.org
>> https://lists.squid-cache.org/listinfo/squid-users
> _______________________________________________
> squid-users mailing list
> squid-users at lists.squid-cache.org
> https://lists.squid-cache.org/listinfo/squid-users
More information about the squid-users
mailing list