Как перенаправить запрос на следующий преобразователь, если имя не разрешено

#coredns

Вопрос:

У меня есть несколько восходящих преобразователей в моей конфигурации coredns, например:

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

Я хочу переслать запрос на эти серверы, но только один знает, как разрешить конкретный запрос. (например: только ZZ знает, как разрешить a.foo.com )

Как я могу переслать запрос следующему восходящему потоку, если первый не знает, как разрешить запрос?

Ответ №1:

К сожалению forward , alone не предлагает 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
}
 

Остерегайтесь того факта, что порядок будет всегда соблюдаться, поэтому на первый узел будет оказываться большее давление, чем на остальные. Если вы этого не хотите, вам, вероятно, потребуется написать свой собственный плагин.

Чтобы использовать этот плагин или не забудьте перекомпилировать coredns с плагином, включенным в plugin.cfg перед пересылкой.

Если у вас возникли проблемы с его сборкой из исходного кода, я написал скрипт:

 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/alternatennrequire/" 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 и т. Д.