Citrix ADC

MQTT重写支持

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

重写MQTT的操作

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

表达式

添加重写动作

重写MQTT的类型

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

  • replace_mqtt
  • insert_before_mqtt
  • insert_after_mqtt
  • delete_mqtt
  • insert_mqtt

重写MQTT的目标

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

  • 方法重写连接数据包中的客户机IDreplace_mqtt动作类型。

    添加重写操作rwact1 replace_mqtt MQTT.CONNECT.CLIENTID "\"xyz\""

  • 方法重写发布请求中的主题replace_mqtt动作类型。

    添加重写操作rwact1 replace_mqtt MQTT.PUBLISH.TOPIC "\"测试/test123\""

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

    添加重写动作rwact1 insert_mqtt。NEW_PROPERTY(“prop1”、“测试”)

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

    添加重写操作rwact2删除操作

重写MQTT的操作

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

  • MQTT.NEW_KEEPALIVE(间隔)
  • MQTT.NEW_PACKET_IDENTIFIER (packetID)
  • MQTT.NEW_REASON_CODE (retCode)
  • MQTT。NEW_PUBLISH (topic_name有效负载)
  • MQTT.NEW_CONNECT_USERNAME(用户名)
  • MQTT。NEW_CONNECT_WILL_MESSAGE(will_topic, will_payload, will_Qos, will_retain)
  • MQTT。NEW_TOPIC(主题、qos)
  • MQTT.NEW_TOPIC(主题)
  • MQTT。NEW_PROPERTY(关键字,值)

预定义的重写操作示例

添加重写动作rwact1 . connect . keepalive

用户自定义的重写操作示例

添加重写操作rwact1 replace_mqtt MQTT.CONNECT.USERNAME "\"user1\"" "

重写MQTT的策略

MQTT的重写策略由规则和操作组成。该规则决定了应用重写的MQTT通信,而动作决定了Citrix ADC设备要采取的动作。

表达式

添加重写策略

例子

添加重写操作insert_mqtt_username

添加重写策略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 [-type MQTT_REQ_OVERRIDE | MQTT_REQ_DEFAULT | MQTT_RES_OVERRIDE | MQTT_RES_DEFAULT]

  • bind lb|cs vserver -policyName -priority -type REQUEST|RESPONSE .使用实例

例子

  • 绑定重写全局pol1 10 -type MQTT_REQ_DEFAULT

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

为MQTT配置重写策略

要配置重写策略,请按照以下步骤在命令提示符处输入命令:

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

    启用ns特性重写

  2. 添加一个重写操作。

    添加重写动作rwact1 replace_mqtt

  3. 添加重写策略。

    添加重写策略pol1 MQTT.COMMAND.EQ(CONNECT) rwact1

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

    add lb vserver v1 MQTT 1.1.1.1 1883

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

    绑定重写全局pol1 10 -type MQTT_REQ_DEFAULT

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

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

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

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

流程如下图所示:

用例1

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

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

  3. 请求被转发到MQTT代理。

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

示例配置

添加重写操作mqtt_rw_unameact1 replace_mqtt MQTT.CONNECT.USERNAME CLIENT.SSL.CLIENT_CERT.SERIALNUMBER

“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的订阅。订阅可以在之前或之后插入。

示例配置

  • 添加重写动作act2 insert_before_mqtt . topic_filters . topicNEW_TOPIC(话题二,2)

  • 添加重写策略policy2“MQTT.COMMAND.EQ(SUBSCRIBE) && MQTT.SUBSCRIBE”。TOPIC_FILTERS.TOPIC.CONTAINS act2(\“测试\”)”

MQTT重写支持