Re: HAProxy proxy protocol support

Howard Chu <[email protected]> Thu, 19 Nov 2020 16:04:14 +0000
Newsgroups gmane.network.openldap.devel
Message-ID <[email protected]>
Paul B. Henson wrote:
> We currently run our openLDAP service on our campus behind an F5 load balancer which preserves the IP address of the connecting client through to the backend
> servers, which we rely on for a small amount of IP address based authorization differentiating between on-campus and off-campus access.
> 
> However, management is strongly pushing us to migrate the service to the Amazon cloud, using Amazon's load balancer. Unfortunately, Amazon's load balancer only
> supports client NAT for directing connections to the back end servers, so they have no idea who the actual client is, it just appears to be the load balancer
> itself.
> 
> Amazon's solution for that is to support HAProxy's proxy protocol in their load balancer:
> 
>     https://www.haproxy.com/blog/haproxy/proxy-protocol/
> 
> Basically, this is an in band signaling mechanism that inserts an additional header in the initial connection data containing the original client IP
> address/source port and destination IP address/source port, allowing the server to utilize that information for the connection rather than the actual details of
> the network connection from the proxy itself.
> 
> This requires support from the application running on the server, as it must remove and process that proxy header from the connection data before moving on with
> whatever data would normally be passed on the connection.
> 
> There are some fair number of services that support this proxy, including of course HAProxy itself, such as the apache web server and the postfix mail server.
> 
> openLDAP does not support the protocol, and I was unable to find any past discussion of it.
> 
> I was wondering if this feature would be something acceptable for inclusion to openLDAP, or if from an architectural perspective it would be considered
> undesirable.
> 
> In general, I believe applications listening on a specific port are either expecting the proxy protocol header, or not, I do not think it is dynamically
> determined. As such, from an implementation perspective, my initial thought is that it would be implemented in terms of configuration as an additional URL
> specified via the -h option, something like "ldapp://" or "ldap_p://", "ldapsp://" or "ldaps_p://" or whatever seems most desirable. A server might listen on
> the standard ports accepting only proxied connections, or it might listen for normal connections on the standard ports and for proxy connections on alternative
> ports.

Yeah, that agrees with my read of the document. I think "ldapp://" and "ldapsp://"
would be usable.

> When a connection is accepted on a port marked as requiring the proxy protocol, it would read and process the proxy header to populate the appropriate data
> structures regarding connection, and then move on as it normally would to deal with the connection.
> 
> If this feature is of interest, I will probably spend a little time poking at it and seeing how much trouble it will be to implement.

Doesn't seem too problematic. I would only support the version 2 (binary) header,
seems silly to implement the version 1 support for such an old spec.

-- 
  -- Howard Chu
  CTO, Symas Corp.           http://www.symas.com
  Director, Highland Sun     http://highlandsun.com/hyc/
  Chief Architect, OpenLDAP  http://www.openldap.org/project/