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

ほとんどのOSでは、[::]へのバインドはデフォルトで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アドレスなしでポートのみを指定する場合は、IPv6を明示的に有効にできます。

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検出

HTTPベースのコネクター(認証バックエンド、Webhookアクションなど)では、EMQXが対象ホストの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を明示的に有効にしてください。