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.
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.
Ejemplo 6-1. Ejemplo de fichero host.conf
# /etc/host.conf
# Tenemos servidor de nombres, pero no NIS (de momento)
order bind hosts
# Permitir direcciones múltiples
multi on
# Contra los nombres falsos
nospoof on
# Dominio local por defecto (no necesario).
trim vbrew.com. |
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.
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.
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”.