Как проанализировать пользовательский заголовок протокола 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 поэтому вам придется анализировать эту часть самостоятельно.
Это может быть возможно в Луа, может быть, я еще не эксперт в Луа;-)