Exemple complet de DNS

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda

Preparació

Imaginem que tenim una xarxa com aquesta:

                 --------- 
                 |  DNS2 |  
                 ---------  
                         \             ----------
                      /switch1/--------|Firewall|----- INTERNET
                        /    \         ----------
                 ---------    -----------
                 |DNS1   |    |  PC1-2  |
                 ---------    -----------

L'exemple es provarà en contenidors LXD. Les IP són les següents:

+----------+---------+--------------------------------+------+------------+-----------+
|  NOMBRE  | ESTADO  |              IPV4              | IPV6 |    TIPO    | SNAPSHOTS |
+----------+---------+--------------------------------+------+------------+-----------+
| dns1     | RUNNING | 10.20.30.100 (eth1)            |      | PERSISTENT | 0         |
+----------+---------+--------------------------------+------+------------+-----------+
| dns2     | RUNNING | 10.20.30.200 (eth1)            |      | PERSISTENT | 0         |
+----------+---------+--------------------------------+------+------------+-----------+
| firewall | RUNNING | 10.150.173.32 (eth0)           |      | PERSISTENT | 0         |
|          |         | 10.20.30.254 (eth1)            |      |            |           |
+----------+---------+--------------------------------+------+------------+-----------+
| pc1      | RUNNING | 10.20.30.1 (eth1)              |      | PERSISTENT | 0         |
+----------+---------+--------------------------------+------+------------+-----------+
| pc2      | RUNNING | 10.20.30.2 (eth1)              |      | PERSISTENT | 0         |
+----------+---------+--------------------------------+------+------------+-----------+

L'script utilitzat per a aquesta pràctica és aquest:

#!/bin/bash
 
#                  --------- 
#                  |  DNS2 |  
#                  ---------  
#                          \             ----------
#                       /switch1/--------|Firewall|
#                         /    \         ----------
#                  ---------    -----------
#                  |DNS1   |    |  PC1-2  |
#                  ---------    -----------
#
 
lxc profile create xarxa
lxc profile set xarxa security.privileged true
 
 
lxc launch images:alpine/3.6/amd64 firewall 
lxc launch images:alpine/3.6/amd64 pc1  --profile=xarxa
lxc launch images:alpine/3.6/amd64 pc2  --profile=xarxa

lxc launch ubuntu:16.04 dns1 --profile=xarxa
lxc launch ubuntu:16.04 dns2 --profile=xarxa
 
apt update
apt install bridge-utils 
 
echo "#Configuracio" > /etc/network/interfaces.d/99-conf.cfg 
for i in {1..2}
do
	echo -e "\n\nauto switch$i\niface switch$i inet static\naddress 192.168.99.$i\nnetmask 255.255.255.0\nbridge-ports none" >> /etc/network/interfaces.d/99-conf.cfg
brctl addbr switch$i
ifup switch$i
done
 
lxc config device add firewall eth1 nic nictype=bridged parent=switch1 name=eth1
 
lxc config device add pc1 eth1 nic nictype=bridged parent=switch1 name=eth1
lxc config device add pc2 eth1 nic nictype=bridged parent=switch1 name=eth1
 
lxc config device add dns1 eth1 nic nictype=bridged parent=switch1 name=eth1
lxc config device add dns2 eth1 nic nictype=bridged parent=switch1 name=eth1

lxc exec pc1 -- sh -c 'echo -e "\n\nauto eth1\niface eth1 inet static\naddress 10.20.30.1\nnetmask 255.255.255.0\ngateway 10.20.30.254" >> /etc/network/interfaces'
lxc exec pc2 -- sh -c 'echo -e "\n\nauto eth1\niface eth1 inet static\naddress 10.20.30.2\nnetmask 255.255.255.0\ngateway 10.20.30.254" >> /etc/network/interfaces'
lxc exec firewall -- sh -c 'echo -e "\n\nauto eth1\niface eth1 inet static\naddress 10.20.30.254\nnetmask 255.255.255.0" >> /etc/network/interfaces'
lxc exec dns1 -- bash -c 'echo -e "\n\nauto eth1\niface eth1 inet static\naddress 10.20.30.100\nnetmask 255.255.255.0\ngateway 10.20.30.254" >> /etc/network/interfaces'
lxc exec dns2 -- bash -c 'echo -e "\n\nauto eth1\niface eth1 inet static\naddress 10.20.30.200\nnetmask 255.255.255.0\ngateway 10.20.30.254" >> /etc/network/interfaces'
lxc exec pc1 -- reboot 
lxc exec pc2 -- reboot 
lxc exec firewall -- reboot 
lxc exec dns1 -- reboot 
lxc exec dns2 -- reboot 
sleep 10
lxc exec firewall -- apk update
lxc exec firewall -- apk add iptables
lxc exec firewall -- iptables -A FORWARD -j ACCEPT
lxc exec firewall -- iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
lxc exec firewall -- rc-update add iptables 
lxc exec firewall -- /etc/init.d/iptables save

