Citrix ADC

リライトに対する MQTT サポート

リライト機能は MQTT プロトコルをサポートしています。MQTT クライアント要求とサーバー応答のパラメータに基づいてアクションを実行するように、書き換えポリシーを設定できます。

MQTT の書き換えアクション

MQTT の rewrite アクションは、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トラフィックを決定し、アクションはCitrix ADCアプライアンスが実行するアクションを決定します。

表現:

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. Citrix ADCアプライアンスで書き換え機能を有効にします。

    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 書き換えポリシーを設定して、ユーザー名をクライアントの証明書名に置き換えることができます。

例を考えてみましょう。クライアント要求には、ユーザー名が「admin」というMQTT CONNECTメッセージが含まれています。このユーザー名は、クライアント証明書 (証明書名) から抽出されたシリアル番号 (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