带有“header(host)”检查的 haproxy acl 不适用于 mqtt 后端

带有“header(host)”检查的 haproxy acl 不适用于 mqtt 后端

我尝试应用 HAProxy acl 来选择 mqtt 代理后端,但不起作用。我尝试了以下 HAProxy 配置。

环境:

HAProxy 版本:1.8.19 MQTT Broker:EMQ X Broker 版本 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

如果您在 haproxy 中使用,mode tcp那么您无法匹配 HTTP 标头等hdr()

此连接是否使用 HTTP?然后使用mode http。如果不是(您实际上在端口 80 上使用 MQTT 协议),则无法匹配主机名,因为该主机名不会通过连接进行通信。您只能通过使用不同的 IP 地址和/或不同的端口号在一个系统上使用不同的 MQTT 代理。

相关内容