6.2.2. Clientes

Daremos bajo este epígrafe un repaso a las herramientas que tenemos para hacer resoluciones interactivamente.

6.2.2.1. El nombre de la máquina

Antes de pasar a describir cómo resolver nombres, es pertinente saber cuál es realmente el nombre de la máquina propia y cómo definirlo. Propiamente nuestra máquina tiene hasta cuatro nombres:

  1. El nombre estático.

  2. El nombre bonito.

  3. El nombre transitorio.

  4. El nombre (o los nombres, porque pueden ser varios) DNS.

Antes de explicarlos, hagamos una tabla con sus características:

Tipo

Dónde se define

Ámbito

Resoluble

Historia

Estático

Propia máquina

Propia máquina

No, pero sí

Tradicional

Bonito

No

Moderno

Transitorio

Red local conectada

Moderno

DNS

Servidor externo

Red

Tradicional

esto es:

  • Los nombres puede definirse en la propia máquina o ser adjudicados por un servidor DNS.

  • El ámbito en que se conoce el nombre puede ser interno (sólo conocido por la própia máquina), conocido sólo en la red lógica local a la que se encuentra conectada directamente la máquina o conocido en toda la red.

  • Que sean resolubles, significa que pueden relacionarse con una dirección IP.

  • El nombre puede haber existido desde siempre o ser de creación reciente. Tanto el nombre bonito como el transitorio no existían en Linux hace relativamente pocos años.

Estático

Es el nombre sin dominio que aparece en el prompt, que tradicionalmente se consulta usando la orden hostname:

$ hostname
debianmia

y que se puede manipular (como administrador) también mediante esa orden:

# hostname midebian
# hostname
midebian

Esta manipulación, sin embargo, será temporal, porque durante el arranque el nombre se obtiene de la lectura del archivo /etc/hostname, y la orden hostname no lo modifica. Por tanto, en cuanto apaguemos, el nuevo nombre se perderá. Para hacer ese cambio permanente deberíamos, además, escribir el archivo:

# hostname midebian
# hostname > /etc/hostname

Advertencia

Aunque cambiemos el nombre de la máquina, notaremos que el prompt no cambia en absoluto. Esto es debido a que el prompt se define al abrir la sesión de la terminal y permanece igual mientras dure la sesión de la shell[1]. Podemos salir y entrar o, simplemente, sustituir nuestra sesión de bash por otra:

$ exec bash

Aunque el nombre carece de dominio hay, sin embargo, un modo de definirlo: a través de /etc/hosts. El archivo deberá contener una línea que relaciona una IP con el nombre a secas y el nombre cualificado:

127.0.0.1         localhost.localdomain      localhost
127.0.1.1         midebian.domus             midebian

Nota

Si la máquina tiene IP fija, entones suele usarse ésta para establecer la relación. Si la obtiene de un servidor DHCP, entonces suele usarse la indicada de la red local.

Ahora sí:

$ hostname
midebian
$ hostname -d
domus
$ dnsdomainname
domus
$ hostname  -f
choquereta.domus

Al añadir el nombre, no solamente hemos logrado asociarle un dominio, sino también hacerlo resoluble, puesto que le asociamos una dirección IP. Esto es importante porque, en principio, el nombre no era resoluble y, por tanto, no se habría podido usar en asuntos de redes.

Alternativamente a hostname, el nombre de máquina también puede cambiarse o consultar con la orden hostnamectl, proporcionada por systemd:

# hostnamectl hostname midebian --static
# hostnamectl hostname --static
midebian
# hostnamectl status
 Static hostname: midebian
 Pretty hostname: Mi Debian Querida
       Icon name: computer
      Machine ID: a044ac21460f4ddf9d1360fd185c37b4
         Boot ID: 775e7dc5230b5d249a34bb702a87a6ee
Operating System: Debian GNU/Linux bookworm/sid
          Kernel: Linux 5.19.0-2-amd64
    Architecture: x86-64
 Hardware Vendor: HP
  Hardware Model: HP Notebook
Firmware Version: F.1E

La diferencia con hacerlo mediante hostname es que este cambio es permanente y no es necesario volcarlo sobre /etc/hostname.

Nota

En versiones antiguas de hostnamectl no existe la suborden hostname. Consulte el manual para más información.

Bonito

