NATS プロトコルゲートウェイ
EMQX 5.10.0 以降、EMQX は NATS プロトコル に基づく NATS プロトコルゲートウェイを導入しました。これにより、EMQX は NATS クライアントからの接続を受け入れ、MQTT とのメッセージ相互運用を実現できます。本ドキュメントでは、その機能概要と NATS ゲートウェイの有効化および設定方法について説明します。
機能概要
NATS プロトコルゲートウェイは現在、以下の主要な機能をサポートしています。
プロトコルサポート
- NATS プロトコルのメッセージタイプを完全サポート:
- 接続およびセッション管理:
INFO、CONNECT - メッセージのパブリッシュ/サブスクライブ:
PUB、HPUB、SUB、UNSUB - メッセージ配信および応答:
MSG、HMSG - ハートビートおよびステータス:
PING、PONG、+OK、-ERR
- 接続およびセッション管理:
- Verbose モード対応:クライアントが
CONNECT verbose=trueで接続した場合に応答確認を有効化。 - 豊富な認証方式をサポート:Token、NKey、JWT、ユーザー名/パスワード認証に対応。
MQTT との相互運用性
- MQTT との双方向メッセージ相互運用:
- NATS クライアントからパブリッシュされたメッセージは MQTT パブリッシュに変換されます。
- MQTT メッセージは対応するトピックをサブスクライブしている NATS クライアントへ転送されます。
- NATS のワイルドカードサブスクリプションをサポートし、自動的に MQTT 互換のトピック形式に変換。
- Queue Group の共有サブスクリプションをサポート:NATS の Queue Group サブスクリプションは MQTT の共有サブスクリプション形式に変換されます。
- Request/Reply モードをサポート:
- NATS クライアントからのリクエストは MQTT リクエストに変換されます。
- 対象トピックに MQTT サブスクライバーが存在しない場合、EMQX は迅速にエラー応答を返します。
ネットワークおよび接続性
- 複数のトランスポートプロトコルをサポート:TCP、TLS、WebSocket(WS)、および TLS 上の WebSocket(WSS)。
NATS と MQTT 間のクロスプロトコルメッセージング
NATS プロトコルはパブリッシュ/サブスクライブメッセージングモデルと完全に互換性があり、NATS ゲートウェイを介して MQTT メッセージングと相互運用します。変換ルールは以下の通りです。
- PUB および HPUB メッセージはパブリッシュ操作として扱われます:
- トピックは PUB メッセージの
subjectフィールドから派生します。例:t.aは MQTT トピックt/aに変換されます。 - メッセージペイロードは PUB メッセージ本文から直接取得します。
- クライアントが
CONNECT verbose=1で接続した場合、変換後の MQTT メッセージは QoS 1 を使用し、それ以外は QoS 0 となります。
- トピックは PUB メッセージの
- SUB メッセージはサブスクリプション要求として扱われます:
- トピックは SUB メッセージの
subjectフィールドから派生します。例:t.aは MQTT トピックt/aに変換されます。 - QoS は同様のルールで、
verbose=1なら QoS 1、それ以外は QoS 0。 - ワイルドカードをサポートします。例:
*.b.>は+/b/#に変換されます。 - Queue Group をサポートし、SUB メッセージの Queue Group 値は MQTT 共有サブスクリプションのグループ名に変換されます。
- トピックは SUB メッセージの
- UNSUB メッセージはサブスクリプション解除要求として扱われ、サブスクリプション ID(sid)で解除対象を特定します。
TIP
NATS ゲートウェイはパブリッシュ/サブスクライブ操作に対する独自のアクセス制御を実装していません。トピック権限は統一された認可設定で管理してください。
NATS ゲートウェイの有効化
EMQX 5.10.0 以降、NATS ゲートウェイは以下の3つの方法で有効化できます。
- ダッシュボードから
- REST API を使用して
base.hocon設定ファイルを編集して
TIP
クラスター モードでは、ダッシュボードまたは REST API で行った設定はすべてのノードに自動的に適用されます。特定のノードのみに設定を反映したい場合は、そのノードの base.hocon 設定ファイルを使用してください。
ダッシュボードから有効化
EMQX ダッシュボードから NATS ゲートウェイを素早く有効化する手順:
- 左メニューの 管理 -> ゲートウェイ に移動します。
- ゲートウェイ ページで NATS を探し、操作 列の セットアップ ボタンをクリックして NATS 初期化 ウィザードを起動します。
- ウィザードの手順に従います:
- 基本設定 ステップではデフォルト値を受け入れ、次へ をクリック。
- リスナー ステップではリスナーを設定するかスキップして 次へ をクリック。 (リスナーの詳細設定は リスナーの追加 を参照してください。)
- 有効化 をクリックして NATS ゲートウェイを起動します。
有効化が完了すると、ゲートウェイ ページにリダイレクトされ、NATS ゲートウェイのステータスが 有効 と表示されます。
REST API で有効化
以下の例は REST API を使って NATS ゲートウェイを有効化する方法です。
curl -X 'PUT' 'http://127.0.0.1:18083/api/v5/gateway/nats' \
-u <your-application-key>:<your-security-key> \
-H 'Content-Type: application/json' \
-d '{
"name": "nats",
"enable": true,
"mountpoint": "nats/",
"listeners": [
{
"type": "tcp",
"name": "default",
"bind": "4222",
"max_conn_rate": 1000,
"max_connections": 1024000
}
]
}'設定ファイルで有効化
base.hocon を編集して NATS ゲートウェイを有効化する例:
gateway.nats {
mountpoint = "nats/"
listeners.tcp.default {
bind = 4222
acceptors = 16
max_connections = 1024000
max_conn_rate = 1000
}
}NATS ゲートウェイは TCP、SSL、WS、WSS タイプのリスナーをサポートします。設定可能なパラメータの完全な一覧は、EMQX Enterprise 設定マニュアル のゲートウェイ設定 - リスナーセクションを参照してください。
NATS ゲートウェイのカスタマイズ
デフォルト設定に加え、EMQX はさまざまな設定オプションを提供し、特定のビジネス要件に合わせて調整可能です。本セクションでは、ゲートウェイ ページで利用可能なオプションを詳細に解説します。
基本設定
ゲートウェイ ページで NATS を探し、操作 列の 設定 ボタンをクリックします。
設定 タブで、ゲートウェイの接続パラメータ、マウントポイントプレフィックス、クライアント識別情報の上書きを設定できます。
サーバー名:ゲートウェイの内部参照用の一意識別子。デフォルトは
emq_nats_gateway。マウントポイント:ゲートウェイを通過するすべてのトピックに自動的に付加される文字列プレフィックス。プロトコル間のトピック分離に役立ちます。例:
nats/を指定すると、クライアントが手動でプレフィックスを付けなくてもクロスプロトコルルーティングが可能です。デフォルトハートビート間隔:サーバーがクライアントの生存確認のために
PINGパケットを送信する間隔(秒)。デフォルトは60秒。ハートビートタイムアウト閾値:クライアントが応答しない場合に切断とみなす時間。
最大ペイロードサイズ:単一の
PUBまたはHPUBメッセージペイロードの最大サイズ(バイト)。デフォルトは1048576バイト。アイドルタイムアウト:非アクティブなクライアント接続を切断するまでの秒数。デフォルトは
30秒。統計情報の有効化:このゲートウェイの統計収集とレポートを有効にするかどうか。デフォルトは有効。
クライアント情報の上書き:
CONNECTパケットから認証情報を抽出する方法を定義。TIP
認証が有効な場合は、正しい
usernameとpasswordフィールドのマッピングを設定し、資格情報が正しく処理されるようにしてください。- ユーザー名:
CONNECTパケットのuserフィールドにマッピング。 - パスワード:
CONNECTパケットのpassフィールドにマッピング。 - クライアント ID:
${generated}を指定すると自動生成され、特定のロジックでカスタマイズも可能。
- ユーザー名:
更新 をクリックして変更を適用します。
リスナーの追加
リスナー タブでリスナーの編集、削除、新規追加が可能です。
リスナー タブで + リスナー追加 をクリックします。
リスナー追加 ダイアログで以下のオプションを設定します。
基本設定
- 名前:リスナーを識別する一意の名前。
- タイプ:リスナーの種類を選択。NATS でサポートされるのは
tcp、ssl、ws、wss。 - バインド:リスナーが接続を受け付けるポート番号。
リスナー設定
- 最大接続数:同時接続の最大数。デフォルトは
1024000。 - 最大接続レート(リスナー単位):1秒あたりに受け入れる新規接続の最大数。デフォルトは
1000。 - プロキシプロトコル:Proxy Protocol v1/v2 の有効化。デフォルトは
false。 - プロキシプロトコルタイムアウト:Proxy Protocol ヘッダー受信のタイムアウト。指定時間内にヘッダーが受信されない場合、接続は切断されます。デフォルトは
3秒。
ピア検証設定(SSL および WSS リスナーのみ適用)
相互 TLS はデフォルトで有効です。TLS 証明書、秘密鍵、CA 証明書を設定する必要があります。これらはアップロードまたは直接フォームに貼り付け可能です。詳細は SSL/TLS 接続の有効化 を参照してください。
- TLS 証明書:TLS 証明書のファイルパスまたは内容。
- TLS 秘密鍵:TLS 秘密鍵のファイルパスまたは内容。
- CA 証明書:CA 証明書のファイルパスまたは内容。
- ピア証明書の強制検証:クライアント証明書検証の必須化。デフォルトは
true。
追加 をクリックしてリスナーを作成します。
認証の設定
NATS ゲートウェイは以下の2種類の認証方式をサポートします。
- ゲートウェイ認証(
authentication):EMQX ゲートウェイ認証機構で、通常はユーザー名/パスワード形式のバックエンドに使用。 - 内部ゲートウェイ認証(
internal_authn):NATS ネイティブのユーザー名/パスワード以外の認証方式。
両方が有効な場合、EMQX は以下の順序で認証を評価します。
internal_authnのメソッドを上から順に評価。- 必要な資格情報が不足している場合は次のメソッドを試行。
- 資格情報が存在しているが検証に失敗した場合は即座に接続拒否。
- すべての内部メソッドがスキップされ、
authenticationが設定されていればゲートウェイ認証にフォールバック。 - 内部メソッドもゲートウェイ認証も設定されていなければ、すべての NATS クライアントの接続を許可。
ゲートウェイ認証の設定
他のゲートウェイ同様、NATS ゲートウェイは標準の EMQX 認証機構と統合可能です。以下の認証バックエンドをサポートします。
ゲートウェイ認証では、NATS の CONNECT パケットから以下のフィールドを抽出します。
- クライアント ID:デフォルトで自動生成。
- ユーザー名:
userフィールドの値。 - パスワード:
passフィールドの値。
MQTT プロトコルとは異なり、ゲートウェイ認証は単一の認証機構のみをサポートし、複数の認証機構のリスト(チェーン)はサポートしません。
ダッシュボードでの設定例
以下は HTTP サーバーを使ったパスワード認証の設定例です。
- NATS ゲートウェイ設定の 認証 タブに移動。
- + 認証作成 をクリックし、メカニズムに パスワードベース、データソースに HTTP サーバー を選択して 次へ。
- 設定パラメータを入力します。詳細は HTTP パスワード認証 を参照してください。
- 作成 をクリックし、設定を確認後 更新 をクリックして確定。
REST API での設定例
以下は組み込みデータベース認証を REST API で設定する例です。
curl -X 'POST' \
'http://127.0.0.1:18083/api/v5/gateway/nats/authentication' \
-u <your-application-key>:<your-security-key> \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"backend": "built_in_database",
"mechanism": "password_based",
"password_hash_algorithm": {
"name": "sha256",
"salt_position": "suffix"
},
"user_id_type": "username"
}'設定ファイルでの設定例
以下は組み込みデータベース認証を設定ファイルで設定する例です。
gateway.nats {
authentication {
backend = built_in_database
mechanism = password_based
password_hash_algorithm {
name = sha256
salt_position = suffix
}
user_id_type = username
}
}その他の認証タイプについては、EMQX 認証機構 のドキュメントを参照してください。
内部認証(internal_authn)の設定
これは NATS ゲートウェイ固有の認証機能で、NATS サーバー標準の3つの認証方式をサポートします。
トークン認証
- NATS の
CONNECTパケットのauth_tokenフィールドを使用。 - プレーンなトークンおよび bcrypt ハッシュ(
$2a$、$2b$、$2y$)をサポート。 - NATS リファレンス:Token authentication
ダッシュボード設定例:

設定ファイル例:
gateway.nats {
internal_authn = [
{
type = token
token = "nats_token"
}
]
}NKey 認証
- NATS の
CONNECTパケットのnkey+sigチャレンジ/レスポンスを使用。 nkeysは有効な NATS ユーザーパブリックキー(U...)である必要があります。- NATS リファレンス:NKey authentication
ダッシュボード設定例:

設定ファイル例:
gateway.nats {
internal_authn = [
{
type = nkey
nkeys = [
"Uxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
]
}
]
}JWT 認証(ACL サポート付き)
- NATS の
CONNECTパケットのjwt+sig(およびオプションのnkey)を使用。 - 信頼されたオペレーターリストと JWT プリロードリストの両方が必要。
- リゾルバータイプは現在
memoryのみサポート。これは有効なアカウント JWT を設定で事前ロードすることを意味します。 - NATS リファレンス:JWT authentication
ダッシュボード設定例:

設定ファイル例:
gateway.nats {
internal_authn = [
{
type = jwt
trusted_operators = [
"Oxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
]
resolver {
type = memory
resolver_preload = [
{
pubkey = "Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
jwt = "<your-account-jwt>"
}
]
}
}
]
}JWT ユーザークレームは ACL ルールも保持可能です。EMQX は permissions および nats.pub / nats.sub クレームをサポートし、最終的な認可結果は JWT ACL と EMQX 認可ルールの積集合となります。
JWT ACL クレーム例:
{
"sub": "Uxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"iss": "Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"nats": {
"pub": {
"allow": ["sensors.>"],
"deny": ["sensors.secret.>"]
},
"sub": {
"allow": ["alerts.>"],
"deny": ["alerts.internal.>"]
}
}
}ユーザーレベルインターフェースの設定
- 完全な設定リファレンスは:NATS ゲートウェイ設定
- REST API の詳細は:ゲートウェイ REST API ドキュメント
さらに詳しく
NATS プロトコルゲートウェイとそのユースケースについて詳しくは、ブログ記事をご覧ください:EMQX NATS Gateway: MQTT-NATS 双方向相互運用の実現。