Escrito el 11 abril 2013 por Luis Ignacio Díaz Martínez
Tabla de contenidos
En el mundo empresarial es muy común encontrarse con una infraestructura informática por lo menos amplia. La red es algo que tenemos que cuidar ya que forma parte imprescindible del trabajo diario.
Si tenemos en nuestra área local más de 25 equipos tendríamos que tener un servidor DHCP y un servidor DNS en buen funcionamiento ( no obstante ya existen equipos con estos servicios embebidos como la mayoría de routers ).
La importancia de hacerlo con GNU/Linux es que tenemos más flexibilidad y a la vez más potencia para ejecutar según que cosas. En mi caso me he quedado corto en los equipos los cuales me ofrecían dichos servicios.
Así que manos a la obra! que no se diga que somos nosotros mismos los que nos cortamos nuestras alas!
Estoy operando actualmente con un servidor Dell PowerEdge T110 con:
Esas tarjetas de red están conectadas:
El servidor DHCP que montaremos dará direcciones IP a la red local.
Principalmente vamos a tener que instalar los siguientes paquetes:
1 |
apt-get install dhcp3-server bind9 |
Así que bueno… a instalar!
Tenemos que configurar la dirección IP tanto local como externa de forma estática ya que al tratarse de un servidor no pueden ser variables por lo tanto la configuración tiene que ser algo parecido a esta:
1 |
nano /etc/network/interfaces |
Que contiene:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# The loopback network interface auto lo iface lo inet loopback #Conexión a Internet auto eth1 iface eth1 inet static address 192.168.0.45 netmask 255.255.255.0 gateway 192.168.0.1 #Red local principal auto eth2 iface eth2 inet static address 172.16.0.15 netmask 255.255.0.0 iface eth2:1 inet static address 172.16.5.45 netmask 255.255.255.0 |
Como podemos observar tan solo tenemos un gateway que sencillamente es el que tiene la salida Internet! ir con cuidado… si no la máquina no sabrá por donde tiene que ir…
Para que el servidor que estamos montando funcione como puerta de enlace es muy importante ejecutar lo siguiente:
1 2 |
echo "1" > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE |
Lo que realizamos con lo anterior es activar el «ip_forward» que nos servirá para realizar reenvios de de IP ( como su nombre indica ) o más bien enrutamientos dinámicos.
Después la siguiente regla «da a conocer» la red «eth1» al resto de los equipos, permitiendo así el reenvío de tráfico de una red a otra.
Pasaremos a la parte más divertida .. la configuración! veremos algunos conceptos básicos y algunos algo más avanzados que se intentarán explicar con claridad….
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#Opciones DNS #ddns-update on; #Tipo de DNS y LOG authoritative; log-facility local7; shared-network RedLocal { subnet 172.16.0.0 netmask 255.255.0.0 {} subnet 172.16.5.0 netmask 255.255.255.0 { option routers 172.16.5.45; option subnet-mask 255.255.255.0; option broadcast-address 172.16.5.255; option domain-name-servers 192.168.0.45, 8.8.8.8; pool{ default-lease-time 600; max-lease-time 7200; range 172.16.5.100 172.16.5.200; } include "/etc/dhcp/config/host-fix_172.16.5"; } } |
Como podemos ver tenemos diferentes campos en la configuración del fichero principal… vamos a explicar los conceptos más generales.
La zona comentada como «Opciones DNS» la vamos a ver más tarde así que de esta no hablaré.
La zona comentada como «Tipo de DNS y LOG» sencillamente indica el tipo de DNS en el cual indicamos que será de tipo autoritativo la cual cosa quiere decir que ofrecerá los registros a las zonas de menor nivel ( o concedidas ). Y el otro campo tan solo quiere decir donde va a ir a parar el log!
Ahora llegamos a la zona importante de shared-network donde este parámetro es opción cosa que he querido introducir por si en un futuro tengo que realizar alguna que otra modificación en ACL’s.
Por lo tanto podemos ver que dentro de shared-network se encuentra el campo subnet donde se definirá la configuración la cual contendrá esa red.
Por defecto vemos que tenemos una red con IP de nivel B con una mascara de 16 bits la cual cosa está vacía porqué no quiero que se utilice… y por debajo de esta vemos que hay otra IP de nivel B con una mascara de 24 bits ( por lo tanto contiene subredes ) y sus configuraciones… las cuales creo que se sobreentienden bien.
El pool indicará la configuración de red que otorgará al cliente que lo pida!
Si nos fijamos en el fichero principal anterior podemos observar que tenemos un include que hace referencia al fichero «host-fix_172.16.5». Este fichero hace referencia a las máquinas que tendrán una dirección IP reservada, queriendo decir con esto que serán tan solo para ellos, a esto se le denomina DHCP de tipo estático.
El fichero en cuestión es el siguiente:
1 |
nano /etc/dhcp/config/host-fix_172.16.5 |
Que contiene el ejemplo:
1 |
host h1 { hardware ethernet 00:21:85:DC:C3:D0; fixed-address 172.16.5.112; } |
Esto nos facilitará más adelante insertar nuevos equipos sin variar la configuración del fichero principal. Por ejemplo, si queremos utilizar un script para añadir nuevas máquinas lo podremos hacer de forma sencilla sin afectar a la configuración más importante.
En un futuro pienso crear un script ( como indico en un apartado dentro de este mismo artículo ) donde me mostrará el listado de máquinas que se encuentran activas… pero claro! hasta entonces… la única solución que he encontrado es la siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
root@Zion:/etc/bind# cat /var/lib/dhcp/dhclient.leases lease { interface "eth1"; fixed-address 172.16.5.209; option subnet-mask 255.255.255.0; option dhcp-lease-time 259200; option routers 172.16.0.1; option dhcp-message-type 5; option dhcp-server-identifier 172.16.0.1; option domain-name-servers 172.16.0.1; option ntp-servers 172.16.0.1; option netbios-name-servers 172.16.0.1; option domain-name "DOMINIO"; renew 5 2013/04/05 21:41:19; rebind 0 2013/04/07 06:32:12; expire 0 2013/04/07 15:32:12; } |
Donde podemos observar toda la información del equipo!
Prometo aportar algún que otro dato extra referente a este apartado…
Cuando trabajamos con una red relativamente grande ( más de 50 máquinas por ejemplo ) necesitamos de un servidor DNS que nos ofrezca la posibilidad de relacionar una dirección IP con un nombre… para así poder tener controladas y localizadas cada una de las máquinas que forman nuestra área local.
Si configuramos de forma correcta Bind9 y DHCP podemos conseguir un tipo de direccionamiento dinámico de nombres… eso quiere decir que cuando una máquina obtenga una dirección IP por medio del servicio DHCP este lo registrará también en el DNS facilitando así al resto de la red la comunicación con el equipo por medio del nombre.
Primero tendríamos que editar el fichero de configuración «resolvconf» para que escuche tan solo nuestras peticiones…
1 |
nano /etc/resolv.conf |
Que contendrá tan solo esto:
1 2 3 |
search dominio.net nameserver 127.0.0.1 nameserver 172.16.0.15 |
Voy a modificar las rutas de los ficheros que por defecto trae bind9 sencillamente para hacerlo algo más ordenado y sobretodo lógico ya que al ser dinámico empieza a generar ficheros… y luego nadie se entera!
Necesitaremos crear un directorio «config» donde estará toda la configuración y un directorio db donde estará la base de datos:
1 2 |
mkdir /etc/bind/config/ mkdir /etc/bind/db/ |
Ahora moveremos los ficheros:
1 2 3 4 5 |
cd /etc/bind/ mv db.* db/ mv named.conf.* config/ cd config/ rename s/named.conf.// * |
Por lo tanto tendríamos que tener algo parecido a esto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/etc/bind/ ├── bind.keys ├── config │ ├── default-zones │ ├── local │ └── options ├── db │ ├── db.0 │ ├── db.127 │ ├── db.172.16.5 │ ├── db.255 │ ├── db.empty │ ├── db.local │ ├── db.root │ ├── db.dominio │ └── zones.rfc1918 ├── named.conf └── rndc.key |
Si puede ser… tendríamos que tener algo así!
Vamos a ver ahora la configuración del fichero principal llamado «named.conf» que podemos encontrar en:
1 |
cat /etc/bind/named.conf |
Que contiene:
1 2 3 4 |
include "/etc/bind/rndc.key"; include "/etc/bind/config/options"; include "/etc/bind/config/local"; include "/etc/bind/config/default-zones"; |
Como podemos ver el fichero principal tan solo contiene inclusiones a los ficheros de configuración y a la clave de comunicación «rndc.key».
Por lo tanto este fichero no lo tendríamos que tocar a no ser que queramos incluir alguna otra «libreria».
Necesitamos principalmente que Bind9 acepte las peticiones y control desde otra aplicación externa… como tanto el servidor DNS como el DHCP se encuentran en «localhost» nos resultará bastante sencillo realizar esta acción editando el siguiente fichero de configuración y añadiendo al final de todo esto:
1 |
nano /etc/bind/config/options |
Quedando el fichero así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
options { directory "/var/cache/bind"; dump-file "/var/cache/bind/cache_dump.db"; forwarders { 8.8.8.8; 208.67.222.222; }; auth-nxdomain no; listen-on-v6 { any; }; }; controls { inet 127.0.0.1 allow { localhost; } keys { "rndc-key"; }; }; |
Ahora vamos a configurar una zona local que acepte las modificaciones externas… para ello vamos a editar el fichero «local» dentro del directorio «config» como podemos ver a continuación:
1 |
nano /etc/bind/config/local |
Con el contenido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
zone "dominio.net" { type master; file "/etc/bind/db.dominio"; allow-update { key "rndc-key"; }; notify yes; }; zone "5.16.172.in-addr.arpa" { type master; file "/etc/bind/db.172.16.5"; allow-update { key "rndc-key"; }; notify yes; }; include "/etc/bind/rndc.key"; |
En el caso que quisiéramos añadir otros dominios realizaríamos lo mismo pero cambiando el nombre del dominio ( junto con el fichero de la base de datos ) y la dirección inversa…
Antes hemos configurado las zonas que tendrá nuestro servidor DNS ahora tendríamos que agregar las bases de datos ( si nos fijamos indicamos un fichero donde irá a buscar dicha configuración ) por lo tanto siguiendo las referencias anteriores vamos a crear estos ficheros:
1 2 |
touch /etc/bind/db/db.dominio touch /etc/bind/db/db.172.16.5 |
En el cual cada uno de ellos tendrá lo siguiente:
1 |
nano /etc/bind/db.dominio |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ORIGIN . $TTL 10800 ; 3 hours dominio.net IN SOA ns1.dominio.net. root.dominio.net. ( 2012040233 ; serial 900 ; refresh (15 minutes) 900 ; retry (15 minutes) 604800 ; expire (1 week) 3600 ; minimum (1 hour) ) NS ns1 A 127.0.0.1 $ORIGIN dominio.net. ns1 A 127.0.0.1 zion CNAME ns1 |
1 |
nano /etc/bind/db.172.16.5 |
1 2 3 4 5 6 7 8 9 10 11 |
$ORIGIN . $TTL 86400 ; 1 day 0.16.172.in-addr.arpa IN SOA ns1.dominio.net. ( 200806327 ; serial 28800 ; refresh (8 hours) 7200 ; retry (2 hours) 2419200 ; expire (4 weeks) 86400 ; minimum (1 day) ) NS ns1.dominio.net. $ORIGIN 0.16.172.in-addr.arpa. |
Como ya he indicado anteriormente en una nota el archivo de clave «rndc.key» nos servirá como llave de acceso entre servicios permitiendo así que DNS y DHCP puedan trabajar juntos.
El fichero tendría que contener lo siguiente:
1 2 3 4 |
key "rndc-key" { algorithm hmac-md5; secret "<strong>lgkbhjrtthltlgptl6567==</strong>"; }; |
Realmente esto es una solución a un error retornado… que indicaba que este archivo no fué creado correctamente… así que lo he creado a mano!
1 |
touch /var/cache/bind/managed-keys.bind |
Más tarde veremos que permisos tendría que tener este permiso.
Ahora tenemos que hacer unas modificaciones a nuestro fichero de configuración DHCP para que funcione conjunto el servicio de DNS… por lo tanto editamos el fichero y lo dejamos así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#Opciones DNS ddns-updates on; ddns-update-style interim; ddns-domainname "dominio.net."; ddns-rev-domainname "in-addr.arpa."; ignore client-updates; #Communication zone zone dominio.net. { primary 127.0.0.1; key rndc-key; } #Tipo de DNS y LOG authoritative; log-facility local7; shared-network RedLocal { subnet 172.16.0.0 netmask 255.255.0.0 {} subnet 172.16.5.0 netmask 255.255.255.0 { option routers 172.16.5.45; option subnet-mask 255.255.255.0; option broadcast-address 172.16.5.255; option domain-name-servers 192.168.0.45, 8.8.8.8; pool{ default-lease-time 600; max-lease-time 7200; range 172.16.5.100 172.16.5.200; ddns-domainname "dominio.net"; ddns-rev-domainname "in-addr.arpa"; } include "/etc/dhcp/config/host-fix_172.16.5"; } } |
Podemos ver que al principio del documento hemos introducido las líneas pertinentes a la comunicación con el servidor de DNS.
También podemos observar que el pool{} de la subred tiene asignado los campos de ddns-domainname y ddns-rev-domainname cosa importante a tener en cuenta.
La verdad es que he tenido muchos problemas y todos por culpa de la falta de permisos! para ello de momento les he asignado permisos muy grandes y la verdad es que son poco seguros pero bueno… de momento necesarios. Para ello vamos a realizar lo siguiente:
1 2 |
chown -R root:bind /etc/bind chmod -R 2775 /etc/bind |
Con eso no tendríamos que tener ningún problema…
Ahora vamos a reiniciar los servicios para cargar y comprobar la nueva configuración…
1 2 3 4 5 |
root@Zion:/etc/bind# /etc/init.d/bind9 restart Stopping domain name service...: waiting for pid 26910 to die. Starting domain name service...: bind9. root@Zion:/etc/bind# /etc/init.d/bind9 status bind9 is running. |
1 2 3 4 5 6 |
root@Zion:/etc/bind# /etc/init.d/isc-dhcp-server restart Stopping ISC DHCP server: dhcpd. Starting ISC DHCP server: dhcpd. root@Zion:/etc/bind# /etc/init.d/isc-dhcp-server status Status of ISC DHCP server: dhcpd is running. |
Como podemos observar aparentemente no tenemos ningún error… pero aconsejo mirar el registro de eventos de nuestro sistema ( /var/log/syslog ) donde podremos encontrar algún que otro error… la verdad, es que para realizar este artículo me he tirado muchas horas revisando y corrigiendo fallos gracias a este fichero.
Vamos a realizar a continuación ciertas pruebas para comprobar que nuestro servidor DNS está funcionando de forma correcta.
Para ello primero vamos a utilizar el comando nslookup que nos devolverá algunos datos básicos entre ellos el nombre del host y la dirección ip.
1 2 3 4 5 6 |
root@Zion:/etc/bind# nslookup pepe Server: 127.0.0.1 Address: 127.0.0.1#53 Name: pepe.dominio.net Address: 172.16.5.112 |
Esto es importante! cuando nosotros marcamos «pepe» el sobreentiende que estará dentro del dominio y por lo tanto realizará la búsqueda conjunto el dominio!
Como podemos ver… funciona correctamente!
ToDo ( pendiente )
Tengo pendiente desarrollar unos script que me automaticen una serie de procesos que realizo o realizaré de forma constante.