El nombre bonito (pretty, en realidad) es un nombre que no sirve más que para que lo muestre el entorno gráfico, de ahí que se permita dentro de él cualquier caracter UTF -8. Fuera de la importancia estética de que nos aparezca en alguna ventana un nombre tan estiloso, no tiene en realidad ninguna.

Se modifica y consulta a través de hostnamectl:

# hostnamectl hostname "Mi Debian Querida"  --pretty
# hostnamectl hostname --pretty
Mi Debian Querida

Nota

El nombre se hace persistente, porque se incluye en el archivo /etc/machine-info:

$ cat /etc/machine-info
PRETTY_HOSTNAME="Mi Debian querida"
Transitorio

El nombre transitorio (transient) es un nombre que las máquinas son capaces de transmitir a las de su propia red a través del protocolo mDNS que data de 2013 (RFC 6762). De este modo, sin necesidad de servidor, las máquinas son capaces de reconocerse dentro de una misma red lógica a través de un nombre. En Linux, el servicio se implementa a través de avahi. Es conveniente tener instalado el paquete avahi-utils para no solo tener activo el servicio, sino también disponibles las herramientas de consulta y gestión.

Aunque puede cambiarse con las utilidades que proporciona avahi, el comportamiento habitual es que el nombre transitorio coincida con el nombre estático y, simplemente, añada el dominio «.local». Por tanto:

$ hostnamectl hostname --transient
choquereta

y deberemos obtener respuesta si hacemos:

$ ping choquereta.local

Cualquier otra máquina que tenga habilitado el protocolo también será accesible a través de «sunombre.local».

DNS

Este es el nombre cualificado que adjudicará a la máquina el servidor DNS en caso de que exista y de que se lo adjudique. No trataremos de él, aquí porque es el asunto de todo el apartado.

6.2.2.2. Servidores de consulta

Para resolver nombres, los clientes DNS se apoyan en los servidores DNS definidos en /etc/resolv.conf:

$ cat /etc/resolv.conf
search domus test.domus
nameserver 192.168.0.1
nameserver 192.168.0.2

Puede haber en este archivo, además, otra directiva: search. Esta directiva especifica los dominios de búsqueda que deberán usar los clientes resolvedores. En el ejemplo ilustrativo hay dos («domus» y «test.domus»), separados por espacio.

Gracias a ello, cuando se facilite a un cliente un nombre sin dominio[2], el cliente intentará resolver y, si falla, irá añadiendo los dominios de busca al nombre y probando estos nombres cualificados también. Por tanto, si intentáramos resolver «www», en caso de haber resolución, se intentaría «www.domus» y, de seguir sin obtenerse resolución, «www.test.domus». Sólo después de estos tres intentos, se devolvería quue no se encuentra el registro.

Advertencia

Históricamente la cláusula que se usaba era domain que sólo admitía (y sigue admitiendo) un dominio de búsqueda. search la ha dejado obsoleta, pero sigue siendo muy común ver aún ambas en un mismo archivo, quizás por buscar compatibilidad con software (muy, muy) antiguo, que sea incapaz de reconocer search.

6.2.2.3. getent

No es, en realidad, un cliente DNS sino una orden que resolverá un nombre atendiendo a lo establecido en /etc/nsswitch. Por tanto, si hubiéramos escrito en /etc/hosts una resolución espuria para www.google.com, esa sería la dirección IP que nos mostraría y no la resultante de hacer una consulta DNS:

# echo "1.2.3.4   www.google.com" >> /etc/hosts
# getent hosts www.google.com
1.2.3.4

La orden siempre prefiere resoluciones de IPv6 sobre IPv4 en caso de haber ambas. Para obtener ambas puede utilizarse «ahosts» en vez de «hosts».

6.2.2.4. host

Es un cliente DNS proporcionado por el paquete bind9-host que resolverá direcciones según este protocolo:

$ host www.google.com
www.google.com has address 172.217.168.164
www.google.com has IPv6 address 2a00:1450:4003:802::2004

Una resolución inversa se hace exactamente igual:

$ host 9.9.9.9
9.9.9.9.in-addr.arpa domain name pointer dns9.quad9.net.

Si se quiere forzar el uso de un servidor DNS concreto, se puede añadir como segundo argumento posicional:

