Citrix ADC

Prise en charge MQTT pour la réécriture

La fonction de réécriture prend en charge le protocole MQTT. Vous pouvez configurer des stratégies de réécriture pour effectuer des actions en fonction des paramètres des demandes du client MQTT et des réponses du serveur.

Action de réécriture pour MQTT

L’action de réécriture pour MQTT indique les modifications apportées à la demande ou à la réponse MQTT avant de l’envoyer à un serveur ou un client.

Expression :

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

Type de réécriture pour MQTT

Selon le type de règle d’expression de réécriture utilisé, les types de réécriture MQTT suivants sont pris en charge :

  • replace_mqtt
  • insert_before_mqtt
  • insert_after_mqtt
  • delete_mqtt
  • insert_mqtt

Cible de réécriture pour MQTT

Dans les exemples suivants, la fonctionnalité de réécriture MQTT utilise des expressions de stratégie pour indiquer la partie de la demande à modifier (cible) et la modification à effectuer (expression chaîne) :

  • Réécrivez un ID client dans le paquet de connexion à l’aide du type replace_mqtt d’action.

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

  • Réécrivez une rubrique dans la demande de publication à l’aide du type replace_mqtt d’action.

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

  • Réécrivez pour insérer une propriété à l’aide du type d’action insert_mqtt.

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

  • Supprimez une rubrique à l’aide du type d’action delete_mqtt.

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

Action de réécriture pour MQTT

Voici les actions de réécriture prédéfinies pour 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)

Exemple pour l’action de réécriture prédéfinie :

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

Exemple d’action de réécriture définie par l’utilisateur :

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

Politique de réécriture pour MQTT

Une stratégie de réécriture pour MQTT se compose d’une règle et d’une action. La règle détermine le trafic MQTT sur lequel la réécriture est appliquée et l’action détermine l’action à prendre par l’appliance Citrix ADC.

Expression :

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

Exemple :

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

Points de liaison pour MQTT

Vous pouvez lier une stratégie de réécriture globalement ou à un serveur virtuel d’équilibrage de charge ou à un serveur virtuel de commutation de contenu spécifique. Les points de liaison globaux sont les suivants :

  • MQTT_REQ_DEFAULT
  • MQTT_REQ_OVERRIDE
  • MQTT_RES_DEFAULT
  • MQTT_RES_OVERRIDE

Expression :

  • 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

Exemple :

  • bind rewrite global pol1 10 -type MQTT_REQ_DEFAULT

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

Configurer une stratégie de réécriture pour MQTT

Pour configurer une stratégie de réécriture, suivez les étapes et tapez les commandes à l’invite de commandes :

  1. Activez la fonctionnalité de réécriture sur l’appliance Citrix ADC.

    enable ns feature REWRITE

  2. Ajoutez une action de réécriture.

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

  3. Ajoutez une stratégie de réécriture.

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

  4. Configurez un serveur virtuel d’équilibrage de charge MQTT.

    add lb vserver v1 MQTT 1.1.1.1 1883

  5. Liez la stratégie de réécriture globalement ou à un serveur virtuel d’équilibrage de charge spécifique.

    bind rewrite global pol1 10 -type MQTT_REQ_DEFAULT

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

Cas d’utilisation 1 : remplacez le nom d’utilisateur dans le message MQTT CONNECT par le nom du certificat

L’administrateur peut configurer une stratégie de réécriture MQTT pour remplacer le nom d’utilisateur par le nom du certificat du client.

Prenons un exemple. La demande du client contient un MQTT CONNECT message contenant le nom d’utilisateur « admin ». Ce nom d’utilisateur doit être remplacé par le numéro de série (16 chiffres) extrait du certificat client (nom du certificat).

La figure suivante montre le flux de travail :

Cas d'utilisation 1

  1. Une demande TCP (Transport Control Protocol) est envoyée à l’équilibreur de charge.

  2. Dans l’équilibreur de charge, le nom d’utilisateur est remplacé par le nom du certificat.

  3. La demande est transmise au courtier MQTT.

  4. Ce nouveau nom d’utilisateur est utilisé pour l’autorisation via la charge utile du webhook.

Configuration de l’échantillon :

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

Cas d’utilisation 2 : Fournir un abonnement à un nouveau TOPIC

L’administrateur peut fournir un abonnement à un nouveau TOPIC. Prenons un exemple. Une demande client est associée à un abonnement au TOPIC 1. L’administrateur peut configurer une stratégie de réécriture pour fournir un abonnement à un nouveau TOPIC 2. L’abonnement peut être inséré avant ou après.

Configuration de l’échantillon :

  • 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