Estoy configurando un servidor DNS simple (BIND/Named), que se ejecuta localmente en una computadora portátil OSX.
Su propósito es resolver todas las solicitudes de "*.laptop.example.com" a "192.168.2.2", que es la dirección IP asignada manualmente (no DHCP) de una interfaz de red virtual.
Estoy usando una interfaz de red virtual (proporcionada por Parallels) para garantizar que la dirección IP siempre sea la misma (eth0 cambiará su dirección IP cuando se conecte a diferentes redes) y también para garantizar que esté siempre disponible (eth0 está deshabilitado/no disponible). cuando no hay un cable de red enchufado).
He estado usando la siguiente configuración:
options {
...
forwarders {
192.168.1.1;
};
forward only;
};
Sin embargo, esto requiere que la configuración se actualice cada vez que la computadora portátil cambia de red (ya que la mayoría de las redes tienen una dirección DNS diferente para usar).
Me gustaría eliminar este requisito para que si BIND/Named no reconoce el nombre de dominio (es decir, no es un subdominio de "laptop.example.com"), devuelva un error para que la computadora portátil pueda probar el segundo Dirección DNS que tiene registrada (una que ha recogido de DHCP).
Una posibilidad es utilizar:
options {
...
forwarders {
};
forward only;
recursion no;
};
Lo que evita que dedique más de 3 segundos a consultar los servidores ROOT... sin embargo, el cliente interpreta esa respuesta como "el dominio no existe", en lugar de un error que se puede solucionar probando el siguiente servidor.
Respuesta1
Gracias Alnitak, duffbeer703, John Gardeniers, todos muy buenos comentarios.
La solución que he usado para mi problema es usar launchd para detectar los cambios en /etc/resolv.conf y luego actualizar la lista de reenviadores.
Al crear el archivo:
/Library/LaunchDaemons/myname.update.plist
Con el contenido:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>Label</key>
<string>myname.update</string>
<key>ProgramArguments</key>
<array>
<string>[PATH]/update.sh</string>
</array>
<key>WatchPaths</key>
<array>
<string>/var/run/resolv.conf</string>
</array>
</dict>
</plist>
Y cargando esto con:
launchctl load /Library/LaunchDaemons/myname.update.plist
launchctl start myname.update
Un guión en:
[PATH]/update.sh
Puede ejecutar algo como:
DST="/var/named/forwarders.conf";
echo "forwarders {" > $DST
cat /etc/resolv.conf | \
grep -v -E "(127.0.0.1|localhost)" | \
awk '{ sub("^nameserver ", "\t"); sub("$", ";"); print }' >> $DST
echo "};" >> $DST
Y luego, en la configuración nombrada, puede usarlo con:
options {
directory "[PATH]/conf/";
listen-on { 127.0.0.1; [IP_ADDRESS_HOST]; };
include "/var/named/forwarders.conf";
forward only;
};
Si desea ver o utilizar la implementación completa, vaya ami página de configuración BINDy use el formulario de descarga... crea un paquete ZIP con un único script de instalación, por lo que, con suerte, es bastante sencillo de configurar y usar.
Respuesta2
¿Por qué no simplemente agregar una entrada al archivo de hosts y ahorrarse toda esa molestia?
Respuesta3
Es posible que desees entrar en más detalles sobre lo que estás intentando hacer; esto no tiene mucho sentido. Mi consejo es no modificar los fundamentos del DNS: estás rompiendo algo que simplemente funciona.
Los servidores DNS primarios y secundarios están en la configuración de su red para disponibilidad. Si un servidor DNS no puede proporcionar una respuesta, el cliente no va al servidor secundario; las personas que inventaron el DNS implementaron el concepto de "recursión" para resolver ese problema.
Si está utilizando Mac, es posible que utilizar Bonjour/mDNS sea una ruta más productiva.
Respuesta4
Intenta usarunbound
en cambio.
Aunque es principalmente un servidor recursivo, creo que tiene la capacidad de proporcionar tanto la anulación de comodines que necesita como también reenviar todo lo demás alactualServidores DNS ascendentes aprendidos automáticamente de /etc/resolv.conf
.