Skip to content

IPv6

EMQXは、クライアント接続、ダッシュボード、ノード間クラスタリング、および外部サービスへのアウトバウンド接続においてIPv6を完全にサポートしています。このページでは、シングルスタック(IPv6のみ)からデュアルスタック展開まで、IPv6環境でのEMQXの設定方法を説明します。

MQTTリスナー

IPv6経由でMQTTクライアント接続を受け入れるには、リスナーをIPv6アドレスにバインドします。EMQXはIPv6のバインドアドレスを検出すると、自動的にinet6ソケットオプションを有効にします。

デュアルスタック(IPv4およびIPv6)

同じポートでIPv4とIPv6の両方の接続を受け入れるには、[::]にバインドします。

bash
listeners.tcp.default {
  bind = "[::]:1883"
}

TIP

ほとんどのオペレーティングシステムでは、[::]にバインドするとデフォルトでIPv4とIPv6の両方の接続を受け入れます(デュアルスタック)。両方のプロトコルをサポートする環境において最も簡単な設定です。

IPv6のみ

リスナーをIPv6接続のみに制限するには、ipv6_v6only = trueを設定します。

bash
listeners.tcp.default {
  bind = "[::]:1883"
  ipv6_v6only = true
}

これはIPV6_V6ONLYソケットオプションを設定し、IPv4マッピングされたIPv6アドレスの受け入れを防ぎます。

特定のIPv6アドレスにバインド

特定のIPv6アドレスにバインドすることも可能です。

bash
listeners.tcp.default {
  bind = "[::1]:1883"
}

同じ設定はSSL、WebSocket、Secure WebSocketリスナーにも適用されます。

bash
listeners.ssl.default {
  bind = "[::]:8883"
  ssl_options {
    certfile = "etc/certs/cert.pem"
    keyfile = "etc/certs/key.pem"
    cacertfile = "etc/certs/cacert.pem"
  }
}

listeners.ws.default {
  bind = "[::]:8083"
}

listeners.wss.default {
  bind = "[::]:8084"
}

ダッシュボードのHTTP/HTTPSリスナー

EMQXダッシュボードのHTTP/HTTPSリスナーもIPv6をサポートしています。

IPv6バインドアドレスの使用

bindアドレスがIPv6の場合、EMQXはダッシュボードリスナーで自動的にIPv6を有効にします。

bash
dashboard.listeners.http {
  bind = "[::]:18083"
}

inet6フラグの使用

IPアドレスを明示せずポート番号のみでバインドする場合は、inet6を明示的に有効にできます。

bash
dashboard.listeners.http {
  bind = 18083
  inet6 = true
}
パラメータデフォルト説明
inet6booleanfalseIPv6サポートを有効にします。falseの場合、リスナーはIPv4トラフィックのみを受け入れます。
ipv6_v6onlybooleanfalseIPv4からIPv6へのマッピングを無効にします。inet6trueの場合のみ有効です。

クラスター通信

EMQXクラスターのノード間通信がIPv6ネットワーク上で行われる場合、2つのコンポーネントの設定が必要です。1つはクラスタ調整に使用されるErlang分散プロトコル、もう1つはノード間のデータ転送に使用されるGen RPCチャネルです。

Erlang分散プロトコル

ノード間通信でIPv6を使用するには、cluster.proto_distを設定します。

bash
cluster.proto_dist = inet6_tcp

利用可能なオプション:

説明
inet_tcpIPv4上のTCP(デフォルト)
inet6_tcpIPv6上のTCP
inet_tlsIPv4上のTLS、etc/ssl_dist.confで設定
inet6_tlsIPv6上のTLS、etc/ssl_dist.confで設定

重要なお知らせ

IPv6ノード名(例:emqx@::1)を使用する場合、cluster.proto_distを必ずinet6_tcpまたはinet6_tlsに設定してください。そうしないと、「not responding to pings」などのエラーでノードが起動に失敗します。

