Servidor DNS sencillo con dnsmasq

El paquete dnsmasq permite poner en marcha un servidor DNS y un servidor DHCP de una forma muy sencilla. Simplemente instalando y arrancando el servicio dnsmasq, sin realizar ningún tipo de configuración adicional, nuestro PC se convertirá en un servidor caché DNS y además, resolverá los nombres que tengamos configurados en el archivo /etc/hosts de nuestro servidor. La resolución funcionará tanto en sentido directo como en sentido inverso, es decir, resolverá la IP dado un nombre de PC y el nombre del PC dada la IP.

Adicionalmente, dnsmasq dispone de servidor DHCP y permite resolver los nombres de los PCs a los que les ha asignado dirección IP dinámica. Es posible configurar el servidor DHCP añadiendo simplemente una única línea al archivo de configuración, para indicar el rango de cesión. A lo largo de esta sección veremos todas estas posibilidades que nos ofrece dnsmasq.

Dnsmasq es servidor DNS y servidor DHCP a la vez

Instalación del servidor dnsmasq

Para instalar la última versión de dnsmasq, podemos hacerlo con apt-get desde una consola de root:
// Instalación del servidor dnsmasq
sudo apt-get install dnsmasq
De esta forma instalaríamos los programas necesarios para disponer de un sencillo servidor DNS. Tan solo será necesario configurarlo y ponerlo en marcha.

Arranque y parada del servidor dnsmasq

El servicio dnsmasq, al igual que todos los servicios, dispone de scripts de arranque y parada en la carpeta /etc/init.d. Debemos ejecutarlos desde una consola de root.
// Arrancar o reiniciar el servidor dnsmasq
sudo /etc/init.d/dnsmasq restart

// Parar el servidor dnsmasq
sudo /etc/init.d/dnsmasq stop

Para un arranque automático del servicio al iniciar el servidor, debemos crear los enlaces simbólicos correspondientes tal y como se indica en el apartado Trucos > Arranque automático de servicios al inicar el sistema.

Configuración básica de dnsmasq

Para que dnsmasq pueda ser un servidor caché DNS, es necesario que nuestro servidor tenga en el archivo de /etc/resolv.conf configurado al menos un servidor DNS externo. Normalmente los servidores DNS externos nos los proporciona el operador de telecomunicaciones que nos da servicio de Internet. Por ejemplo, Telefónica tiene unos DNSs, Orange tiene otros, ONO tiene otros, Tele2 otros, etc... Aunque podemos utilizar los de cualquier operador, lo mejor es configurar los del nuestro, porque responderá más rápido.
Servidores DNS de Telefónica:
  • DNS primario 80.58.0.33
  • DNS alternativo (por si falla el primario) 80.58.32.97
Servidores DNS de Orange:
  • DNS primario 62.36.225.150
  • DNS alternativo 62.37.228.20
Servidores DNS de Google:
  • DNS primario 8.8.8.8
  • DNS alternativo 8.8.4.4 
Para que nuestro servidor utilice los DNS externos, debemos añadirlos en /etc/resolv.conf. En el caso de Telefónica, deberemos añadir en /etc/resolv.conf las siguientes líneas:
// Ejemplo: Utilización de los DNS externos de Telefónica
// Añadir en /etc/resolv.conf del servidor
nameserver 80.58.0.33
nameserver 80.58.32.97
Una vez introducidos los DNS externos en /etc/resolv.conf, debemos comprobar si dichos DNS externos funcionan correctamente y responden a las peticiones. Para ello haremos una consulta al DNS mediante el comando nslookup. También podríamos utilizar el comando host o el comando dig:
// Probar DNS externo
// Ejecutar en una consola del servidor
nslookup www.unican.es
Si el DNS funciona, nos dirá cual es la IP del servidor de la Universidad de Cantabria, www.unican.es.

