如果名称未解析,如何将请求转发到下一个解析器

How to forward request to next resolver if name not resolved

我的 coredns 配置中有多个上游解析器,例如:

foo.com {
  forward . XX.XX.XX.XX YY.YY.YY.YY ZZ.ZZ.ZZ.ZZ
}

我想将请求转发给那些服务器,但只有一个知道如何解决特定查询。 (例如:只有ZZ知道如何解析a.foo.com

如果第一个上游不知道如何解决查询,我如何将请求转发给下一个上游?

不幸的是 forward 本身不提供 fallthrough 机制,所以在这种情况下你必须使用其他东西。一种这样的解决方案是使用备用插件 (https://coredns.io/explugins/alternate)。由自己的coredns团队维护

通过使用插件,您的配置:

foo.com {
    forward . XX.XX.XX.XX YY.YY.YY.YY ZZ.ZZ.ZZ.ZZ
}

会变成这样的东西:

foo.com {
    forward . XX.XX.XX.XX
    alternate NXDOMAIN,SERVFAIL,REFUSED . YY.YY.YY.YY
    alternate NXDOMAIN,SERVFAIL,REFUSED . ZZ.ZZ.ZZ.ZZ
}

请注意,顺序总是会被遵循,因此第一个节点的压力会比其他节点大。如果您不想那样,那么您可能需要编写自己的插件。

要使用这个插件或者不要忘记使用 plugin.cfg 中包含的插件重新编译 coredns - before forward.

如果您在从源代码构建它时遇到问题,我写了一个脚本:

git clone https://github.com/coredns/coredns
cd coredns/plugin
git clone https://github.com/coredns/alternate
cd ..
sed -i "s/^require/replace github.com\/coredns\/coredns\/plugin\/alternate \=\> ${PWD//\//\\/}\/plugin\/alternate\n\nrequire/" go.mod
sed -i s/forward:forward/alternate:alternate\nforward:forward/ plugin.cfg
make
cd ..

基本上它会下载 coredns,然后切换到它的子文件夹之一。第一个 sed 是告诉 coredns 在构建中包含此插件的必要步骤,第二个 sed 指示 go 使用您刚刚下载的本地文件夹替代而不是查找 github。在 运行 make 之前,我建议从 plugin.cfg 中删除您知道不会使用的其他插件,例如 etcd、kubernetes 等。