Citrix ADC

Compatibilidad con MQTT para reescritura

La función de reescritura admite el protocolo MQTT. Puede configurar directivas de reescritura para que tomen medidas en función de los parámetros de las solicitudes del cliente MQTT y las respuestas del servidor.

Acción de reescritura para MQTT

La acción de reescritura de MQTT indica los cambios realizados en la solicitud o respuesta de MQTT antes de enviarla a un servidor o cliente.

Expresión:

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

Tipo de reescritura para MQTT

Según el tipo de regla de expresión de reescritura que se utilice, se admiten los siguientes tipos de reescritura de MQTT:

  • replace_mqtt
  • insert_before_mqtt
  • insert_after_mqtt
  • delete_mqtt
  • insert_mqtt

Reescribir el objetivo para MQTT

En los siguientes ejemplos de ejemplo, la función de reescritura de MQTT utiliza expresiones de directiva para indicar la parte de la solicitud que se va a modificar (destino) y la modificación que se va a realizar (expresión de cadena):

  • Reescriba un identificador de cliente en el paquete de conexión mediante el tipo de acción replace_mqtt.

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

  • Reescribir un tema en la solicitud de publicación mediante el tipo de acción replace_mqtt.

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

  • Reescribe para insertar una propiedad con el tipo de acción insert_mqtt.

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

  • Elimina un tema con el tipo de acción delete_mqtt.

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

Acción de reescritura para MQTT

Las siguientes son las acciones de reescritura predefinidas para 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)

Ejemplo de la acción de reescritura predefinida:

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

Ejemplo de la acción de reescritura definida por el usuario:

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

Directiva de reescritura para MQTT

Una directiva de reescritura para MQTT consiste en una regla y una acción. La regla determina el tráfico de MQTT en el que se aplica la reescritura y la acción determina la acción que debe realizar el dispositivo Citrix ADC.

Expresión:

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

Ejemplo:

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

Puntos de enlace para MQTT

Puede vincular una directiva de reescritura de forma global o a un servidor virtual de equilibrio de carga específico o a un servidor virtual de conmutación de contenido. Los siguientes son los puntos de enlace globales:

  • MQTT_REQ_DEFAULT
  • MQTT_REQ_OVERRIDE
  • MQTT_RES_DEFAULT
  • MQTT_RES_OVERRIDE

Expresión:

  • 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

Ejemplo:

  • bind rewrite global pol1 10 -type MQTT_REQ_DEFAULT

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

Configurar una directiva de reescritura para MQTT

Para configurar una directiva de reescritura, siga los pasos y escriba los comandos en el símbolo del sistema:

  1. Habilite la función de reescritura en el dispositivo Citrix ADC.

    enable ns feature REWRITE

  2. Agregue una acción de reescritura.

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

  3. Agregue una directiva de reescritura.

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

  4. Configure un servidor virtual de equilibrio de carga MQTT.

    add lb vserver v1 MQTT 1.1.1.1 1883

  5. Enlazar la directiva de reescritura de forma global o a un servidor virtual de equilibrio de carga específico.

    bind rewrite global pol1 10 -type MQTT_REQ_DEFAULT

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

Caso de uso 1: Reemplace el nombre de usuario en el mensaje MQTT CONNECT por el nombre del certificado

El administrador puede configurar una directiva de reescritura de MQTT para reemplazar el nombre de usuario por el nombre del certificado del cliente.

Vamos a considerar un ejemplo. La solicitud del cliente tiene un mensaje MQTT CONNECT que contiene el nombre de usuario como “admin”. Este nombre de usuario debe reemplazarse por el número de serie (16 dígitos) que se extrae del certificado de cliente (nombre del certificado).

En la siguiente ilustración se muestra el flujo de trabajo:

Caso de uso 1

  1. Se envía una solicitud de Protocolo de control de transporte (TCP) al equilibrador de carga.

  2. En el equilibrador de carga, el nombre de usuario se reemplaza por el nombre del certificado.

  3. La solicitud se reenvía al intermediario de MQTT.

  4. Este nuevo nombre de usuario se usa para la autorización a través de la carga útil de webhook.

Configuración de ejemplo:

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

Caso de uso 2: Proporcionar una suscripción a un nuevo TEMA

El administrador puede proporcionar una suscripción a un TEMA nuevo. Vamos a considerar un ejemplo. La solicitud de un cliente tiene una suscripción al TEMA 1. El administrador puede configurar una directiva de reescritura para proporcionar suscripción a un nuevo TEMA 2. La suscripción se puede insertar antes o después.

Configuración de ejemplo:

  • 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

Compatibilidad con MQTT para reescritura