IPv6
EMQXは、クライアント接続、ダッシュボード、ノード間クラスタリング、および外部サービスへのアウトバウンド接続に対してIPv6を完全にサポートしています。本ページでは、シングルスタック(IPv6のみ)からデュアルスタック展開まで、IPv6環境におけるEMQXの設定方法を説明します。
MQTTリスナー
IPv6経由でMQTTクライアント接続を受け入れるには、リスナーをIPv6アドレスにバインドします。EMQXはIPv6バインドアドレスを検出すると、自動的にinet6ソケットオプションを有効にします。
デュアルスタック(IPv4およびIPv6)
同じポートでIPv4とIPv6の両方の接続を受け入れるには、[::]にバインドします。
listeners.tcp.default {
bind = "[::]:1883"
}TIP
ほとんどのOSでは、[::]へのバインドはデフォルトでIPv4とIPv6の両方の接続を受け入れます(デュアルスタック)。両方のプロトコルをサポートする環境において最も簡単な設定です。
IPv6のみ
リスナーをIPv6接続のみに制限するには、ipv6_v6only = trueを設定します。
listeners.tcp.default {
bind = "[::]:1883"
ipv6_v6only = true
}これはIPV6_V6ONLYソケットオプションを設定し、IPv4マップドIPv6アドレスの受け入れを防ぎます。
特定のIPv6アドレスにバインド
特定のIPv6アドレスにバインドすることも可能です。
listeners.tcp.default {
bind = "[::1]:1883"
}同様の設定はSSL、WebSocket、Secure WebSocketリスナーにも適用されます。
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を有効にします。
dashboard.listeners.http {
bind = "[::]:18083"
}inet6フラグの使用
明示的なIPアドレスなしでポートのみを指定する場合は、IPv6を明示的に有効にできます。
dashboard.listeners.http {
bind = 18083
inet6 = true
}| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
inet6 | boolean | false | IPv6サポートを有効にします。falseの場合、リスナーはIPv4トラフィックのみを受け入れます。 |
ipv6_v6only | boolean | false | IPv4からIPv6へのマッピングを無効にします。inet6がtrueの場合のみ有効です。 |
クラスター通信
EMQXクラスターのノード間通信がIPv6ネットワーク上で行われる場合、2つのコンポーネントの設定が必要です。1つはクラスター調整に使用されるErlang分散プロトコル、もう1つはノード間のデータ転送に使用されるGen RPCチャネルです。
Erlang分散プロトコル
ノード間通信でIPv6を使用するには、cluster.proto_distを設定します。
cluster.proto_dist = inet6_tcp利用可能なオプション:
| 値 | 説明 |
|---|---|
inet_tcp | IPv4上のTCP(デフォルト) |
inet6_tcp | IPv6上のTCP |
inet_tls | IPv4上のTLS、etc/ssl_dist.confで設定 |
inet6_tls | IPv6上のTLS、etc/ssl_dist.confで設定 |
重要なお知らせ
IPv6ノード名(例:emqx@::1)を使用する場合、cluster.proto_distを必ずinet6_tcpまたはinet6_tlsに設定してください。そうしないと、「not responding to pings」などのエラーでノードが起動に失敗します。
Gen RPC
Gen RPCチャネルをIPv6用に設定します。
rpc.listen_address = "::"
rpc.ipv6_only = true| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
rpc.listen_address | string | 0.0.0.0 | RPCサーバーのIPアドレス。IPv4の場合は0.0.0.0、IPv6の場合は::を使用します。 |
rpc.ipv6_only | boolean | false | listen_addressがIPv6の場合、これをtrueに設定するとRPCクライアントはIPv6のみを使用します。 |
アウトバウンド接続
EMQXはHTTP認証、Webhookアクション、データベース統合などの機能のために外部サービスへのアウトバウンド接続を行います。
自動IPv6検出
HTTPベースのコネクター(認証バックエンド、Webhookアクションなど)では、EMQXが対象ホストのIPv6対応を自動的に検出し、適切なアドレスファミリーを選択します。ほとんどの場合、手動設定は不要です。
手動オーバーライド
一部のコネクタータイプは設定にipv6_probeトグルを提供しています。有効(HTTPコネクターのデフォルト)にすると、EMQXはまずIPv6接続を試みます。ネットワークがIPv4のみでDNSがAレコードとAAAAレコードの両方を返す場合、接続遅延を避けるためにプローブを無効にできます。
# 例:HTTP認証バックエンド
authentication {
backend = "http"
method = "post"
url = "http://auth-server.example.com:8080/auth"
# 不要な場合はIPv6自動検出を無効化
pool_size = 8
}IPv6のみの完全な例
以下はIPv6のみ展開の最小限のemqx.conf例です。
# 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.confでcluster.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を明示的に有効にしてください。