MQTT 支持重写
重写功能支持 MQTT 协议。您可以配置重写策略以根据 MQTT 客户端请求和服务器响应中的参数执行操作。
重写 MQTT 的操作
MQTT 的重写操作指示在将 MQTT 请求或响应发送到服务器或客户端之前对其所做的更改。
表达式:
add 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 流量,该操作确定 Citrix ADC 设备要执行的操作。
表达式:
add rewrite policy
示例:
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
[-type MQTT_REQ_OVERRIDE | MQTT_REQ_DEFAULT | MQTT_RES_OVERRIDE | MQTT_RES_DEFAULT] bind lb|cs vserver
-policyName -priority -type REQUEST|RESPONSE
示例:
bind rewrite global pol1 10 -type MQTT_REQ_DEFAULT
add/bind lb vserver v1 -policyName pol1 -type reqUEST -priority 10
为 MQTT 配置重写策略
要配置重写策略,请按照以下步骤操作,然后在命令提示符下键入命令:
在 Citrix ADC 设备上启用重写功能。
enable ns feature REWRITE
添加重写操作。
add rewrite action rwact1 replace_mqtt MQTT.CONNECT.KEEPALIVE MQTT.NEW_KEEPALIVE(10)
添加重写策略。
add rewrite policy pol1 MQTT.COMMAND.EQ(CONNECT) rwact1
配置 MQTT 负载平衡虚拟服务器。
add lb vserver v1 MQTT 1.1.1.1 1883
将重写策略全局绑定或绑定到特定的负载平衡虚拟服务器。
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 位)。
下图显示了工作流程:
传输控制协议 (TCP) 请求被发送到负载均衡器。
在负载均衡器中,用户名将替换为证书名称。
请求将转发给 MQTT 经纪人。
此新用户名用于通过 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 的订阅。可以在之前或之后插入订阅。
配置示例:
添加重写操作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