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 连接的 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

还需要注意的是,对于整个 grpc 代理,TLS 配置是“全局”的,如果你需要不同的 tls-name 针对不同的上游,你很可能会失败。

指标

如果已启用监视(通过 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 代理是全局的,您很可能不会成功。