Gen RPC

Gen RPCチャネルをIPv6用に設定します。

bash
rpc.listen_address = "::"
rpc.ipv6_only = true
パラメータデフォルト説明
rpc.listen_addressstring0.0.0.0RPCサーバーのIPアドレス。IPv4の場合は0.0.0.0、IPv6の場合は::を使用します。
rpc.ipv6_onlybooleanfalselisten_addressがIPv6の場合、これをtrueにするとRPCクライアントはIPv6のみを使用します。

アウトバウンド接続

EMQXはHTTP認証、Webhookアクション、データベース統合などの機能のために外部サービスへのアウトバウンド接続を行います。

自動IPv6検出

EMQXはさまざまなアウトバウンド接続タイプでIPv6をサポートしています。

  • HTTPベースのコネクター(認証バックエンド、Webhookアクションなど)では、EMQXがターゲットホストのIPv6対応を自動的に検出し、適切なアドレスファミリーを選択します。ほとんどの場合、手動設定は不要です。
  • MQTTコネクターでは、IPv6のみのブローカーやホスト名がIPv6のAAAAレコードのみを返すブローカーにも接続可能です。MQTTブローカーのアドレスは、[::1]:1883mqtt://[::1]:1883のような角括弧付きIPv6リテラルも使用できます。

手動オーバーライド

一部のコネクタータイプでは設定にipv6_probeトグルがあり、有効(HTTPコネクターのデフォルト)にするとEMQXはまずIPv6接続を試みます。ネットワークがIPv4のみでDNSがAレコードとAAAAレコードの両方を返す場合、接続遅延を避けるためにこのプローブを無効にできます。

bash
# 例:HTTP認証バックエンド
authentication {
  backend = "http"
  method = "post"
  url = "http://auth-server.example.com:8080/auth"

  # 不要な場合はIPv6自動検出を無効化
  pool_size = 8
}

IPv6のみの完全な例

以下はIPv6のみの展開向けの最小限のemqx.conf例です。

bash
# IPv6アドレスを使用したノード名
node.name = "emqx@::1"

# IPv6によるクラスター分散
cluster.proto_dist = inet6_tcp

# IPv6によるGen RPC
rpc.listen_address = "::"
rpc.ipv6_only = true

# IPv6でのMQTTリスナー
listeners.tcp.default {
  bind = "[::]:1883"
  ipv6_v6only = true
}

# IPv6でのダッシュボード
dashboard.listeners.http {
  bind = "[::]:18083"
}

トラブルシューティング

ノードがpingに応答しない

症状:IPv6ノード名でクラスターを起動すると、「not responding to pings」と表示され起動に失敗する。

原因:Erlang分散プロトコルのデフォルトがinet_tcp(IPv4)であり、IPv6ノード名にはinet6_tcpが必要。

対処法emqx.confcluster.proto_dist = inet6_tcpを設定してください。

アウトバウンド接続でのenetunreachエラー

症状:HTTPリクエスト(認証バックエンドなど)がenetunreach(ネットワーク到達不能)で失敗する。

原因:IPv6のみのサービスにIPv4で接続しようとしている、またはその逆。

対処法:EMQXホストからターゲットサービスへの正しいアドレスファミリーでの到達性を確認してください。HTTPコネクターは自動IPv6プローブで対応します。DNS名の場合は、DNSが正しいレコードタイプ(IPv4はA、IPv6はAAAA)を返しているか確認してください。

IPv6環境でダッシュボードにアクセスできない

症状:IPv6のみ環境でEMQXを実行しているときにダッシュボードにアクセスできない。

原因:ダッシュボードリスナーがデフォルトでIPv4(0.0.0.0:18083)にバインドされている。

対処法:ダッシュボードをIPv6アドレスにバインドする(bind = "[::]:18083")か、inet6 = trueでIPv6を明示的に有効にしてください。