Clientes ******** Daremos bajo este epígrafe un repaso a las herramientas que tenemos para hacer resoluciones interactivamente. .. _hostname: .. _hostnamectl: .. index:: hostname, hostnamectl 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: .. table:: :class: nombres-maquina +-------------+------------------+---------------------+-------------+-------------+ | Tipo | Dónde se define | Ámbito | Resoluble | Historia | +=============+==================+=====================+=============+=============+ | Estático | | Propia máquina | No, pero sí | Tradicional | +-------------+ | +-------------+-------------+ | Bonito | Propia máquina | | 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 :ref:`prompt `, que tradicionalmente se consulta usando la orden :command:`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 :file:`/etc/hostname`, y la orden :command:`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 .. warning:: 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*\ [#]_. Podemos salir y entrar o, simplemente, sustituir nuestra sesión de :program:`bash` por otra:: $ exec bash Aunque el nombre carece de dominio hay, sin embargo, un modo de definirlo: a través de :ref:`/etc/hosts `. El archivo deberá contener una línea que relaciona una |IP| con el nombre a secas y el nombre cualificado: .. code-block:: 127.0.0.1 localhost.localdomain localhost 127.0.1.1 midebian.domus midebian .. note:: 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 :command:`hostname`, el nombre de máquina también puede cambiarse o consultar con la orden :command:`hostnamectl`, proporcionada por :ref:`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 :command:`hostname` es que este cambio es permanente y no es necesario volcarlo sobre :file:`/etc/hostname`. .. note:: En versiones antiguas de :command:`hostnamectl` no existe la suborden :kbd:`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 :command:`hostnamectl`:: # hostnamectl hostname "Mi Debian Querida" --pretty # hostnamectl hostname --pretty Mi Debian Querida .. note:: El nombre se hace persistente, porque se incluye en el archivo :file:`/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 :deb:`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. .. _etcresolv.conf: Servidores de consulta ====================== Para resolver nombres, los clientes |DNS| se apoyan en los servidores |DNS| definidos en :file:`/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: :kbd:`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\ [#]_, 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. .. warning:: Históricamente la cláusula que se usaba era :kbd:`domain` que sólo admitía (y sigue admitiendo) un dominio de búsqueda. :kbd:`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 :kbd:`search`. .. _getent-hosts: .. index:: getent :command:`getent` ================= No es, en realidad, un cliente |DNS| sino una orden que resolverá un nombre atendiendo a lo establecido en :file:`/etc/nsswitch`. Por tanto, si hubiéramos escrito en :file:`/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 |IP|\ v6 sobre |IP|\ v4 en caso de haber ambas. Para obtener ambas puede utilizarse "ahosts" en vez de "hosts". .. _host: .. index:: host :command:`host` ================ Es un cliente |DNS| proporcionado por el paquete :deb:`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, :command:`host` selecciona los más apropiados (que parecen ser :kbd:`A`, :kbd:`AAAA`, :kbd:`CNAME`, :kbd:`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 :kbd:`A`, :kbd:`AAAA` y :kbd:`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 :kbd:`-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\ [#]_ 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 .. note:: Si se desea una salida como la del siguiente cliente (:command:`dig`) puede añadirse la opción :kbd:`-v`. .. _dig: .. index:: dig :command:`dig` ============== Es otro de los más habituales clientes |DNS|, instalado a través del paquete :deb:`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 :ref:`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 :kbd:`+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 :kbd:`-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, :command:`dig` mostrará registros :kbd:`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 :kbd:`AXFR` nos permite obtener la transferencia de zona, en caso de tener permiso:: $ dig google.com AXFR @ns1.google.com Por último, :program:`dig` ofrece el utilísimo :kbd:`+trace`, que realiza repetidas consultas iterativas empezando por los servidores raíz\ [#]_ a fin de conseguir la resolución solicitada, que es la :ref:`estrategia que siguen los servidores recursivos para dar respuesta a sus clientes `:: $ dig www.google.com +trace +question +nodnssec .. _nslookup: .. index:: nslookup :command:`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 .. rubric:: Notas al pie .. [#] Esto no es exacto. El *prompt* se define a través de la :ref:`variable PS1 ` y es el valor de esa variable el que se define al arrancar la sesión de terminal. Si alteramos el valor de esa variable, el prompt cambiará inmediatamente. .. [#] En realidad, existe una cláusula :kbd:`ndots` para especificar el número de puntos a partir del cual un nombre se considera absoluto y, por tanto, no se le añaden los dominios de búsqueda. Si no existe (que es lo que ocurre casi siempre), su valor es 1 y, por tanto, se cumple lo que se indica aquí. .. [#] Ahondaremos en este concepto de transferencia de zona al configurar servidores. .. [#] En realidad, la primera consulta que hace la realiza al servidor |DNS| recursivo del sistema (o al que se especifique en la línea de órdenes mediante :kbd:`@`) para averiguar cuáles son los servidores raíz. .. |UTF| replace:: :abbr:`UTF (Unicode Transformation Format)` .. |mDNS| replace:: :abbr:`mDNS (Multicast DNS)` .. _avahi: https://www.avahi.org