[PATCH] Mail: added PROXY PROTOCOL support

Maxim Dounin mdounin at mdounin.ru
Mon Jan 18 16:01:28 UTC 2021


On Sat, Jan 16, 2021 at 07:38:49PM +0300, Murad Mamedov wrote:

> First of all, ignore patch in first mail, I don't use mercurial on
> daily basis, and my neomutt screwed the patch. Second mail in thread
> contains just patch and it seems to be correct.
> I wanted to address few other things on the subject. I started my way
> from
> http://mailman.nginx.org/pipermail/nginx-devel/2016-November/009083.html,
> however decisions done there I found incorrect. Author tried to jump
> right into XCLIENT from PROXY PROTOCOL. In proposed implementation proxy
> protocol is handled in the begining of connections. Since XCLIENT gets
> its address from ngx_connection_s, it will get automatically downstream
> provided address of client.
> In the same thread, there was questions on how to deal with
> "real_ip_header" and "set_real_ip_from". As I mentioned in the original
> description to the patch, one may need these in case of HTTP protocol,
> which is very flexible, with tons of applications behind that may demand
> presense of real ip address in different places/headers. For ancient mail
> protocols, it is not the case. They are very strict, very few
> applications that implement it, probably Postfix, Exim and Dovecot be
> the only practical implementations. And they do support proxy protocol
> out of the box. So I could not find real reason to apply "real_ip"
> thing. With proposed implementation, it just worked out of the box, with
> minimum configuration. The only thing which could be added if need is
> the overriding of "destination address" of proxy protocol (i.e. address
> which client reached). For now I didn't see where it could be useful in
> mentioned above mail applications. Client address, yes, we do pass,
> server address ¯\_(ツ)_/¯, who cares.

The main problem the "real_ip thing" is expected to address is 
that whithout set_real_ip_from restricted set of addresses to 
accept IP address from you are open to IP spoofing.

Most recent relevant discussion about "why one should never trust 
X-Forwarded-For addresses and what to do with the fact that many 
don't understand it" can be found in the thread here:


Mail proxying is indeed much simplier than http, yet the question 
is still here: how to ensure that "listen ... proxy_protocol;" is 
only configured to accept client IP addresses from trusted 

Blindly assuming that anyone who used "listen ... proxy_protocol;" 
in the configuration took care and restricted access to the 
listening socket in question on the network level might not be a 
good idea.  Especially given it works differently in both http and 
stream modules.  Rather, I would like to see it equivalent to how 
it is implemented in the stream module with "set_real_ip_from" 

Maxim Dounin

More information about the nginx-devel mailing list