6.1. La biblioteca de resolución

Cuando hablamos del sistema de resolución, no nos referiremos a una aplicación en particular, sino a la biblioteca de resolución: un conjunto de funciones que pueden encontrarse en las bibliotecas estándar del lenguaje C. Las rutinas principales son gethostbyname(2) y gethostbyaddr(2), que buscan la dirección IP de una máquina a partir del nombre y viceversa. Es posible configurarlas para que simplemente miren en el fichero hosts local (o remoto, si se usa NIS).

Las funciones del sistema de resolución leen ficheros de configuración cuando son llamadas. Desde estos ficheros, determinan qué bases de datos hay que interrogar, en qué orden y otros detalles relevantes. En la antigua biblioteca libc de GNU/Linux, se utilizaba el fichero /etc/host.conf como fichero maestro, pero en la versión 2 de las bibliotecas, la glibc, se utiliza el fichero /etc/nsswitch.conf. Vamos a describir ambas formas, puesto que son muy usuales.

6.1.1. El fichero host.conf

El fichero host.conf se encuentra en el directorio /etc e indica al sistema de resolución qué servicios debe usar y en qué orden.

Las opciones del fichero host.conf deben estar en líneas distintas. Los campos deben separarse por blancos (espacios o tabuladores). Un símbolo almohadillado (#) supone desde ese punto hasta el final de la línea un comentario del fichero. Las opciones disponibles son las siguientes:

order

Determina el orden en el que los servicios de resolución se usan. Opciones válidas son bind para usar el servidor de nombres, /etc/hosts para buscar en /etc/hosts y nis para buscar con NIS. Puede especificarse cualquiera de las anteriores, y el orden de aparición determina qué servicio se prueba en primer lugar para intentar resolver el nombre.

multi

Va con las opciones on u off. Determina si una máquina del fichero /etc/hosts puede tener distintas direcciones IP o no. Esta opción no tiene efecto en peticiones via NIS o DNS.

nospoof

Como se explicó en la sección Sección 6.2.4, ” DNS le permite encontrar un nombre de máquina perteneciente a una dirección IP utilizando el dominio in-addr.arpa. Los intentos de los servidores de nombres de proporcionar un nombre falso se conocen en inglés como spoofing[1]. Para evitar esto, el sistema puede configurarse para comprobar si las direcciones IP originales están de hecho asociadas con el nombre obtenido. Si no, el nombre será rechazado y se retornará un error. Esta opción se activa poniendo nospoof on.

alert

Esta opción puede tomar el valor on u off como argumentos. Si se activa, cualquier intento de spoof será anotado con un mensaje enviado al sistema de registros syslog.

trim

Esta opción lleva un nombre de dominio como argumento, que se quitará a los nombres antes de buscar su dirección. Es útil para las entradas del fichero hosts, que podrán así ir solos los nombres de máquinas, sin el dominio. Cuando se busque una máquina con el nombre de dominio local éste será eliminado, haciendo que la búsqueda en el fichero /etc/hosts tenga éxito. El dominio que añada debe terminar en un punto (.) (por ejemplo, linux.org.au.).

Las opciones de trim se van acumulando; podemos considerar nuestra máquina como local de diversos dominios.

Veamos un fichero de ejemplo para vlager en Ejemplo 6-1.

6.1.2. El fichero nsswitch.conf

La versión 2 de la biblioteca estándar de funciones de GNU incluye un fichero más flexible para sustituir a host.conf. El concepto de servicio de nombres se ha extendido para incluir una variedad de diferentes tipos de información. Las opciones para seleccionar las bases de datos a las que interrogar se han introducido todas en un fichero, que se llama nsswitch.conf.

El fichero nsswitch.conf permite al administrador de sistemas configurar una amplia variedad de diferentes bases de datos. Limitaremos nuestra discusión a opciones que se refieran a la resolución de nombres de máquina y direcciones IP. Se puede encontrar fácilmente mucha más información para aprovechar el resto de las características de este fichero, sin más que leer la documentación de la biblioteca estándar GNU.

Las opciones del fichero nsswitch.conf deben estar en líneas diferentes. Los campos se separan por blancos (espacios o tabuladores). Un signo de almohadillado (#) introducirá un comentario para todo el resto de esa línea. Cada línea describe un servicio en particular; la resolución de nombres es uno de ellos. El primer campo de cada línea es el nombre de la base de datos, finalizado en el signo de dos puntos. La base de datos relacionada con la resolución es hosts. Una base de datos relacionada es networks, que se usa para convertir nombres en direcciones de redes. El resto de cada línea lleva opciones que determinan cómo se hacen las búsquedas de los elementos de la base de datos.

Las opciones posibles son:

El orden en el que los servicios estén listados es el orden en el que serán interrogados para buscar un nombre. Es decir, los servicios son interrogados leyéndolos de izquierda a derecha, hasta encontrar la respuesta.

Un ejemplo de fichero nsswitch.conf lo tenemos en Ejemplo 6-2.

Este ejemplo hace que el sistema busque los nodos, primero en el DNS y después en /etc/hosts, si no se encuentra. En cambio las redes se buscan exclusivamente en /etc/networks.

Podemos controlar el comportamiento más precisamente, usando “items de acción” que describen qué hacer tras el último intento de búsquedas. Los items de acción aparecen entre los servicios, y se encierran entre corchetes, [. La sintaxis general es:
    [ [!] estado = acción ... ]

Hay dos posibles acciones:

El carácter opcional (!) especifica que el valor de estado debe considerarse invertido antes de comprobarlo, es decir, es un “not.”

Los valores de estado posible son:

Un ejemplo de uso de todo esto se muestra en Ejemplo 6-3.

Este ejemplo intentará resolver los nodos usando el DNS. Si se devuelve un error que no sea UNAVAIL, el sistema devolverá lo que ha encontrado. En otro caso intentará buscarlo en /etc/hosts. Esto significa que este fichero solo se usará en caso de que el DNS no funcione bien.

6.1.3. Configuración del fichero resolv.conf

Cuando se configura la biblioteca de resolución para utilizar los servicios de BIND, tiene que indicarse también qué servidores utilizar. El fichero resolv.conf contiene una lista de servidores, que si está vacía hará considerar al sistema que el servidor está en su máquina.

Si ejecuta un servidor de nombres en su máquina local, tendrá que configurarlo por separado, como se explicará después. Si se encuentra en una red local y puede usar un servidor de nombres existente, mejor. Si estamos conectados a Internet por módem, lo habitual es especificar en resolv.conf el servidor de nombres que nos diga nuestro proveedor de servicios.

La opción más importante del fichero resolv.conf es nameserver, que tiene la dirección IP del servidor de nombres a usar. Si especifican varios servidores poniendo varias líneas nameserver, se intentarán usar en el orden dado; por lo que debería poner en primer lugar el servidor de nombres más rápido o cercano. Actualmente, puede ponerse un máximo de tres servidores distintos. Si no se pone ninguno, intentará buscar un servidor de nombres en la máquina local.

Otras dos opciones, domain y search, nos permiten usar nombres cortos (sin dominio) para máquinas que estén en nuestro dominio. Normalmente, para conectarnos a una máquina de la misma red, no queremos poner el dominio completo, sino su nombre. Por ejemplo, gauss en lugar de gauss.mathematics.groucho.edu.

Para esto sirve la palabra domain. Nos permite especificar un dominio predeterminado que se añade a las peticiones cuando su búsqueda inicial falla. Por ejemplo, al buscar gauss y fallar el servidor de nombres buscándolo en Internet, le añade automáticamente su dominio predeterminado y ya sí puede resolverlo.

Esto está bien, pensaremos, pero tan pronto como nos refiramos a una máquina que esté fuera del Departamento de Matemáticas, tendremos que volver a teclear el dominio completo. A lo mejor queremos teclear solo quark.physics para referirnos a una máquina del Departamento de Físicas.

Para esto podemos usar la lista de búsqueda, que puede especificarse con la opción search. En esta lista se especifica una lista de dominios donde resolver nombres cortos. Los elementos de la lista deben especificarse separándolos por espacios o tabuladores.

Las opciones search y domain son mutuamente excluyentes y no pueden aparecer más de una vez. Si ninguna de las dos se pone, el sistema intentará asignar a los nombres cortos el dominio de la máquina local, que averiguará usando la llamada al sistema getdomainname(2). Si el nodo local no tiene dominio, se asumirá que el dominio predeterminado es el raíz.

Si decidimos poner una opción search en el fichero resolv.conf, habrá que ser cuidadosos con los dominios que añadimos a la lista. Las bibliotecas de resolución anteriores a BIND 4.9 solían construir una lista de búsqueda predeterminada para el dominio cuando no se proporciona otra lista. Esta lista predeterminada se hacía con el dominio del nodo, más todos los dominios padre hasta llegar a la raíz. Esto daba lugar a búsquedas innecesarias a los servidores de nombres externos.

Asumamos que estamos en la Cervecera Virtual y queremos conectarnos al sistema foot.groucho.edu. Por un error tecleamos el nombre foo, que no existe. El servidor de la universidad nos responderá que no existe el nodo. Con la búsqueda antigua, intentará buscar ese nombre en los dominios vbrew.com y com. Este último es problemático porque causa una búsqueda innecesaria y además podría existir. Al final nos habremos intentado conectar a una máquina totalmente ajena.

En algunos casos, esto es un potencial problema de seguridad. De hecho las listas de búsqueda deben limitarse a dominios de la organización local o algo similar. La lista en el Departamento de Matemáticas debe limitarse a los dominios maths.groucho.edu y groucho.edu.

Como lo anterior puede resultar confuso, sea el siguiente ejemplo de fichero resolv.conf para la Cervecera Virtual:
    # /etc/resolv.conf
    # Nuestro dominio
    domain         vbrew.com
    #
    # Nuestro servidor principal va a ser vlager:
    name server     172.16.1.1

Cuando se trate de traducir el nombre vale, el sistema empezará por buscar directamente vale y si falla, probará con vale.vbrew.com.

6.1.4. Robustez del sistema de resolución

Si tiene en funcionamiento una red local dentro de otra más grande, deberá usar servidores de nombres principales siempre que sea posible. La ventaja de hacerlo así es que se consiguen generosas memorias caché, ya que todas las peticiones de nombres les llega a ellos. Este esquema, sin embargo, tiene un inconveniente: cuando un incendio inutilizó el cable de red dorsal de nuestro departamento en la Universidad, no pudimos trabajar, pues ninguno de los servidores de nombres estaban accesibles. No funcionaban ni los terminales X ni las impresoras...

Aunque no es muy habitual que las redes dorsales de las universidades sean pasto de las llamas, deberían tomarse precauciones para casos como éste.

Una solución es poner un servidor de nombres local que se ocupe de sus nombres locales, y reenvíe todas las peticiones de otros nombres a los servidores principales. Por supuesto, esto sólo es posible si usted tiene un dominio propio.

Alternativamente, puede mantener una copia de la tabla de nombres para su dominio o red local en el fichero /etc/hosts. En el fichero /etc/host.conf deberá incluir la opción “order bind,hosts”, para obligar a usar el fichero local si el servidor principal de nombres falla. Si usamos /etc/nsswitch.conf, habrá que cambiar la línea que haga referencia a hosts, dejándola así: “hosts: dns files”.

Notas

[1]

N. del T.: literalmente, burla