Instal·lació del servidor DNS

 # apt update
 # apt install bind9

Configuració del dns1 com a servidor primari i mestre

El primer que s'ha de fer és decidir el seu comportament com a servidor DNS:

 # vi /etc/bind/named.conf.options 

Per defecte, quan s'instal·la, el servidor DNS Bind9 és un servidor de noms d'una zona i no fa forwarding. Es pot descomentar e indicar la llista de servidors als que consultarà.

Per defecte és un servidor caché dels noms que resol. Per a resoldre noms, al no ser forwarder, consulta als servidors arrel.

En el nostre cas, hem tingut que comentar la línia del dnssec, ja que no anem a configurar-lo per defecte.

També necessitem afegir una línia per permetre les consultes externes: allow-query { any; };

Abans de fer res, es pot comprovar el seu correcte funcionament amb dig:

dig @127.0.0.1 www.upv.es 

Si la resposta és correcta, el servidor de noms sap consultar als servidors arrel i fer de caché.

La primera zona:

Els nostre servidor dns1 serà primari i mestre de la zona solar.com. Aquesta seria la configuració inicial de named.conf.local:

zone "30.20.10.in-addr.arpa" {
  type master;
  file "/etc/bind/db.30.20.10";
  };
zone "solar.com." {
  type master;
  file "/etc/bind/db.solar.com";
  };

I el contingut tant de db.solar.com com de db.30.20.10:

$ttl 38400
solar.com.  IN     SOA   sol.solar.com. kepler.solar.com. (
              345325 ; Serie
              10800  ; Refresc
              3600   ; Retry
              604800 ; Expire
              38400 ) ; Negative ttl
solar.com.       	IN NS     sol.solar.com.
solar.com.		IN NS     galileo.solar.com.
sol.solar.com.		IN A      10.20.30.100
galileo.solar.com.	IN A      10.20.30.200
dns1.solar.com.	        IN CNAME  sol.solar.com.
dns2.solar.com.	        IN CNAME  galileo.solar.com.
mail.solar.com.		IN MX 10  sol.solar.com.
www.solar.com		IN CNAME  10.20.30.100  # No funcionarà, el CNAME necessiten un nom
solar.com		IN CNAME  10.20.30.100
mercurio		IN CNAME  sol
venus			IN CNAME  galileo
tierra			IN A      10.20.30.1
luna			IN CNAME  tierra
marte			IN A	  10.20.30.2
phobos			IN CNAME  marte

Inversa:

$ttl 38400
@  IN     SOA   sol.solar.com. kepler.solar.com. (
              345325 ; Serie
              10800  ; Refresc
              3600   ; Retry
              604800 ; Expire
              38400 ) ; Negative ttl
@		       	IN NS     sol.solar.com.
@			IN NS     galileo.solar.com.
100			IN PTR	  sol.solar.com.
200                     IN PTR    galileo.solar.com.
1			IN PTR	  tierra.solar.com.
2			IN PTR    marte.solar.com.

Com es pot veure, algunes línies tenen el FQDN i altre sols el nom relatiu de la màquina o la @ per indicar el domini.

A continuació, cal configurar el servidor dns2 com a secundari.

Configuració del dns2 com a servidor secundari i slave

Cal instal·lar el servidor i fer el mateix en named.conf.options.

A continuació, cal indicar en named.conf.local, que és un servidor esclau i que depén del mestre:

zone "30.20.10.in-addr.arpa" {
  type slave;
  file "/var/cache/bind/slave/db.30.20.10";
  masters { 10.20.30.100; };
  };
zone "solar.com." {
  type slave;
  file "/var/cache/bind/slave/db.solar.com";
  masters { 10.20.30.100; };
  };

