haproxy acl с проверкой "header(host)" не работает для бэкэнда mqtt

Я пытаюсь применить HAProxy acl, чтобы выбрать, что сервер mqtt брокер не работает. Я пробовал следующие конфигурации HAProxy.

Среда:

Версия HAProxy: 1.8.19 MQTT Брокер: EMQ X Брокер версия 3.0

Пример конфигурации 1

listen mqtt
    bind *:80
    mode tcp
    maxconn 50000

    acl mqtt-request hdr_beg(host) -i mqtt.mydoamin.com
    use_backend backend_mqtt if mqtt-request

  backend backend_mqtt
    mode tcp
    server smg1 192.168.0.100:1883 check 

Пример конфигурации 2

listen mqtt
    bind *:80
    mode tcp
    maxconn 50000

    acl mqtt_request req.payload(4,15) -m sub mqtt.mydoamin.com
    tcp-request content accept if mqtt_request
    use_backend backend_mqtt  if mqtt_request

  backend backend_mqtt
    mode tcp
    server smg1 192.168.0.100:1883 check

Пример конфигурации 3

listen mqtt
    bind *:80
    mode tcp
    maxconn 50000

    acl host_mqtt hdr(host) -i mqtt.mydoamin.com
    use_backend backend_mqtt if host_mqtt

  backend backend_mqtt
    mode tcp
    server smg1 192.168.0.100:1883 check  

Пример конфигурации 4

listen mqtt
    bind *:80
    mode tcp
    maxconn 50000

    use_backend backend_mqtt if { hdr_end(host) -i mqtt.mydoamin.com }

  backend backend_mqtt
    mode tcp
    server smg1 192.168.0.100:1883 check

Ни одна из вышеперечисленных конфигураций не работает в соответствии с хостом (mqtt.mydoamin.com).

1 ответ

Решение

Если вы используете mode tcp в haproxy, вы не можете сопоставить заголовки HTTP с hdr() и т.п.

Говорит ли HTTP по этому соединению? Тогда используйте mode http, Если нет (вы на самом деле используете протокол MQTT на порту 80), то вы не можете сопоставить имя хоста, так как оно не передается по соединению. Вы можете использовать разных брокеров MQTT только в одной системе, используя разные IP-адреса и / или разные номера портов.

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