$ host www.google.com dns9.quad9.net
Using domain server:
Name: dns9.quad9.net
Address: 9.9.9.9#53
Aliases:

www.google.com has address 172.217.168.164
www.google.com has IPv6 address 2a00:1450:4003:80a::2004

Sin especificar cuál tipo de registro se desea obtener, host selecciona los más apropiados (que parecen ser A, AAAA, CNAME, MX). Por ejemplo:

$ host google.com
google.com has address 142.250.201.78
google.com has IPv6 address 2a00:1450:4003:803::200e
google.com mail is handled by 10 smtp.google.com.

Se obtienen registros A, AAAA y MX. Sin embargo, debe existir un servidor de nombres para el dominio «google.com» que no aparece. SI se quieren obtener otro tipo de registros o ser más precisos y esocger únicamente uno, puede usarse la opción -t:

$ host -tns google.com
google.com name server ns4.google.com.
google.com name server ns1.google.com.
google.com name server ns3.google.com.
google.com name server ns2.google.com.

También puede pedirse una transferencia de zona del servidor autoritario[3] y listarse todos los registros del dominio (si es que se tiene permisos para ello):

$ host -la google.com ns1.google.com

o también:

$ host -taxfr google.com ns1.google.com

Nota

Si se desea una salida como la del siguiente cliente (dig) puede añadirse la opción -v.

6.2.2.5. dig

Es otro de los más habituales clientes DNS, instalado a través del paquete bind9-dnsutils. Su uso más simple es:

$ dig www.google.com
; <<>> DiG 9.16.33-Debian <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22509
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.google.com.                        IN      A

;; ANSWER SECTION:
www.google.com.         250     IN      A       172.217.18.4

;; Query time: 12 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sat Oct 08 09:07:53 CEST 2022
;; MSG SIZE  rcvd: 59

que devuelve una respuesta muchísimo más prolija que host. La respuesta está dividida en secciones:

  • La declaración de la versión del programa y las opciones usadas líneas, que constituyen las dos primeras líneas (cmd).

  • El sección que informa sobre el estado de la consulta e información accesoria (no parece tener nombre individual).

  • La pregunta (question)

  • La respuesta (answer)

  • Las estadisticas de la propia consulta (stats).

Se puede manipular el formato de la respuesta añadiendo o eliminando secciones. Por ejemplo:

$ dig www.google.com +nostats +nocmd

elimina la primera sección descrita y la sección de estadísticas. Existe también la posibilidad de eliminar todo e ir añadiéndola expresamente:

$ dig www.google.com +noall +answer
www.google.com.         38      IN      A       172.217.17.4

El parámetro +short sólo devuelve el valor del registro de respuesta:

$ dig www.google.com +short
172.217.17.4

Para realizar una resolución inversa escribiendo directamente la dirección IP es necesario añadir -x:

$ dig -x 9.9.9.9 +short
dns9.quad9.net.

También es posible especificar cuál es el servidor DNS al que realizar las consultas:

$ dig www.google.com @dns9.quad9.net

Si no se especifica qué registros mostrar, dig mostrará registros A. Pueden especificarse otros registros:

$ dig google.com NS +noall +answer
google.com.             20030   IN      NS      ns3.google.com.
google.com.             20030   IN      NS      ns1.google.com.
google.com.             20030   IN      NS      ns2.google.com.
google.com.             20030   IN      NS      ns4.google.com.

El registro AXFR nos permite obtener la transferencia de zona, en caso de tener permiso:

$ dig google.com AXFR @ns1.google.com

Por último, dig ofrece el utilísimo +trace, que realiza repetidas consultas iterativas empezando por los servidores raíz[4] a fin de conseguir la resolución solicitada, que es la estrategia que siguen los servidores recursivos para dar respuesta a sus clientes:

$ dig www.google.com +trace +question  +nodnssec

6.2.2.6. nslookup

Es una orden que permite su uso interactivo y tiene su análogo en Windows, de ahí que la hayamos citado. En Linux habitualmente se usa una de las dos anteriores. Su uso no interactivo más simple es:

$ nslookup www.google.com

aunque también puede especificarse el servidor que se desea usar:

$ nslookup www.google.com 9.9.9.9

o indicar cuál es el tipo de registro:

$ nslookup -query=ns google.com

Notas al pie