En este punto, ya tendremos en nuestro servidor un servidor DNS caché funcionando. Para probar su funcionamiento, configuraremos el archivo /etc/resolv.conf del resto de los PCs de nuestra red pero en lugar de indicar los DNS de Telefónica, indicaremos el nuestro. Si nuestro servidor tiene la IP 192.168.1.239, lo añadiremos en el archivo /etc/resolv.conf de cada PC:
// Añadir en /etc/resolv.conf del PC cliente
nameserver 192.168.1.239
Al igual que hemos hecho anteriormente, podemos comprobar si nuestro servidor DNS funciona correctamente, haciendo una consulta mediante el comando nslookup:
// Probar nuestro servidor DNS
//Ir al PC cliente, abrir una consola de comandos y ejecutar:
nslookup www.unican.es
Si nuestro servidor DNS funciona, nos responderá con la IP del servidor de la Universidad de Cantabria, pero si nuestro servidor DNS falla, los clientes tendrán problemas de conexión ya que no podrán resolver consultas DNS, por eso es mejor añadir un segundo DNS externo, por ejemplo el de google 8.8.8.8:
// Añadir en /etc/resolv.conf del PC cliente
nameserver 192.168.1.239
nameserver 8.8.8.8
Ahora que ya tenemos el servidor DNS caché funcionando, iremos más allá. El siguiente paso será editar el archivo /etc/hosts de nuestro servidor, para que nuestro DNS resuelva también los nombres y las IPs de nuestra red. Si los PCs de nuestra red disponen de IP fija y queremos que dnsmasq resuelva sus nombres e IPs, tan solo tenemos que añadir los nombres y las IPs en el archivo hosts del servidor y sería como disponer de un DNS maestro para nuestra red:
//Añadir en /etc/hosts del servidor las IPs y los nombres de nuestros PCs
//Se pueden añadir varios nombres en la misma línea. Separar con un tabulador
192.168.1.239 www.ieslapaloma.com proxy www
192.168.1.238 impresora
192.168.1.1 router
192.168.1.101 a1pc1 aula1pc1
192.168.1.102 a1pc2 aula1pc2
192.168.1.103 a1pc3 aula1pc3
192.168.1.104 a1pc4 aula1pc4
192.168.1.105 a1pc5 aula1pc5
192.168.1.106 a1pc6 aula1pc6
192.168.1.107 a1pc7 aula1pc7
192.168.1.108 a1pc8 aula1pc8
192.168.1.109 a1pc9 aula1pc9
192.168.1.110 a1pc10 aula1pc10
Si desde un PC de nuestra red hacemos una consulta al DNS preguntando por otro PC de nuestra red, dnsmasq resolverá en el servidor y devolverá la IP configurada en el archivo hosts del servidor:
// Probar nuestro servidor DNS con nombres de nuestra red
// Ejecutar en una consola del PC cliente
nslookup aula1pc1
Cada vez que modifiquemos el archivo /etc/hosts del servidor, deberemos ejecutar sudo /etc/init.d/dnsmasq restart para reiniciar el servicio dnsmasq y recargue la información contenida en dicho archivo.

De esta manera, tan solo editando el archivo /etc/hosts del servidor, dispondremos de un sencillo servidor DNS para nuestra red lo que nos permitirá referirnos a nuestros PCs utilizando sus nombres que son mucho más fáciles de recordar que las direcciones IP.


Servidor DNS y servidor DHCP

Cuando las IPs de los PCs de nuestra red son dinámicas, se nos presenta un problema para utilizar un servidor DNS ya que el mismo PC, hoy puede tener una IP y mañana puede tener otra IP diferente. Dicho problema se puede resolver de tres formas:

Utilizando un servidor DNS dinámico:
Los PCs, al recibir la IP del servidor DHCP, informarán al servidor DNS dinámico de la IP que les ha sido asignada de forma dinámica y así poder asociar de forma correcta el nombre con la IP que tiene en un momento dado. El inconveniente de este método es que nos obliga a instalar en los PCs un servicio que informe al servidor DNS dinámico de los cambios de IP de cada PC. Es similar al sistema utilizado por los servidores DNS dinámicos de Internet como www.no-ip.org o www.dyndns.com. Aquí no hablaremos de servidores DNS dinámicos porque las dos soluciones siguientes son más sencillas.

Utilizando reservas de DHCP:
En el servidor DHCP existe la posibilidad de establecer una configuración concreta a un cliente concreto identificándolo por la dirección MAC de su tarjeta de red. Si configuramos tantas reservas de IPs como PCs hay en nuestra red, podríamos configurar a cada PC la IP que deseemos. Esto sería como tener IPs fijas en nuestra red, pero asignadas por DHCP. Esta idea no es para nada descabellada y nos permitiría controlar en todo momento la IP de cada PC.

Utilizando el servidor DHCP de dnsmasq:
Dnsmasq, además de ofrecernos un servidor DNS, nos ofrece también un servidor DHCP fácilmente configurable que además resolverá los nombres de los PCs de nuestra red aún cuando sus IPs hayan sido configuradas por DHCP. Para configurar el servidor DHCP de dnsmasq debemos editar el archivo de configuración /etc/dnsmasq.conf y añadir una línea como esta: dhcp-range=ip-inicial,ip-final, tiempo de cesión. Ejemplo, si queremos que el DHCP utilice el rango desde 192.168.1.201 hasta 192.168.1.230 y que la cesión dure 24 horas, editaremos /etc/dnsmasq.conf y añadiremos la siguiente línea:
//Editar /etc/dnsmasq.conf para establecer el rango DHCP
//Añadir la siguiente línea:
dhcp-range=192.168.1.201,192.168.1.230,24h

