David Touzeau:
> Dear
> 
> We are facing an problem that we cannot resolve...
> Our main goal is to implement a load-balancer in front of Postfix (HaProxy).
> We have made a discuss with HaProxy founder in order to implement the 
> XCLIENT protcol but this is difficult for him to implement such protocol.
FYI nginx implements XCLIENT (and more). But it does not matter,
since postscreen has no proxy support.

> In other way it seems that PostScreen is not really compatible with the 
> proxy protocol.

First, there needs to be a configuration parameter that tells
postscreen what kind of proxy command will be prepended to the
client's SMTP stream.

/etc/postfix/main.cf:
    # Is there a better name than "proxy protocol"?
    postscreen_proxy_protocol = whatever

With this, postscreen will drop connections that fail to conform
to the configured protocol.

Regardless of command format details, if the proxy prepends a command
to the client's SMTP stream, then postscreen must use unbuffered
I/O to read that command. If buffering were turned on, the buffering
layer could read past the proxy's <CR><LF> and eat up part of the
client input kind-of like CVE-2011-0411.

A rough estimate of what this requires:
- A new main.cf parameter and documentation.
- A way to turn off buffering on VSTREAMs. Alternative: use low-level
  read system calls and re-invent VSTREAM timeout/etc. error handling.
  Either this may take a dozen or so lines of code.
- A new postscreen code module with generic hook to prepend proxies.
- An event-driven loop that reads the proxy command one character
  at a time until <CR><LF>, length exceeded, EOF, time limit, or
  other error. Another dozen lines.
- A proxy command parser that does all the necessary sanity checks
  (valid address syntax, numerical TCP ports in the range 1..65535),
  no missing or extra fields.  Another dozen lines.
- Reuse the existing postscreen data structures that are now filled
  with endpoint information from getpeername() and getsockname().

        Wietse

Reply via email to