描述
view 定義了一個表達式,該表達式必須評估為 true,才能將 DNS 請求路由到封閉的伺服器區塊。這實現了進階的伺服器區塊路由功能,例如分割 DNS。
語法
view NAME {
expr EXPRESSION
}
view
名稱 - 檢視的名稱,用於指標,並作為中繼資料匯出給符合檢視表達式的請求。expr
表達式 - 只有當 表達式 評估為 true 時,CoreDNS 才會將傳入的查詢路由到封閉的伺服器區塊。 有關可用的變數和函式,請參閱「表達式」部分。如果定義了多個檢視實例,所有 表達式 都必須評估為 true,CoreDNS 才會將傳入的查詢路由到封閉的伺服器區塊。
有關表達式語法和範例,請參閱表達式和範例章節。
範例
實作基於 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 內,則返回 truemetadata(label string)
- 返回與 label 匹配的中繼資料的值
中繼資料
如果也啟用了 metadata 外掛程式,則檢視外掛程式將發布以下中繼資料
view/name
:處理目前請求的檢視名稱