Saltar la navegación

Ficheros nsswitch y hosts

En los orígenes de internet, cuando había pocas máquinas conectadas, el problema de traducir un nombre a una IP se resolvió de un modo muy sencillo: mediante un fichero que asociaba cada dirección IP al nombre del equipo. Este fichero, que sigue existiendo actualmente, se llama hosts y se encuentra en distintas localizaciones según el sistema operativo:

Sistema Operativo Localización
GNU/Linux - Unix /etc/hosts
Windows XP / 2003 / Vista / 7 / 8 / 10    C:\Windows\System32\drivers\etc\hosts   
Mac OS /private/etc/hosts

En un principio el fichero hosts se podía crear a partir de una base de datos oficial de hosts que se mantenía en el Network Information Control Center (NIC), aunque eran  necesarios  frecuentemente  cambios locales para poner al día el fichero respecto a alias no oficiales y/o hosts desconocidos. Consultando este fichero, se traducían los nombre de los host en sus correspondientes direcciones IP. Su sintaxis es muy sencilla:

  • Cada correspondencia de dirección IP y dominio debe ir en una línea distinta, empezando por la IP y a continuación, separado por espacios y/o tabuladores, el dominio FQDN.
  • Se pueden introducir más de un dominio a resolver para la misma IP separándolos con espacios y/o tabuladores en la misma línea, pero el dominio FQDN debe ir en primer lugar.
  • Las líneas que comienzan por # se consideran comentarios.
  • Las líneas en blanco se utilizan para estructurar el fichero dando más claridad.

Por ejemplo:

127.0.0.1        localhost
192.168.1.1 router.asir.com router
192.168.1.10 www.asir.com www

La primera línea del ejemplo asocia el nombre localhost a la dirección de loopback. De este modo, referirse a localhost es equivalente a referirse a la dirección de loopback 127.0.0.1. La siguiente línea asocia los nombres router.asir.com y router a la dirección IP 192.168.1.1. Es como se ve, muy sencillo de implementar, pero solo servía cuando Internet tenía pocos ordenadores. Cuando su número empezó a crecer, se requirieron otras soluciones más imaginativas y surgió el sistema DNS. Pese a ello, los sistemas operativos siguen consultando el fichero hosts y, antes de recurrir a los servidores DNS para averiguar la IP a la que está asociado un nombre, buscan en dicho fichero. Por este motivo si incluyésemos, por ejemplo, la siguiente línea:

127.0.0.1      localhost     www.google.es

al hacer un ping a www.google.es no respondería el servidor de google, sino nuestra propia máquina a través de la interfaz de loopback.

El mecanismo de resolución de nombres en GNU/Linux es modular y puede utilizar varias fuentes de información declaradas en el archivo /etc/nsswitch.conf (Name Server Switch). Este fichero nos permite buscar cierto tipo de información administrativa (hosts, passwd, group, shadow, networks, etc.), especificando qué fuentes queremos comprobar (qué bases de datos) y en qué orden se harán estas comprobaciones.

# cat /etc/nsswitch.conf 
passwd:         compat
group:          compat
shadow:         compat
gshadow:        files

hosts:          files mdns4_minimal [NOTFOUND=return] dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

En la primera columna de /etc/nsswitch.conf está el tipo de información administrativa (para la traducción de nombres: hosts) y el restante contenido describe las fuentes que se utilizarán y el orden (para la traducción de nombres: files mdns4_minimal [NOTFOUND=return] dns). El orden va de izquierda a derecha.

La instrucción que determina la resolución de nombres es hosts:

hosts:          files mdns4_minimal [NOTFOUND=return] dns

Como el orden de las fuentes es de izquierda a derecha, en este caso, para resolver un nombre de dominio en Debian GNU/Linux se siguen los siguientes pasos:

  1. files: indica que se busque el nombre del dominio en el fichero /etc/hosts.
  2. mdns4_minimal [NOTFOUND=return]: especifica que se debe usar mDNS (Multicast DNS) para encontrar el nombre del dominio. Este protocolo permite saber en todo momento la relación entre la dirección IP y el nombre de una máquina dentro de la red local. Cuando se utiliza mDNS, en lugar de encargar la resolución de nombres a un servidor DNS, esta labor se distribuye, y cada equipo se encarga de la resolución de su propio nombre a través de un mecanismo multicast (224.0.0.251). Existen diferentes implementaciones de este protocolo, siendo las más conocidas Bonjour (Apple) y Avahi (GNU/Linux, suele instalarse por defecto). El protocolo mDNS usa el pseudodominio de primer nivel .local, por lo que él se encarga de buscar la IP de cualquier nombre de dominio terminado en .local, que se debe corresponder con un equipo de la red local. Si no lo encuentra, el código [NOTFOUND=return] detiene la búsqueda y no se pasa a la siguiente fuente. De esta manera, si tenemos una máquina llamada pc1 (el nombre de un equipo se encuentra en el fichero /etc/hostname) y queremos, por ejemplo, hacerle ping, podremos hacerlo con el comando: ping pc1.local; la IP de pc1.local la buscará el equipo desde donde ejecutamos el comando ping, utilizando el protocolo mDNS (implementado por el software Avahi en GNU/Linux, paquete avahi-daemon en Debian) generando un tráfico multicast en la red local que pregunta por la IP de dicho nombre. Todo este procedimiento solo afecta a los nombres acabados en .local.
  3. dns: indica que se busque en los servidores DNS especificados en /etc/resolv.conf.

Anteriormente, de esta funcionalidad se encargaba el fichero /etc/host.conf, pero el fichero /etc/nsswitch.conf lo ha dejado obsoleto.

Al fichero /etc/hosts se le pueden dar otros usos, como por ejemplo, bloquear el acceso de los usuarios a determinados sitios web porque puedan contener algún software malicioso como spyware o adware. Esto se hace añadiendo entradas para esos sitios que redirigen a direcciones que no existen, por ejemplo, a la de una máscara de subred, 255.255.255.0. Está claro, que un usuario un poco avispado, podrá saltarse esta limitación, escribiendo directamente la IP del sitio web.

Desde el punto de vista de la seguridad, el archivo /etc/hosts puede ser perjudicial cuando es modificado por alguien malintencionado para hacer un ataque de pharming, por ejemplo, un usuario malintencionado redireccionaría www.mibanco.com a una dirección IP como 93.184.216.119, que podría ser una réplica falsa de la página de mi banco, y así capturar datos privados. Normalmente los programas antivirus bloquean la modificación de este fichero.

Licencia: licencia de software libre GPL