如何在 HAProxy 配置中解析自定义路由的自定义 PROXY 协议 v2 标头?



如何解析 PROXY 协议版本 2 标头并使用解析的值选择后端?

具体来说,我正在使用启用了 PROXY v2 的 VPC PrivateLink 终端节点从一个 AWS 账户连接到另一个账户。这包括根据文档的终端节点 ID。

代理协议标头还包括终结点的 ID。此信息使用自定义类型-长度-值 (TLV) 向量进行编码,如下所示。

我的目标是从账户 1 中的资源 A 连接到账户 2 中的资源 B。该计划是资源 A -> PrivateLink -> NLB(启用了 PROXY v2)-> HAProxy ->资源 B。

我需要在 HAProxy 前端中检测 VPC 私有链路终端节点 ID,以选择正确的后端。如何做到这一点?我不清楚如何在 HAProxy 配置中调用自定义解析器,或者这是否可能?是吗?如果是这样,如何做到这一点?

我不能只使用源 IP 的原因:私有 IP 空间在我的架构中可能会重叠。在上面的示例中,将有多个帐户充当账户 1,因此我必须根据终端节点 ID 而不是 PROXY 使用情况公开的源 IP 进行目标路由。

例子

不好

这是我们目前的方案。其中,无法区分来自不同 VPC 的具有相同私有 IP 地址空间的两个入站连接。

frontend salt_4506_acctA_front
bind 10.0.1.32:4506 accept-proxy
mode tcp
default_backend salt_4506_acctA_back
backend salt_4506_acctA_back
balance roundrobin
mode tcp
server salt-master-ecs 192.168.0.88:32768

如果我们需要使用相同的 IP 为 acctB 的 VPC 路由连接,则无法区分。

理想

一个理想的解决方案是将其修改为如下所示的内容(尽管我承认这行不通;它只是伪配置)。

frontend salt_4506_acctA_front
bind *:4506 accept-proxy if endpointID == vpce-xxxxxxx1
mode tcp
default_backend salt_4506_acctA_back
backend salt_4506_acctA_back
balance roundrobin
mode tcp
server salt-master-ecs 192.168.0.88:32768
基于

端点ID的目标路由替代HAProxy的任何其他选项也是可以接受的,但HAProxy似乎是显而易见的候选者。

看起来AWS使用"2.2.7.保留类型范围",如 https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt 中所述,因此您需要自行解析此部分。

这在lua中是可能的,也许我还不是lua的专家;-)

最新更新