檢視

原始碼

view 定義了 DNS 請求必須符合的條件,才能將其路由到伺服器區塊。

描述

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
  }
}

將所有 AAAAA 請求傳送到 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/name:處理目前請求的檢視名稱