[squid-dev] RFC: make FOLLOW_X_FORWARDED_FOR unconditional
Alex Rousskov
rousskov at measurement-factory.com
Tue Oct 10 19:19:05 UTC 2023
On 2023-10-10 12:17, Francesco Chemolli wrote:
> what if we removed the configure option for FOLLOW_X_FORWARDED_FOR, and
> made it unconditionally part of Squid?
Some Squid deployments will silently break AFAICT.
> It is on by default,
Here, "it" should be viewed as a combination of FOLLOW_X_FORWARDED_FOR
and the directives that macro enables (by default). Unfortunately, some
of those directives are on by default[1]. This implies that, after we
remove FOLLOW_X_FORWARDED_FOR, a Squid built with
--disable-follow-x-forwarded-for will start doing something it was not
doing before, and the behavior changes should be assumed to be
significant until you can prove otherwise.
> and it is controlled by runtime configuration,
... but not in a good way: Squid code cannot tell whether
follow_x_forwarded_for is "enabled" beyond checking
FOLLOW_X_FORWARDED_FOR. It is possible to change that, but changing that
(and adjusting how other related directives are checked!) requires
non-trivial work. See (B) below.
> removing the compile-time option would ensure we have better testing
> coverage.
Indeed. I support removal of this and similar unnecessary compile-time
options, but because related directives[1] are _on_ by default (in
--enable-follow-x-forwarded-for and equivalent builds), we should not
just enable this feature, screwing up folks that disabled it explicitly
in their builds.
Also, the current implementation of XFF code is fairly expensive -- it
requires slow ACL checks. If we just remove that FOLLOW_X_FORWARDED_FOR
guard, we will be adding quite a few wasted CPU cycles to all Squid
builds that (used to) disable that feature.
[1] squid.conf directives that are enabled by default in
--enable-follow-x-forwarded-for and equivalent builds include:
log_uses_indirect_client, adaptation_uses_indirect_client,
acl_uses_indirect_client, delay_pool_uses_indirect_client.
I see a few possible strategies here:
A) Make ./configure --disable-follow-x-forwarded-for fail. Easy to
implement but kind of goes against ./configure tradition and leaves a
backward compatibility hack in Squid code. It also forces admins that do
_not_ want this feature to disable 4+ directives they do not care about
-- bad UX. I am against this option.
B) Make all *_uses_indirect_client and similar directives default to off
unless the configuration contains an explicit follow_x_forwarded_for
rule. Warn if one of those directives is explicitly on when there are no
explicit follow_x_forwarded_for rules. This requires non-trivial work.
That work will probably fix a few existing bugs. I support this option.
HTH,
Alex.
> AccessLogEntry.cc:#if FOLLOW_X_FORWARDED_FOR
> AccessLogEntry.cc- if (Config.onoff.log_uses_indirect_client && request)
> AccessLogEntry.cc- log_ip = request->indirect_client_addr;
> AccessLogEntry.cc- else
> AccessLogEntry.cc-#endif
> AccessLogEntry.cc- if (tcpClient)
> AccessLogEntry.cc- log_ip = tcpClient->remote;
> AccessLogEntry.cc- else
> AccessLogEntry.cc- log_ip = cache.caddr;
More information about the squid-dev
mailing list