ADC

MQTT 支持重写

重写功能支持 MQTT 协议。您可以配置重写策略以根据 MQTT 客户端请求和服务器响应中的参数执行操作。

重写 MQTT 的操作

MQTT 的重写操作指示在将 MQTT 请求或响应发送到服务器或客户端之前对其所做的更改。

表达式

add rewrite action <name> <rewrite_type> <target> <rewrite_action>

重写 MQTT 的类型

根据所使用的重写表达式规则的类型,支持以下 MQTT 重写类型:

  • replace_mqtt
  • insert_before_mqtt
  • insert_after_mqtt
  • delete_mqtt
  • insert_mqtt

重写 MQTT 的目标

在以下示例示例中,MQTT 重写功能使用策略表达式来指示要修改的请求部分(目标)和要执行的修改(字符串表达式):

  • 使用 replace_mqtt 操作类型重写连接数据包中的客户端 ID。

    add rewrite action rwact1 replace_mqtt MQTT.CONNECT.CLIENTID "\"xyz\""

  • 使用 replace_mqtt 操作类型重写发布请求中的主题。

    add rewrite action rwact1 replace_mqtt MQTT.PUBLISH.TOPIC "\"testing/test123\""

  • 重写以使用 insert_mqtt 操作类型插入属性。

    add rewrite action rwact1 insert_mqtt MQTT.NEW_PROPERTY("prop1", "test")

  • 使用 delete_mqtt 操作类型删除主题。

    add rewrite action rwact2 delete_mqtt MQTT.SUBSCRIBE.TOPIC_FILTERS.TOPIC(1)

重写 MQTT 的操作

以下是 MQTT 的预定义重写操作:

  • MQTT.NEW_KEEPALIVE(interval)
  • MQTT.NEW_PACKET_IDENTIFIER(packetID)
  • MQTT.NEW_REASON_CODE(retCode)
  • MQTT.NEW_PUBLISH(topic_name, payload)
  • MQTT.NEW_CONNECT_USERNAME(username)
  • MQTT.NEW_CONNECT_WILL_MESSAGE(will_topic, will_payload, will_Qos, will_retain)
  • MQTT.NEW_TOPIC(topic, qos)
  • MQTT.NEW_TOPIC(topic)
  • MQTT.NEW_PROPERTY(key, value)

预定义重写操作的示例

add rewrite action rwact1 replace_mqtt MQTT.CONNECT.KEEPALIVE MQTT.NEW_KEEPALIVE(90)

用户定义的重写操作示例

add rewrite action rwact1 replace_mqtt MQTT.CONNECT.USERNAME "\"user1\""

重写 MQTT 的策略

MQTT 的重写策略由规则和操作组成。该规则决定了对哪些 MQTT 流量进行重写,该操作决定了 NetScaler 设备要采取的操作。

表达式

add rewrite policy <name> <rewrite_rule> <rewrite_action>

示例

add rewrite action insert_mqtt_username insert_mqtt MQTT.NEW_CONNECT_USERNAME("user1")

add rewrite policy rewrite_mqtt_username "MQTT.COMMAND.EQ(CONNECT) && MQTT.CONNECT.USERNAME.LENGTH.EQUALS(0) insert_mqtt_username

MQTT 的绑定积分

您可以全局绑定重写策略,也可以绑定到特定的负载平衡虚拟服务器或内容交换虚拟服务器。 以下是全局绑定点:

  • MQTT_REQ_DEFAULT
  • MQTT_REQ_OVERRIDE
  • MQTT_RES_DEFAULT
  • MQTT_RES_OVERRIDE

表达式

  • bind rewrite global <policyName> <priority> [-type MQTT_REQ_OVERRIDE | MQTT_REQ_DEFAULT | MQTT_RES_OVERRIDE | MQTT_RES_DEFAULT]

  • bind lb|cs vserver <virtualServerName> -policyName <policyName> -priority <positiveInteger> -type REQUEST|RESPONSE

示例

  • bind rewrite global pol1 10 -type MQTT_REQ_DEFAULT

  • add/bind lb vserver v1 -policyName pol1 -type reqUEST -priority 10

为 MQTT 配置重写策略

要配置重写策略,请按照以下步骤操作,然后在命令提示符下键入命令:

  1. 在 NetScaler 设备上启用重写功能。

    enable ns feature REWRITE

  2. 添加重写操作。

    add rewrite action rwact1 replace_mqtt MQTT.CONNECT.KEEPALIVE MQTT.NEW_KEEPALIVE(10)

  3. 添加重写策略。

    add rewrite policy pol1 MQTT.COMMAND.EQ(CONNECT) rwact1

  4. 配置 MQTT 负载平衡虚拟服务器。

    add lb vserver v1 MQTT 1.1.1.1 1883

  5. 将重写策略全局绑定或绑定到特定的负载平衡虚拟服务器。

    bind rewrite global pol1 10 -type MQTT_REQ_DEFAULT

    add/bind lb vserver v1 -policyName pol1 -type REQUEST -priority 10

用例 1:将 MQTT CONNECT 消息中的用户名替换为证书名称

管理员可以配置 MQTT 重写策略,将用户名替换为客户端的证书名称。

让我们来看一个例子。客户端请求包含 MQTT CONNECT 消息,其中包含用户名“admin”。必须将此用户名替换为从客户端证书(证书名称)中提取的序列号(16 位)。

下图显示了工作流程:

用例 1

  1. 传输控制协议 (TCP) 请求被发送到负载平衡器。

  2. 在负载平衡器中,用户名将替换为证书名称。

  3. 请求将转发给 MQTT 经纪人。

  4. 此新用户名用于通过 webhook 有效负载进行授权。

示例配置

add rewrite action mqtt_rw_unameact1 replace_mqtt MQTT.CONNECT.USERNAME CLIENT.SSL.CLIENT_CERT.SERIALNUMBER

add rewrite policy mqtt_rw_uname_pol1 "MQTT.COMMAND.EQ(CONNECT)" mqtt_rw_unameact1

bind cs vserver mqtt_frontend_cs -policyName mqtt_rw_uname_pol1 -priority 10 -gotoPriorityExpression END -type REQUEST

用例 2:提供对新 TOPIC 的订阅

管理员可以提供对新 TOPIC 的订阅。让我们来看一个例子。客户端请求订阅了 TOPIC 1。管理员可以配置重写策略以提供对新 TOPIC 2 的订阅。可以在之前或之后插入订阅。

示例配置

  • add rewrite action act2 insert_before_mqtt MQTT.TOPIC_FILTERS.TOPIC(1) MQTT.NEW_TOPIC(topic2, 2)

  • add rewrite policy policy2 “MQTT.COMMAND.EQ(SUBSCRIBE) && MQTT.SUBSCRIBE. TOPIC_FILTERS.TOPIC.CONTAINS(\"test\")" act2

MQTT 支持重写