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:
El nombre estático.
El nombre bonito.
El nombre transitorio.
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 |
Sí |
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