On Mon, Jun 09, 2025 at 11:31:17AM +0300, Marko Karppinen wrote:
> Hi everyone, I'm looking at finally enabling http/3 across our
> infrastructure since haproxy 3.2.0 ticked some boxes for us on that
> front. There's one issue remaining:
> In our setup, we load balance HTTP traffic by ECMP to an anycast IP
> shared by a fleet of haproxy servers. One issue with this is that when
> the set of available servers change, the packets of existing
> connections may end up on servers not prepared to handle them.
> For h1 and h2, we've implemented hitless server retirement on the
> operating system level, by recognizing invalid TCP packets and
> forwarding them over multicast to the other servers in the same edge
> location. The server that actually has a session with the client can
> then pick up the packets and complete the response.
> For h3, there's no way to distinguish valid and invalid packets
> outside haproxy, so we're looking to implement this facility within
> haproxy itself.
> In a nutshell, whenever haproxy receives a quic packet it doesn't
> recognize, it should transparently proxy that packet to a specified
> destination (in our case a GRE over multicast interface). There are
> some subtleties to deal with but that's the high level task.
> Standardization work like QUIC-LB[1] will probably eventually handle
> this with an approach based on QUIC connection IDs, but I imagine
> something like that is ways off both in the standards and in the
> haproxy implementation. So maybe there's room to do a simpler approach
> in the interim?

We already looked at QUIC-LB specification, but it doesn't seem to match
our needs as it mostly targets load-balancer working at layer 4.

> Looking at analogs in the current HAProxy configuration, maybe this
> could be surfaced as a "quic-unknown" keyword in the style of
> "quic-initial", and a new "dgram-forward" action it would support.
> We're happy to put in the work to implement this, but it'd be super
> helpful if someone familiar with the haproxy quic code could lay some
> ground rules on the dos and don'ts around this. Any pointers would be
> greatly appreciated.

Indeed this kind of work should be possible without too much hassle. I'm
ok with a new kind of rule targetting unknown QUIC packets, i.e.
non-Initial packets for which the DCID is not known by the haproxy
instance. At first glance, this should be invoked in
quic_rx_pkt_retrieve_conn(), just prior to Stateless Reset emission.

Do not hesitate if you have further questions,
Regards,

-- 
Amaury Denoyelle


Reply via email to