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-адреса и / или разные номера портов.