Как проанализировать пользовательский заголовок протокола PROXY v2 для пользовательской маршрутизации в конфигурации HAProxy?

Как можно проанализировать заголовок протокола PROXY версии 2 и использовать проанализированные значения для выбора бэкэнда?

В частности, я устанавливаю соединение с одной учетной записи AWS на другую с использованием конечной точки VPC PrivateLink с поддержкой PROXY v2. Это включает в себя идентификатор конечной точки в соответствии с документами.

Заголовок протокола Proxy также включает в себя идентификатор конечной точки. Эта информация кодируется с использованием пользовательского вектора Type-Length-Value (TLV) следующим образом.

Моя цель - подключить ресурс A в учетной записи 1 к ресурсу B в учетной записи 2. План - это ресурс A -> PrivateLink -> NLB (с включенным PROXY v2) -> HAProxy -> ресурс B.

Мне нужно определить идентификатор конечной точки VPC PrivateLink во внешнем интерфейсе HAProxy, чтобы выбрать правильный внутренний интерфейс. Как это может быть сделано? Я не ясно, как вызвать пользовательский парсер в конфигурации HAProxy, или это вообще возможно? Это? Если так, как это можно сделать?

Причина, по которой я не могу просто использовать исходный IP-адрес: в моей архитектуре частное IP-пространство может перекрываться. В приведенном выше примере будет несколько учетных записей, действующих как учетная запись 1, поэтому я должен выполнить маршрутизацию назначения на основе идентификатора конечной точки, а не исходного IP-адреса, выставленного при использовании PROXY.

Примеры

Нехорошо

Это наш текущий сценарий. В нем нельзя различить два входящих соединения из разных 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

Если нам нужно маршрутизировать соединения для VPC acctB, используя тот же IP, не будет никакого способа различить.

идеальный

Идеальным решением было бы изменить это на что-то вроде следующего (хотя я признаю, что это не сработает; это просто псевдоконфигурация).

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

Любые другие варианты вместо HAProxy для маршрутизации назначения на основе идентификатора конечной точки также приемлемы, но HAProxy выглядел как очевидный кандидат.

1 ответ

Похоже, что AWS использует "2.2.7. Зарезервированные диапазоны типов", как описано в https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt поэтому вам придется анализировать эту часть самостоятельно.

Это может быть возможно в Луа, может быть, я еще не эксперт в Луа;-)

Другие вопросы по тегам