Blackhold

dnsservices: interno por guifi, externo a mano

Posted on abril 20th, 2014 by admin

En guifi hay un paquete llamado dnsservices, que lo que hace es comunicarse con la web de guifi y de esta forma permite acceder a los dominios que crean los usuarios en la web y también se encarga de la resolución inversa de las ips de los nodos, de esta forma si hacemos un mtr o un traceroute, podremos ver el nombre del supernodo al cual estamos pasando en lugar de la IP. Esto nos permite poder seguir la traza de un paquete de tal forma que podemos saber exactamente por donde está pasando :)

Si además de nodos tienes servidores y varios dominios a gestionar, cosa que nos ocurre en marsupi, tenemos dos opciones, registrar nuestros dominios externos en la página web de guifi o gestionar los ficheros de zona directamente desde el bind.
Como queremos que los ficheros de zona queden un poco ordenados y sepamos en todo momento donde tenemos los equipos, además de que queremos hacer configuraciones un poco mas avanzadas que lo que nos permite la web de guifi, vamos a decantarnos por la segunda opción.

La otra cosa que vamos a hacer es crear 2 servidores maestros con la misma configuración.

Lo primero será crear el servicio dnsservices e instalarlo: wiki guifi.

El id del snpservices será el mismo en ambos servidores. Vamos a centrarnos pues con el “tuneo” de uno de los dos, al segundo simplemente le vamos a replicar los datos con rsync. Algunas personas me comentan que bind ya permite replicar los datos, pero te permite hacerlo en modo maestro-esclavo, yo lo que quiero son 2 maestros idénticos!

Una vez instalado dnsservices con el id correspondiente vamos a modificar un par de ficheros.

/etc/bind/named.conf

view "external" {
        match-clients { any; };
        recursion no;
        include "/etc/bind/named.conf.ext.private";
        zone "." IN { type hint; file "/etc/bind/named.root"; };
        zone "guifi.net" IN { type slave; file "/var/cache/bind/internet.guifi.net"; masters { 109.69.8.6; }; };
        zone "setup.guifi.net" IN { type forward; forward first; forwarders { 109.69.9.27; }; };
};

Ahora vamos a definir los ficheros de zona en

/etc/bind/named.conf.ext.private

allow-recursion {
        192.168.0.0/16;
        5.10.200.0/21;
        109.69.8.0/21;
        185.32.16.0/22;
        2a00:1508::/32;
        localhost;
};

// DOMINIO marsupi.org
zone "marsupi.org" {
                type master;
                file "/etc/bind/public/marsupi.org.hosts";
                };

// DOMINIOS socios
zone "summercamp.cat" {
                type master;
                file "/etc/bind/public/summercamp.cat.hosts";
                };

// SOCIOS MOVIMENTS.NET
zone "moviments.net" {
                type master;
                file "/etc/bind/public/moviments.net.hosts";
                };

En allow-recursion indicamos los rangos que pueden usar este servidor de DNS para consultar dominios en internet, es importante que un DNS que esté expuesto a internet tenga limitado qué rangos pueden hacer esto, ya que sino nos podemos encontrar con ataques de DDoS o DNS amplification.
También podemos ver algunos de los dominios que vamos a gestionar con este servidor de DNS (no voy a ponerlos todos porque es irrelevante y con estos tenemos suficiente para los ejemplos que quiero dar a conocer.

Ahora lo siguiente es crear el fichero de zona dentro del directorio /etc/bind/public/ que no existe y tendremos que crearlo.

root@v-aaron-dns:/etc/bind# mkdir public

Y dentro empezamos a crear los ficheros de zona para cada uno de los dominios. Tal como he comentado antes, pongo varios dominios porque cada uno de ellos tiene una configuración especial :)

Empezamos por marsupi.org.hosts

/etc/bind/public/marsupi.org.hosts

$TTL 1800
marsupi.org.      IN      SOA     ns1.marsupi.org. root.marsupi.org. (
                        2014042003 ; Numero de Serie (aammddxx)
                        10800
                        3600
                        604800
                        38400
                )

                IN      NS      ns1.marsupi.org.
                IN      NS      ns2.marsupi.org.
                IN      MX  10  lists.marsupi.org.

$INCLUDE /etc/bind/public/000-maquines-comunes

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

@                               IN      A       109.69.10.253

;; DATACENTER 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ns1                     1H      IN      A       109.69.10.254
lists                   1H      IN      A       109.69.10.252


akira                   1H      IN      CNAME   v-akira-zimbra
blackout                1H      IN      CNAME   v-conway-www
dudle                   1H      IN      CNAME   v-conway-www
ldap                    1H      IN      CNAME   cobalt
ldap1                   1H      IN      CNAME   cobalt
map                     1H      IN      CNAME   v-conway-www
monitor                 1H      IN      CNAME   burnell
pad                     1H      IN      CNAME   v-euler-pad
tasks                   1H      IN      CNAME   v-cobalt-dev
stats                   1H      IN      CNAME   v-conway-www
voip                    1H      IN      CNAME   v-captain-crunch

;; DATACENTER 2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ns2                     1H      IN      A       2.139.176.151


graf1                   1H      IN      CNAME   fermat
irc                     1H      IN      CNAME   fermat
;; OTHER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

autoconfig              1H      IN      CNAME   cun

;; AUTODNS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

