Você quer que o DNS seja confiável. Adicionar uma enorme quantidade de complexidade à configuração causará um pesadelo absoluto quando algo quebrar.
Algumas das soluções propostas funcionam apenas quando os servidores DNS redundantes estão no mesmo local.
A questão fundamental é que o cliente DNS está quebrado conforme planejado. Ele não lembra quando um servidor estava inacessível e continua tentando se conectar ao mesmo servidor sem resposta.
O NIS lidou com esse problema fazendo com que o ypbind mantivesse o estado. Uma solução desajeitada, mas geralmente funciona.
A solução aqui é apoiar os fornecedores para implementar uma solução razoável para esse problema. Está ficando pior com o IPV6, já que os pedidos de AAAA estão aumentando o tempo gasto desperdiçado em tempos limite. Eu vi protocolos falharem (por exemplo, uma conexão sshd) porque eles gastaram muito tempo esperando por tempos limite de DNS devido a um único servidor DNS inacessível.
Nesse ínterim, como sugerido anteriormente, escreva um script que substitua resolv.conf por um que contenha apenas servidores de nomes válidos. Compartilhe este script com fornecedores para demonstrar a solução impura que você foi forçado a implementar.
Isto não foi seriamente testado, e assume um nslookup que analisa como o meu, e um grep que suporta "-q".
Execute isso fora do cron a cada 5 minutos ou mais.
Não estou sugerindo seriamente que alguém realmente use o cron e um script de shell para o gerenciamento crítico de failover; as surpresas de tratamento de erros são muito grandes. Esta é apenas uma prova de conceito.
Para testar isso de verdade, altere a linha "nameservers=" na parte superior, altere o resolv_conf na parte superior para /etc/resolv.conf não /tmp/resolv.conf e o cabeçalho padrão para o resolv.conf que contém example.com.
Você pode precisar reiniciar o nscd se você substituir o resolv.conf.
#!/bin/bash
# full list of nameservers
nameservers="127.0.0.1 192.168.0.1 192.168.1.1"
# resolv.conf filename, change to /etc/resolv.conf for production use
resolv_conf="/tmp/resolv.conf"
# for tracking during the test
failed_nameservers=""
good_nameservers=""
# test loop
for nameserver in $nameservers; do
if nslookup localhost $nameserver | grep -q 'Address.*127\.0\.0\.1'; then
good_nameservers="$good_nameservers $nameserver"
else
failed_nameservers="$failed_nameservers $nameserver"
fi
done
# if none succeded, include them all
if [ -z "$good_nameservers" ]; then
good_nameservers="$nameservers"
fi
# error reporting, consider writing to syslog
if [ -n "$failed_nameservers" ]; then
echo warning: failed nameservers $failed_nameservers
fi
# create the temporary replacement resolv.conf
new_rc="$resolv_conf.new.$$"
echo domain example.com > $new_rc
echo search example.com >> $new_rc
for nameserver in $good_nameservers; do
echo nameserver $nameserver >> $new_rc
done
# don't deploy a corrupt resolv.conf
if ! grep -q nameserver $new_rc; then
echo warning: sanity check on $new_rc failed, giving up
exit 1
fi
# keep a backup
if [ -f $resolv_conf ]; then
rm -f $resolv_conf.previous
ln $resolv_conf $resolv_conf.previous
fi
# deploy the new one
mv $new_rc $resolv_conf