説明
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
: クエリIDname() string
: リクエストの名前 (リクエストされたドメイン名)opcode() int
: クエリOPCODEport() 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
: ip が cidr 内にある場合、trueを返しますmetadata(label string)
- label に一致するメタデータの値を返します
メタデータ
metadata プラグインも有効になっている場合、viewプラグインは次のメタデータを公開します
view/name
: 現在のリクエストを処理しているビューの名前