Com es pot veure, el fitxer el guarda en el directori slave. Aquest ha sigut creat i és propietari l'usuari bind. També es pot guardar en /var/named/

En el servidor mestre (dns1), també cal indicar quins servidors te com a esclaus:

zone "30.20.10.in-addr.arpa" {
  type master;
  file "/etc/bind/db.30.20.10";
  allow-transfer { 10.20.30.200; };
  };
zone "solar.com." {
  type master;
  file "/etc/bind/db.solar.com";
  allow-transfer { 10.20.30.200; };
  };

Configuració de subdominis

Anem a suposar que el nostre servidor gestiona una altra zona. Ja de pas, anem a fer que el servidor dns2 siga aquesta vegada el servidor mestre. Aquesta zona té un domini amb subdominis. En l'exemple anterior, els noms formaven part directament del domini que dona nom a la zona. En aquest exemple, hi ha noms en el domini, subdominis i noms del subdomini.

Subdominis En el mateix servidor

L'opció més senzilla és fer subdominis en el mateix servidor. Sols cal indicar la direcció completa, relativa o fer ús de la variable $ORIGIN.

Aquesta serà la part del domini en el servidor dns2:

zone "elements.es" {
  type master;
  file "/etc/bind/db.elements.es";
}

I aquest és el fitxer db.elements.es:

$ttl 38400
@  IN     SOA   ns.elements.es. atom.elements.es. (
              345325 ; Serie
              10800  ; Refresc
              3600   ; Retry
              604800 ; Expire
              38400 ) ; Negative ttl
@	       	IN NS     ns.elements.es.
@		IN NS     ns2.elements.es.
ns		IN A      10.20.30.200
ns2		IN A      10.20.30.100
radon.gas	IN A 	  10.20.30.254

; Subdomini gas.elements.es.
$ORIGIN gas.elements.es.
helium			IN A 	  10.20.30.1   ; Equivalent a helium.gas.elements.es.
argon.gas.elements.es.   IN A	  10.20.30.2

Subdominis per Delegació

Anem a fer un altre exemple de subdomini per delegació. En aquest cas, el dns1 és master del domini i el dns2 es master del subdomini. No anem a fer que siguen un esclau de l'altre per no liar més la configuració.

Aquest seria el fragment de named.conf.local de dns1:

zone "beer.de."{
  type master;
  file "/etc/bind/db.beer.de";
};

El fitxer db.beer.de:

$ttl 38400
@  IN     SOA   dns1.beer.de homer.beer.de. (
              345325 ; Serie
              10800  ; Refresc
              3600   ; Retry
              604800 ; Expire
              38400 ) ; Negative ttl
@	       		IN NS     dns1.beer.de.
dns1			IN A      10.20.30.100
nspilsen	 	IN A      10.20.30.200

$ORIGIN pilsen.beer.de.
@                       IN NS dns1.pilsen.beer.de.
dns1                    IN A  10.20.30.200

Com es veu, és necessari indicar la IP del servidor de noms al que se delega. Eixa és la Glue.

El named.conf.local en dns2:

zone "pilsen.beer.de"{
  type master;
  file "/etc/bind/db.pilsen.beer.de";
};

I el db.pilsen.beer.de en dns2:

$ttl 38400
@  IN     SOA   nspilsen.pilsen.beer.de homer.beer.de. (
              345325 ; Serie
              10800  ; Refresc
              3600   ; Retry
              604800 ; Expire
              38400 ) ; Negative ttl
@	       		IN NS     dns1.pilsen.beer.de.
dns1    	 	IN A      10.20.30.200
amstel			IN A 	  10.20.30.1
mahou			IN A 	  10.20.30.2

Reenviament de consultes

Imaginem que sabem quin és el servidor DNS de empresa1.com. Podem reenviar directament la consulta a eixa zona a la IP del DNS corresponent.

zone "empresa1.com" {
  type forward;
  forward only;
  forwarders { 10.0.1.101; 10.0.1.102; };
};

Configuració final

named.conf.local de dns1:

zone "30.20.10.in-addr.arpa" {
  type master;
  file "/etc/bind/db.30.20.10";
  allow-transfer { 10.20.30.200; };
  };
zone "solar.com." {
  type master;
  file "/etc/bind/db.solar.com";
  allow-transfer { 10.20.30.200; };
  };
