説明
通常、リスナーはワイルドカードホストにバインドされます。ただし、リスナーを別のIPにバインドする場合があります。
複数のアドレスが提供された場合、提供されたIPのそれぞれでリスナーが開きます。
各アドレスはホストのインターフェイスの1つのIPまたは名前にする必要があります。インターフェイス名でバインドすると、起動時または再読み込み時にそのインターフェイス上のIPにバインドされます(再読み込みはSIGHUPまたは設定ファイルの変更で行われます)。
指定された引数がインターフェイス名で、そのインターフェイスに複数のIPアドレスがある場合、CoreDNSはそのインターフェイスのすべてのインターフェイスIPアドレス(IPv4とIPv6を含む)でlistenします(ただし、そのインターフェイス上のIPv6リンクローカルアドレスを除く)。
構文
基本的な形式では、単純なバインドはこの構文を使用します。
bind ADDRESS|IFACE ...
拡張構文のIPアドレスまたはインターフェイス名で一部のアドレスを除外することもできます。
bind ADDRESS|IFACE ... {
except ADDRESS|IFACE ...
}
- ADDRESS|IFACEはバインド先のIPアドレスまたはインターフェイス名です。複数のアドレスが提供されると、各アドレスでリスナーが開きます。詳細については説明をお読みください。
except
はバインドするインターフェイスまたはIPアドレスを除外します。except
オプションは、同じサーバーブロックで複数のbind
ディレクティブが使用されている場合に、現在のbind
ディレクティブのアドレスのみを除外します。
例
ソケットをそのマシンだけからアクセスできるようにするには、IP 127.0.0.1(localhost)にバインドします
. {
bind 127.0.0.1
}
DNSリクエストをIPv4とIPv6スタックの両方のローカルホストだけで処理できるようにするには、次のような構文を使用します。
. {
bind 127.0.0.1 ::1
}
複数のbindプラグインを使用して構成する場合、すべてのアドレスは一緒に統合されます。次のサンプルは前のものと等価です。
. {
bind 127.0.0.1
bind ::1
}
次のサーバーブロックは、ローカルホストのインターフェイス名(「127.0.0.1」と「::1」の両方)にバインドします。
. {
bind lo
}
IPまたはインターフェイス名で一部のアドレスを除外できます(次の例では::1
またはlo
インターフェイスに割り当てられているアドレスのみでlistenします)
. {
bind lo {
except 127.0.0.1
}
}
バグ
リスナーの競合の回避
TL;DR bindプラグインをサーバーブロックに追加する場合、同じポートでlistenする他のすべてのサーバーブロックにも追加する必要があります。
複数サーバーブロックが共通ポートでlistenするように構成されている場合、これらのサーバーブロックはすべてbindプラグインを使用するか、すべてデフォルトのバインドを使用する必要があります(bindプラグインなし)。ここでは、「ポート」とはサーバーブロックがサービスを提供するように構成されたTCP/UDPポート(デフォルトは53)であり、ネットワークインターフェイスではありません。同じポートでlistenする2つのサーバーブロックの場合、1つがバインドプラグインを使用し、もう1つが使用しない場合、同じアドレス宛てのパケットのサービスを競合して2つの個別のリスナーが作成されます。これを実行すると、予期できない動作が発生します(リクエストはどちらのサーバーによってもランダムにサービスされる可能性があります)。これは、bindプラグインなしでは、サーバーはすべてのインターフェイスにバインドするため、同じポートでアドレスをlistenするためにbindを使用している場合は別のサーバーと衝突するためです。たとえば、次の例では、どちらも127.0.0.1:53でリッスンする2つのサーバーが作成されますが、これはa.bad.example.com
のクエリで予期しない動作を引き起こします。
a.bad.example.com {
bind 127.0.0.1
forward . 1.2.3.4
}
bad.example.com {
forward . 5.6.7.8
}
MacOSでも、これが正しく機能しない(オープンな)バグがあります。詳細についてはhttps://github.com/miekg/dns/issues/724を参照してください。ただし、解決策はありません。