[PATCH] Avoiding mixed socket families in PROXY protocol v1 (ticket #2594)
Maxim Dounin
mdounin at mdounin.ru
Tue Jan 23 21:03:06 UTC 2024
Hello!
On Mon, Jan 22, 2024 at 07:48:01PM +0400, Roman Arutyunyan wrote:
> Hi,
>
> On Mon, Jan 22, 2024 at 02:59:21PM +0300, Maxim Dounin wrote:
> > Hello!
> >
> > On Mon, Jan 22, 2024 at 02:49:54PM +0400, Roman Arutyunyan wrote:
> >
> > > # HG changeset patch
> > > # User Roman Arutyunyan <arut at nginx.com>
> > > # Date 1705916128 -14400
> > > # Mon Jan 22 13:35:28 2024 +0400
> > > # Node ID 2f12c929527b2337c15ef99d3a4dc97819b61fbd
> > > # Parent ee40e2b1d0833b46128a357fbc84c6e23be9be07
> > > Avoiding mixed socket families in PROXY protocol v1 (ticket #2594).
Also nitpicking: ticket #2010 might be a better choice.
The #2594 is actually a duplicate (with a side issue noted that
using long unix socket path might result in a PROXY protocol
header without ports and CRLF) and should be closed as such.
> > >
> > > When using realip module, remote and local addreses of a connection can belong
> > > to different address families. This previously resulted in generating PROXY
> > > protocol headers like this:
> > >
> > > PROXY TCP4 127.0.0.1 unix:/tmp/nginx1.sock 55544 0
> > >
> > > The PROXY protocol v1 specification does not allow mixed families. The change
> > > will generate the unknown PROXY protocol header in this case:
> > >
> > > PROXY UNKNOWN
> > >
> > > Also, the above mentioned format for unix socket address is not specified in
> > > PROXY protocol v1 and is a by-product of internal nginx representation of it.
> > > The change eliminates such addresses from PROXY protocol headers as well.
> >
> > Nitpicking: double space in "from PROXY".
>
> Yes, thanks.
>
> > This change will essentially disable use of PROXY protocol in such
> > configurations. While it is probably good enough from formal
> > point of view, and better that what we have now, this might still
> > be a surprise, especially when multiple address families are used
> > on the original proxy server, and the configuration works for some
> > of them, but not for others.
> >
> > Wouldn't it be better to remember if the PROXY protocol was used
> > to set the address, and use $proxy_protocol_server_addr /
> > $proxy_protocol_server_port in this case?
> >
> > Alternatively, we can use some dummy server address instead, so
> > the client address will be still sent.
>
> Another alternative is duplicating client address in this case, see patch.
I don't think it is a good idea. Using some meaningful real
address might easily mislead users. I would rather use a clearly
dummy address instead, such as INADDR_ANY with port 0.
Also, as suggested, using the server address as obtained via PROXY
protocol from the client might be a better solution as long as the
client address was set via PROXY protocol (regardless of whether
address families match or not), and what users expect from the
"proty_protocol on;" when chaining stream proxies in the first
place.
[...]
--
Maxim Dounin
http://mdounin.ru/
More information about the nginx-devel
mailing list