zone "elements.es." {
  type slave;
  file "/var/cache/bind/slave/db.elements.es";
  masters { 10.20.30.200; };
};
zone "beer.de."{
  type master;
  file "/etc/bind/db.beer.de";
};

db.solar.com en dns1:

$ttl 38400
solar.com.  IN     SOA   sol.solar.com. kepler.solar.com. (
              345325 ; Serie
              10800  ; Refresc
              3600   ; Retry
              604800 ; Expire
              38400 ) ; Negative ttl
solar.com.       	IN NS     sol.solar.com.
solar.com.		IN NS     galileo.solar.com.
sol.solar.com.		IN A      10.20.30.100
galileo.solar.com.	IN A      10.20.30.200
dns1.solar.com.	        IN CNAME  sol.solar.com.
dns2.solar.com.	        IN CNAME  galileo.solar.com.
mail.solar.com.		IN MX 10  sol.solar.com.
www.solar.com		IN CNAME  10.20.30.100
solar.com		IN CNAME  10.20.30.100
mercurio		IN CNAME  sol
venus			IN CNAME  galileo
tierra			IN A      10.20.30.1
luna			IN CNAME  tierra
marte			IN A	  10.20.30.2
phobos			IN CNAME  marte

db.30.20.10 en dns1 (es poden fer tants PTR com CNAME, en aquest cas no estan tots):

$ttl 38400
@  IN     SOA   sol.solar.com. kepler.solar.com. (
              345325 ; Serie
              10800  ; Refresc
              3600   ; Retry
              604800 ; Expire
              38400 ) ; Negative ttl
@		       	IN NS     sol.solar.com.
@			IN NS     galileo.solar.com.
100			IN PTR	  sol.solar.com.
200                     IN PTR    galileo.solar.com.
1			IN PTR	  tierra.solar.com.
1			IN PTR	  luna.solar.com.
1			IN PTR	  tierra.solar.com.
1			IN PTR	  helium.gas.elements.es.
1			IN PTR	  amnstel.pilsen.beer.de.
2			IN PTR    marte.solar.com.

named.conf.local de dns2:

zone "30.20.10.in-addr.arpa" {
  type slave;
  file "/var/cache/bind/slave/db.30.20.10";
  masters { 10.20.30.100; };
  };
zone "solar.com." {
  type slave;
  file "/var/cache/bind/slave/db.solar.com";
  masters { 10.20.30.100; };
  };
zone "elements.es" {
  type master;
  file "/etc/bind/db.elements.es";
  allow-transfer { 10.20.30.100; };
};
zone "pilsen.beer.de"{
  type master;
  file "/etc/bind/db.pilsen.beer.de";
};

db.elements.es en dns2:

$ttl 38400
@  IN     SOA   ns.elements.es. atom.elements.es. (
              345325 ; Serie
              10800  ; Refresc
              3600   ; Retry
              604800 ; Expire
              38400 ) ; Negative ttl
@	       	IN NS     ns.elements.es.
@		IN NS     ns2.elements.es.
ns		IN A      10.20.30.200
ns2		IN A      10.20.30.100
radon.gas	IN A 	  10.20.30.254

; Subdomini gas.elements.es.
$ORIGIN gas.elements.es.
helium			IN A 	  10.20.30.1   ; Equivalent a helium.gas.elements.es.
argon.gas.elements.es.   IN A	  10.20.30.2

db.beer.de en dns1:

$ttl 38400
@  IN     SOA   dns1.beer.de homer.beer.de. (
              345325 ; Serie
              10800  ; Refresc
              3600   ; Retry
              604800 ; Expire
              38400 ) ; Negative ttl
@	       		IN NS     dns1.beer.de.
dns1			IN A      10.20.30.100
nspilsen	 	IN A      10.20.30.200

$ORIGIN pilsen.beer.de.
@			IN NS nspilsen.beer.de.

db.pilsen.beer.de en dns2 (delegació):

$ttl 38400
@  IN     SOA   nspilsen.pilsen.beer.de homer.beer.de. (
              345325 ; Serie
              10800  ; Refresc
              3600   ; Retry
              604800 ; Expire
              38400 ) ; Negative ttl
@	       		IN NS     nspilsen.pilsen.beer.de.
nspilsen	 	IN A      10.20.30.200
amnstel			IN A 	  10.20.30.1
mahou			IN A 	  10.20.30.2

Enllaços