リライトに対する MQTT サポート
リライト機能は MQTT プロトコルをサポートしています。MQTT クライアント要求とサーバー応答のパラメータに基づいてアクションを実行するように、書き換えポリシーを設定できます。
MQTT の書き換えアクション
MQTT の rewrite アクションは、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 アクションタイプを使用してトピックを削除します。
添加重写操作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 書き換えポリシーを設定して、ユーザー名をクライアントの証明書名に置き換えることができます。
例を考えてみましょう。クライアント要求には、ユーザー名が「admin」というMQTT CONNECT
メッセージが含まれています。このユーザー名は、クライアント証明書 (証明書名) から抽出されたシリアル番号 (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 へのサブスクリプションを提供する書き換えポリシーを構成できます。サブスクリプションは前または後に挿入できます。
設定例:
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