No es necesario realizar más configuraciones porque dnsmasq proporcionará, además de la IP, la misma máscara que el servidor, la misma puerta de enlace que el servidor y como servidor DNS, enviará la IP del servidor ya que el servidor dnsmasq es también servidor DNS. Cuando los PCs clientes pidan una IP al servidor DHCP, normalmente el cliente suministrará su nombre de PC. Dicho nombre será utilizado por dnsmasq para asociarlo a la IP que le ha sido asignada al PC y así resolver correctamente cualquier consulta DNS.

A medida que el servidor DHCP va concediendo IPs a todos los PCs que se la solicitan, éste va almacenándolas en el archivo de concesiones /var/lib/misc/dnsmasq.leases donde guarda la fecha y la hora de la cesión en formato %s (para información sobre dicho formato, ejecutar el comando: man date) la MAC del cliente, la IP concedida al cliente y el nombre del PC cliente siempre y cuando el cliente haya enviado su nombre de PC.

//Archivo donde aparecen las IPs asignadas a cada PC
/var/lib/misc/dnsmasq.leases
Para que dnsmasq pueda conocer el nombre del cliente, éste deberá enviar su nombre cuando realiza la petición DHCP. En los clientes Linux, el nombre que envía el PC cliente, suele almacenarse en el parámetro send host-name del archivo de configuración del cliente dhcp: /etc/dhcp3/dhclient.conf. Ejemplo, si nuestro PC se llama aula1pc1, deberemos configurarlo en el cliente dhcp:
//Para que el cliente envíe el nombre del PC, debemos
//crear archivo /etc/dhcp3/dhclient.conf con el siguiente contenido:
send host-name aula1pc1

Lo normal es que dicho nombre coincida con el nombre del PC almacenado en el archivo /etc/hostname.

En los siguientes ejemplos podemos ver las posibilidades de configuración DHCP que proporciona dnsmasq. Dichas configuraciones deben realizarse en el archivo /etc/dnsmasq.conf:

#Rango de cesión desde la 50 a la 150, durante 12 horas
dhcp-range=192.168.0.50,192.168.0.150,12h

#Reserva de IPs para asignar siempre la 192.168.0.60 al PC cuya MAC sea 11:22:33:44:55:66
dhcp-host=11:22:33:44:55:66,192.168.0.60

#Asignar nombre aula1pc1 e IP 192.168.0.60 durante 45 minutos, al PC cuya MAC sea 11:22:33:44:55:66
dhcp-host=11:22:33:44:55:66,aula1pc1,192.168.0.60,45m

#Al PC cuya MAC sea 11:22:33:44:55:66 ignorarle (no asignar IP)
dhcp-host=11:22:33:44:55:66,ignore

#Por defecto dnsmasq configura la puerta de enlace de los clientes con la IP del servidor dnsmasq
#Si la puerta de enlace es otra IP, se debe forzar otro router distinto
dhcp-option=3,192.168.1.254

Como dnsmasq dispone de servidor DNS y servidor DHCP, no es necesario instalar otro servidor DCHP ni otro servidor DNS.

Arranque y parada manual del servicio dnsmasq

El servicio dnsmasq, al igual que todos los servicios en Debian, dispone de un script de arranque y parada en la carpeta /etc/init.d

// Arrancar o reiniciar el servicio dnsmasq
sudo /etc/init.d/dnsmasq restart

// Parar el servicio dnsmasq
sudo /etc/init.d/dhcp3-server stop

Arranque automático del servicio dnsmasq al iniciar el sistema.

Para un arranque automático del servicio al iniciar el servidor, debemos crear los enlaces simbólicos correspondientes tal y como se indica en el apartado Varios > Arranque automático de servicios al iniciar el sistema 
Icono de iDevice

Si no arranca dnsmasq

Si dnsmasq no arranca, quizás es porque está arrancado el servidor DHCP dhcp3-server o el servidor DNS bind9. No se pueden levantar dos servidores DHCP ni dos servidores DNS en la misma máquina. Para solucionarlo habrá que parar dhcp3-server y bind9.

Icono de iDevice

Probando dnsmasq con máquinas virtuales

Si deseamos probar dnsmasq con dos máquinas virtuales (un cliente y un servidor), lo mejor es configurar la red de las máquinas virtuales en modo puente (bridge) para que las máquinas virtuales se comporten como dos PCs más de mi red real. En tal caso, habrá que desactivar el servidor DHCP del router ADSL para que la máquina cliente coja la IP de la máquina servidor y no del router ADSL.

Pregunta Verdadero-Falso
Si tenemos dnsmasq en marcha, actuando de servidor DNS y servidor DHCP, ¿resolverá el DNS las IPs de los PCs de la red local que están configurados con IP dinámica?
Verdadero Falso