grpc

原始碼

grpc 透過 gRPC 協議,方便將 DNS 訊息代理至上游解析器。

描述

grpc 外掛程式支援 gRPC 和 TLS。

每個伺服器區塊只能使用此外掛程式一次。

語法

最基本的形式為

grpc FROM TO...
  • FROM 是要比對並代理請求的基礎網域。
  • TO… 是要代理至的目的端點。上游的數量限制為 15 個。

多個上游會在首次使用時隨機選擇(請參閱 policy)。當代理返回錯誤時,會嘗試列表中的下一個上游。

擴充語法提供額外的調整選項

grpc FROM TO... {
    except IGNORED_NAMES...
    tls CERT KEY CA
    tls_servername NAME
    policy random|round_robin|sequential
}
  • FROMTO… 如上所述。

  • except 中的 IGNORED_NAMES 是以空格分隔的網域列表,用於排除代理。不符合這些名稱的請求將會被傳遞。

  • tls CERT KEY CA 定義 TLS 連線的屬性。可以提供 0 到 3 個參數,其含義如下所述

    • tls - 不使用用戶端驗證,並且使用系統 CA 來驗證伺服器憑證
    • tls CA - 不使用用戶端驗證,並且使用檔案 CA 來驗證伺服器憑證
    • tls CERT KEY - 使用指定的憑證/金鑰對來進行用戶端驗證。使用系統 CA 驗證伺服器憑證
    • tls CERT KEY CA - 使用指定的憑證/金鑰對來進行用戶端驗證。使用指定的 CA 檔案來驗證伺服器憑證
  • tls_servername NAME 允許您在 TLS 設定中設定伺服器名稱;例如,9.9.9.9 需要將此設定為 dns.quad9.net。在這種情況下仍然允許多個上游,但它們必須使用相同的 tls_servername。例如,將 9.9.9.9 (QuadDNS) 與 1.1.1.1 (Cloudflare) 混用將無法運作。

  • policy 指定用於選擇上游伺服器的策略。預設值為 random

另請注意,如果您需要針對不同的上游使用不同的 tls-name,則 TLS 設定對於整個 grpc 代理來說是「全域性的」,您將無法實現。

指標

如果啟用監控(透過 prometheus 外掛程式),則會匯出以下指標

  • coredns_grpc_request_duration_seconds{to} - 每次上游互動的持續時間。
  • coredns_grpc_requests_total{to} - 每個上游的查詢計數。
  • coredns_grpc_responses_total{to, rcode} - 每個上游的 RCODE 計數。我們會隨機(總是使用 random 策略)發送到上游。

範例

example.org. 內的所有請求代理到在不同埠上執行的名稱伺服器

example.org {
    grpc . 127.0.0.1:9005
}

在三個解析器之間進行負載平衡所有請求,其中一個具有 IPv6 位址。

. {
    grpc . 10.0.0.10:53 10.0.0.11:1053 [2003::1]:53
}

轉發除了對 example.org 的請求之外的所有內容

. {
    grpc . 10.0.0.10:1234 {
        except example.org
    }
}

使用主機的 resolv.conf 的名稱伺服器代理除了 example.org 之外的所有內容

. {
    grpc . /etc/resolv.conf {
        except example.org
    }
}

使用 TLS 協定將所有請求代理到 9.9.9.9,並將每個答案快取最多 30 秒。請注意,如果您想要一個可運作的設定,則 tls_servername 是強制性的,因為 9.9.9.9 不能在 TLS 協商中使用。

. {
    grpc . 9.9.9.9 {
       tls_servername dns.quad9.net
    }
    cache 30
}

或者,來自同一個提供者的多個上游

. {
    grpc . 1.1.1.1 1.0.0.1 {
       tls_servername cloudflare-dns.com
    }
    cache 30
}

將請求轉發到在 Unix 網域套接字上監聽的本機上游。

. {
    grpc . unix:///path/to/grpc.sock
}

錯誤

如果您需要針對不同的上游使用不同的 tls_servername,則 TLS 設定對於整個 grpc 代理來說是全域性的,您將無法實現。