Configuración de un DNS con vistas

Se veía venir, cuando hay que hacer algo que se sale un poco del «siguiente->siguiente» lo acaban colocando en un pingüino. En este caso hay que configurar un servidor de DNS que conteste diferentes ips para un mismo nombre dependiendo de la ip de origen.


Os pongo en antecedentes … Una cabina de discos con N tarjetas de red conectadas a N redes diferentes.

Esto esta configurado así para aprovechar las conexiones de 10Gb y hacer que, cuando una maquina necesite acceder a la cabina lo haga de la forma mas rápida posible (porque siempre lo va a tener conectado de forma local)

Sobre el plano todo parece muy bonito, pero luego resulta que:

– Cuando una maquina pide acceso a su share lo hace por su nombre dns (miunidad.dominio.com) y como el DNS (actual) siempre le contesta con la misma ip las N-1 redes que no están conectadas localmente acceden a la cabina por su default gateway (que atraviesa varios routers y un firewall) con lo que la velocidad de acceso no es todo lo buena que debiera.
– Ademas la cabina en cuestión no tenia las correspondientes rutas de vuelta para las N-1 redes y todo lo estaba devolviendo por su ruta por defecto así que, sumamos routing asimétrico a la lista de problemas.

Con estas dos «pequeñas cosas» la cabina iba mas lenta que un pendrive en un usb 1.0 con el consiguiente mosqueo del personal.

A lo que vamos, aunque el DNS que se usa para estas cosas esta montado en un DC (con windows)…pues eso.

La idea entonces es, delegar una zona sobre un servidor con Bind y hacer unas vistas para que siempre que preguntes el dns te conteste con la ip que la cabina tiene en tu red local.

Para configurarlo:

en /etc/named.conf (del primario y del secundario).

Creamos una acl para una de las nuevas redes:

acl «mired_1» {
xx.xx.xx.xx/xx; # Una de las redes
};

Y luego creamos una vista nueva para esta red:

view «mi_vista_1» {
include «/etc/named.rfc1912.zones»;
match-clients { mired_1; }; <- Esto es lo importante, que haga match con la acl que hemos creado antes. recursion yes; empty-zones-enable no; allow-transfer { dns_secundarios; }; zone "eldns.delasvistas.net" IN { type master; file "eldns_1.delasvistas.net"; }; Aquí definimos la(s) zona(s) que queremos que conteste(n). }; La configuración en un servidor secundario es la misma, salvo que en vez de "master" es "slave" (y que hay que pone la ip del primario). Reiniciamos el demonio (service named restart) y listo. Creamos tantas vistas como queramos para que, por ejemplo: - desde la ip 1.1.1.1 preguntamos por mi.eldns.delasvistas.net y contesta con la 1.1.1.2 (porque hace match con la vista mi_vista_1 - desde la ip 2.2.2.1 preguntamos por mi.eldns.delasvistas.net y contesta con la 2.2.2.2 (si creáramos otra vista mi_vista_2 por ejemplo). Y así conseguimos que cada red ataque a la cabina en cuestión utilizando su ip local y evitando el paso por los elementos de red que "se supone" que están provocando el retraso. El truco aquí esta en: - Crear tantas vistas como necesitemos - Hacer que los ficheros de zona contesten con las ips de la misma red con la que se pregunta. Todo esto sobre un BIND 9.8.2 Algunas consideraciones: - Las ACL's hacen match de forma secuencial. Si tienes 10.0.0.0/8 en la primera tienes que denegar explicitamente las que tienes debajo para que funcione.