graf-barbara            5M      IN      A       88.18.14.54
graf-redondiella        5M      IN      A       83.57.38.84
graf-orereta            5M      IN      A       62.99.27.94
graf-pamirandi          5M      IN      A       85.52.164.50
graf-zgz1               5M      IN      A       77.230.200.180
graf-espinilla          5M      IN      A       83.59.251.128
graf-bcnmargarit0       5M      IN      A       188.77.223.19
graf-monforte           5M      IN      A       79.145.101.222
graf-santgregori        5M      IN      A       79.152.122.18
graf-sfeldc             5M      IN      A       83.50.166.69
graf-bressola-soler     5M      IN      A       195.6.104.124

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Viendo el fichero de zona, ahora se entiende porqué quería hacerlo directamente modificando los ficheros de zona! :P además de que tengo lo del autodns de marsupi para resolver ips dinámicas.
Creo que no hace falta entrar en detalles de porqué cada cosa, A a host, CNAME a subdominio, 1H 1 hora, 5M 5 minutos, etc. Es importante no definir un MX a una IP, nos va a generar problemas!

Arriba del todo tenemos una línea con un include, esto nos permite incluir un fichero con las maquinas físicas, así que podemos incluir este fichero externo a cualquier fichero de zona, con lo que sólo tendremos que modificar las ips de los hosts en éste fichero.

/etc/bind/public/000-maquines-comunes

;; DATACENTER 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

cobalt                  1H      IN      A       109.69.10.254
v-conway-www            1H      IN      A       109.69.10.253
tesla                   1H      IN      A       109.69.10.252
v-euler-pad             1H      IN      A       109.69.10.251
burnell                 1H      IN      A       109.69.10.250
v-akira-zimbra          1H      IN      A       109.69.10.249
v-captain-crunch        1H      IN      A       109.69.10.248
v-cobalt-dev            1H      IN      A       109.69.10.247
v-aaron-happy           1H      IN      A       109.69.10.246

;; DATACENTER 2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

fermat                  1H      IN      A       2.139.176.151
;;fermat                        1H      IN      A       109.69.10.245

;; GURB ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

v-giss                  1H      IN      A       109.69.9.56
v-giss                  1H      IN      AAAA    2a00:1508:1000::6d45:938

;; OTHER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

cun                     1H      IN      A       94.23.214.100

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Aquí podemos ver la asignación a un host con IPv6, AAAA.

Ahora vamos a ver otro fichero de zona el cual reutiliza los dominios de marsupi

/etc/bind/public/moviments.net.hosts

$TTL 1800
moviments.net.      IN      SOA     ns1.moviments.net. root.moviments.net. (
                        2014042001
                        10800
                        3600
                        604800
                        38400
                )

                IN      NS      ns1.marsupi.org.
                IN      NS      ns2.marsupi.org.
                IN      MX  10  mail.moviments.net.


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

@                               IN      A       109.69.10.253

;; INFOESPAI ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;lists                 1H      IN      A       tesla.marsupi.org.
llistes                 1H      IN      A       tesla.marsupi.org.
cun                     1H      IN      A       94.23.214.100
mail                    1H      IN      A       94.23.214.100
www                     1H      IN      CNAME   v-conway-www.marsupi.org.

;; ESPECIFICS DOMINI ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


cursos                  1H      IN      CNAME   v-conway-www.marsupi.org.
okupaskny               1H      IN      CNAME   v-conway-www.marsupi.org.
xarxacontratancaments   1H      IN      CNAME   v-carmen-wwwestatiques.marsupi.org.
insershow               1H      IN      CNAME   v-carmen-wwwestatiques.marsupi.org.


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Destacamos que cuando hacemos el CNAME llamamos a subdominio.marsupi.org. (el punto al final es importante). Luego no incluimos el fichero de hosts compartidos.
Para que el MX funcione, tiene que estar definido como A en el mismo fichero de zona.

Otro fichero de zona aún más simple el de summercamp.cat! que sólo tiene una página web!

/etc/bind/public/summercamp.cat.hosts

$TTL 1800
summercamp.cat.      IN      SOA     ns1.summercamp.cat. root.summercamp.cat. (
                        2014042001
                        10800
                        3600
                        604800
                        38400
                )

                IN      NS      ns1.marsupi.org.
                IN      NS      ns2.marsupi.org.
                ;;IN    MX  10  smtp.summercamp.cat.


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

@                               IN      A       109.69.10.253

;; INFOESPAI ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;lists                 1H      IN      A       tesla.marsupi.org.
;;llistes               1H      IN      A       tesla.marsupi.org.
;;smtp                  1H      IN      A       v-akira-zimbra.marsupi.org.     
www                     1H      IN      CNAME   v-conway-www.marsupi.org.

;; ESPECIFICS DOMINI ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Como véis hay mas comentarios que líneas activas! lo he dejado todo preparado para que cuando quiera añadir algún servicio nuevo, como las listas, sea simplemente descomentar la línea! :)

Ahora es reiniciar bind9 y los cambios se aplican, para ver si hay errores tenemos que mirar el fichero de log /var/log/syslog o syslog.1

root@v-aaron-dns:/etc/bind/public# service bind9 restart

Para la replica, hace pocos días lo expliqué en otro post.

El script que tengo en este caso es:

/root/scripts/dns_primary_to_slave.sh

#!/bin/bash

VAR=$(rsync -av --delete /etc/bind/public root@10.228.192.218:/etc/bind/ |wc -l)
rsync --delete -av /etc/bind/named.conf.ext.private root@10.228.192.218:/etc/bind/

if [ "$VAR" -gt 4 ]; then
        echo "reboto bind ns2"
        ssh root@10.228.192.218 '/etc/init.d/bind9 restart'
fi

Para hacerlo funcionar es necesario tener instalado rsync.

Y esto es todo! :)

« »

guy fawkes