> > > > > > > So far, it seems like the only options would be custom LUA or 
> > > > > > > SPOE.
> > > > > > 
> > > > > > I see two options :-) .
> > > > > > 
> > > > > > Runtime API directly
> > > > > > https://www.haproxy.com/blog/dynamic-configuration-haproxy-runtime-api
> > > > > > or
> > > > > > Dataplane API https://github.com/haproxytech/dataplaneapi
> > > > > 
> > > > > I'm aware of the runtime API, but I don't see how I can add new ACL 
> > > > > lists or
> > > > > remove existing ones and dynamically reference them in `tcp-session` 
> > > > > rules,
> > > > > can you please explain how I could achieve something like this? Maybe 
> > > > > I'm just
> > > > > missing some detail.
> > > > 
> > > > There are examples in the blog post.
> > > > https://www.haproxy.com/blog/dynamic-configuration-haproxy-runtime-api#updating-acls
> > > > 
> > > > and in that one 
> > > > https://www.haproxy.com/blog/introduction-to-haproxy-acls#using-the-runtime-api
> > > > 
> > > > For example.
> > > > 
> > > > ```
> > > > echo "add acl /etc/hapee-1.8/whitelist.acl 1.2.3.4" | socat stdio
> > > > /var/run/hapee-lb.sock
> > > > 
> > > > ```
> > > > The documentation for the commands are in the managment guide
> > > > https://docs.haproxy.org/3.1/management.html#9.3-add%20acl
> > > > https://docs.haproxy.org/3.1/management.html#9.3-add%20map
> > >
> > > Adding new lists or files dynamically is unfortunately not supported. 
> > > It's not
> > > possible to modify a TCP rule over the CLI.
> > 
> > That was my understanding as well. Thank you for confirming it!
> > 
> > If you have other suggestions on how to achieve this besides LUA and SPOE,
> > please let me know.
>
> What is important to understand is that the entirety of the files you
> are going to use at run time must be known during parsing and will be
> loaded. So by definition there's no such notion as determining the name
> of a file and loading it on the fly during traffic processing. And that
> would be terrible for performance (not even speaking about security when
> the file name is determined from traffic).

I see, that makes sense.

> I have no idea how many such different files you need, but if it's a low
> number, say 10, you can very well combine multiple ACLs in your rules.
> For example:
>
>     tcp-request session set-var(sess.allowlist) 
> ssl_fc_sni,map(/usr/local/etc/custom_allowlists)
>     tcp-request session accept if { var(sess.allowlist) -m str 1 } { src -f 
> /path/to/list1.acl }
>     tcp-request session accept if { var(sess.allowlist) -m str 2 } { src -f 
> /path/to/list2.acl }
>     tcp-request session accept if { var(sess.allowlist) -m str 3 } { src -f 
> /path/to/list3.acl }
>     tcp-request session accept if { var(sess.allowlist) -m str 4 } { src -f 
> /path/to/list4.acl }
>
> This remains very cheap as a single ACL will be evaluated (at most),
> the rest being only a single variable. In certain cases, depending on
> your architecture, this can even be deferred to backends, in which
> case only one rule will be evaluated. This can ease the setup when
> dealing with multiple rules, but it depends if your server farm is
> compatible with such an architecture:
>
>   frontend
>     tcp-request session set-var(sess.allowlist) 
> ssl_fc_sni,map(/usr/local/etc/custom_allowlists)
>     use_backend back-%[var(sess.allowlist)]
>
>   back-1
>     tcp-request session accept if { src -f /path/to/list1.acl }
>     server ...
>
>   back-2
>     tcp-request session accept if { src -f /path/to/list2.acl }
>     server ...
>     ...

Unfortunately, we have a shared backend and will probably need more than a few 
lists.

Thank you all for your help!

--
Max


Reply via email to