ビュー

ソース

view は、DNSリクエストがサーバーブロックにルーティングされるために満たされなければならない条件を定義します。

説明

view は、DNSリクエストがサーバーブロックにルーティングされるためにtrueと評価されなければならない式を定義します。 これにより、スプリットDNSなどの高度なサーバーブロックルーティング機能が有効になります。

構文

view NAME {
  expr EXPRESSION
}
  • view NAME - メトリックで使用され、ビューの式に一致するリクエストのメタデータとしてエクスポートされるビューの名前
  • expr EXPRESSION - CoreDNSは、EXPRESSIONがtrueと評価された場合にのみ、着信クエリを囲みサーバーブロックにルーティングします。 使用可能な変数と関数については、のセクションを参照してください。 複数のviewインスタンスが定義されている場合、CoreDNSが着信クエリを囲みサーバーブロックにのみルーティングするには、すべてのEXPRESSIONがtrueと評価される必要があります。

式の構文と例については、「式」と「例」のセクションを参照してください。

CIDRベースのスプリットDNSルーティングを実装します。 これは、クライアントのIPアドレスに応じて、test. に対して異なる回答を返します。 それは…を返します

  • test. 3600 IN A 1.1.1.1、ソースアドレスが127.0.0.0/24のクエリの場合
  • test. 3600 IN A 2.2.2.2、ソースアドレスが192.168.0.0/16のクエリの場合
  • test. 3600 IN A 3.3.3.3、その他すべての場合
. {
  view example1 {
    expr incidr(client_ip(), '127.0.0.0/24')
  }
  hosts {
    1.1.1.1 test
  }
}

. {
  view example2 {
    expr incidr(client_ip(), '192.168.0.0/16')
  }
  hosts {
    2.2.2.2 test
  }
}

. {
  hosts {
    3.3.3.3 test
  }
}

すべてのAおよびAAAAリクエストを10.0.0.6に送信し、その他のすべてのリクエストを10.0.0.1に送信します。

. {
  view example {
    expr type() in ['A', 'AAAA']
  }
  forward . 10.0.0.6
}

. {
  forward . 10.0.0.1
}

abc.*.example.com(*は任意の数のラベル)に対するすべてのリクエストを10.0.0.2に送信し、その他のすべてのリクエストを10.0.0.1に送信します。正規表現パターンは単一引用符で囲まれ、バックスラッシュはバックスラッシュでエスケープされていることに注意してください。

. {
  view example {
    expr name() matches '^abc\\..*\\.example\\.com\\.$'
  }
  forward . 10.0.0.2
}

. {
  forward . 10.0.0.1
}

式を評価するために、view は antonmedv/expr パッケージ(https://github.com/antonmedv/expr) を使用します。 たとえば、式は次のようになります。 (type() == 'A' && name() == 'example.com') || client_ip() == '1.2.3.4'.

すべての式は、ブール値に評価されるように記述する必要があります。

有効な構文の詳細なリファレンスとして、https://github.com/antonmedv/expr/blob/master/docs/Language-Definition.md を参照してください。

使用可能な式関数

view プラグインのコンテキストでは、式は以下で定義されているユーティリティ関数を使用してDNSクエリ情報を参照できます。

DNSクエリ関数

  • bufsize() int: クエリでアドバタイズされたEDNS0バッファサイズ
  • class() string: リクエストのクラス (IN, CH, …)
  • client_ip() string: クライアントのIPアドレス。IPv6アドレスの場合は、角括弧で囲まれます: [::1]
  • do() bool: クエリに設定されているEDNS0 DO (DNSSEC OK) ビット
  • id() int: クエリID
  • name() string: リクエストの名前 (リクエストされたドメイン名)
  • opcode() int: クエリOPCODE
  • port() string: クライアントのポート
  • proto() string: 使用されているプロトコル (tcpまたはudp)
  • server_ip() string: サーバーのIPアドレス。IPv6アドレスの場合は、角括弧で囲まれます: [::1]
  • server_port() string : サーバーのポート
  • size() int: リクエストサイズ(バイト単位)
  • type() string: リクエストのタイプ (A, AAAA, TXT, …)

ユーティリティ関数

  • incidr(ip string, cidr string) bool: ipcidr 内にある場合、trueを返します
  • metadata(label string) - label に一致するメタデータの値を返します

メタデータ

metadata プラグインも有効になっている場合、viewプラグインは次のメタデータを公開します

  • view/name: 現在のリクエストを処理しているビューの名前