3

我有一个场景,我需要通过像 HAProxy 或 nginx 这样的代理将 TCP 流量路由到一组动态的后端服务器(确切地说是 Kubernetes pod,但出于本文的目的,我们可以忽略它)。流量需要根据客户端在 TCP 有效负载中提供的密钥(称为routing_key )进行路由。

我看到 nginx 和 HAProxy 都支持一致的哈希。但是,根据我根据 HAProxy 的手册(参见“平衡”部分)可以看出,没有办法基于 TCP 有效负载执行一致的散列。基于负载的负载平衡似乎仅限于 L7 HTTP 参数,如 Header 和 URI 参数。这篇文章概述了一种基于与 TCP 有效负载匹配的字符串进行静态平衡的方法,但我的情况更加动态,因此更倾向于使用真正一致的散列方法。

Nginx 似乎提供了更多的灵活性,您可以将散列值设置为任意变量,如此处所示。这似乎适用于 L7(“后端”节)和 L4(“流”节)。但是,我对你是什么以及不允许对变量做什么有点模糊。有没有人有将变量设置为从 TCP 有效负载中提取的值并将其用于一致散列的示例?

最后的奖励问题:routing_key值实际上是一个 AES-GCM 加密值。代理服务器将有权访问用于解密此值的密钥。是否可以让 nginx 从 TCP 有效负载中获取路由密钥值,使用已知密钥对其进行解密,然后将其用于一致的散列?这会涉及创建一个 nginscript 模块吗?

4

1 回答 1

3

在 HAProxy 2.1 中,您可以将aes_gcm_dec(...)req.payload(...)结合使用来满足此类要求。

我的想法,未经测试。

listen tcp-in
  bind :443 ssl cert 
  tcp-request inspect-delay 10s
  tcp-request session set-var(sess.routingkey) req.payload(0,500)

  # for consistent hashing try this
  hash-type consistent wt6

  use_backend %[var(sess.routingkey),aes_gcm_dec(128,txn.nonce,Zm9vb2Zvb29mb29wZm9vbw==,txn.aead_tag)]

这里也是 html 文档的链接。
aes_gcm_dec
req.payload
hash-type consistent ...hash-type中描述

于 2020-05-18T23:35:47.783 回答