DNS funciona con el host, pero no con wget

10

TL; DR

Tengo una situación extraña en la que puedo hacer búsquedas de DNS en algunos hosts pero no en otros. Esto parece estar relacionado con resolv.conf que tiene una entrada de servidor de nombres que apunta a mi servidor de nombres y otra que presumiblemente tiene que ver con docker, pero no estoy seguro de cómo solucionarlo.

El problema

He estado leyendo la excelente introducción de Stéphane Graber a LXD y quería probarlo. Por lo tanto, hice:

$ sudo usermod -a -G lxd <myusername>
$ newgrp lxd
$ sudo lxd init

Lo configuré con todas las configuraciones predeterminadas. Luego escribí:

$ lxc image list images:
error: Get https://images.linuxcontainers.org/streams/v1/index.json: lookup images.linuxcontainers.org: no such host

Algunas pruebas

Intenté acceder a esa dirección desde un navegador web en otra PC y funcionó bien. Así que pensé que algo debe estar mal con la configuración de DNS, pero:

$ host images.linuxcontainers.org
images.linuxcontainers.org is an alias for canonical.images.linuxcontainers.org.
canonical.images.linuxcontainers.org has address 91.189.91.21
canonical.images.linuxcontainers.org has address 91.189.88.37
canonical.images.linuxcontainers.org has IPv6 address 2001:67c:1560:8001::21
canonical.images.linuxcontainers.org has IPv6 address 2001:67c:1562::41

Así que probé wget:

$ wget https://images.linuxcontainers.org/streams/v1/index.json
--2016-11-10 15:56:22--  https://images.linuxcontainers.org/streams/v1/index.json
Resolving images.linuxcontainers.org (images.linuxcontainers.org)... failed: Name or service not known.
wget: unable to resolve host address "images.linuxcontainers.org"

lo que me hizo pensar que había un problema con mi conexión a internet, pero si uso us.images.linuxcontainers.org (que vi mencionar en algún lugar de la web):

$ wget https://us.images.linuxcontainers.org/streams/v1/index.json
--2016-11-10 15:57:26--  https://us.images.linuxcontainers.org/streams/v1/index.json
Resolving us.images.linuxcontainers.org (us.images.linuxcontainers.org)... 91.189.91.21, 2001:67c:1562::41
Connecting to us.images.linuxcontainers.org (us.images.linuxcontainers.org)|91.189.91.21|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3086 (3.0K) [application/json]
Saving to: "index.json"

index.json                                100%[==================================================================================>]   3.01K  --.-KB/s    in 0s

2016-11-10 15:57:26 (8.36 MB/s) - "index.json" saved [3086/3086]

También probé canonical.images.linuxcontainers.org, que (según lo hostanterior) es de lo que images.linuxcontainers.org es un alias y que también funcionó, por lo que parece que hostpuede buscar images.linuxcontainers.org, mientras que wgety lxcno puede, pero wget puede acceder a canonical.images.linuxcontainers.org y a la mayoría de los otros sitios que he probado.

$ wget https://canonical.images.linuxcontainers.org/streams/v1/index.json
--2016-11-10 16:02:28--  https://canonical.images.linuxcontainers.org/streams/v1/index.json
Resolving canonical.images.linuxcontainers.org (canonical.images.linuxcontainers.org)... 91.189.91.21, 91.189.88.37
Connecting to canonical.images.linuxcontainers.org (canonical.images.linuxcontainers.org)|91.189.91.21|:443... connected.
ERROR: no certificate subject alternative name matches
        requested host name "canonical.images.linuxcontainers.org".
To connect to canonical.images.linuxcontainers.org insecurely, use `--no-check-certificate'.

$ wget --no-check-certificate https://canonical.images.linuxcontainers.org/streams/v1/index.json
--2016-11-10 16:02:37--  https://canonical.images.linuxcontainers.org/streams/v1/index.json
Resolving canonical.images.linuxcontainers.org (canonical.images.linuxcontainers.org)... 91.189.88.37, 91.189.91.21
Connecting to canonical.images.linuxcontainers.org (canonical.images.linuxcontainers.org)|91.189.88.37|:443... connected.
WARNING: no certificate subject alternative name matches
        requested host name "canonical.images.linuxcontainers.org".
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://uk.images.linuxcontainers.org/streams/v1/index.json [following]
--2016-11-10 16:02:37--  https://uk.images.linuxcontainers.org/streams/v1/index.json
Resolving uk.images.linuxcontainers.org (uk.images.linuxcontainers.org)... 91.189.88.37, 2001:67c:1560:8001::21
Connecting to uk.images.linuxcontainers.org (uk.images.linuxcontainers.org)|91.189.88.37|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3086 (3.0K) [application/json]
Saving to: "index.json.1"

index.json.1                              100%[==================================================================================>]   3.01K  --.-KB/s    in 0s

2016-11-10 16:02:38 (96.5 MB/s) - "index.json.1" saved [3086/3086]

También he intentado wget -4y wget -6para descartar problemas de IPv6, pero los resultados eran los mismos de cualquier manera. Finalmente probé algunos otros programas como w3mpero tampoco hay diferencia allí.

Obviamente me estoy perdiendo algo; ¿Alguien puede ofrecer algún consejo sobre por qué no puedo lxcdescargar la lista de imágenes?

La PC

La PC es una instalación relativamente nueva que ejecuta Ubuntu Server 16.10 con muy pocos paquetes adicionales instalados en el host principal. Docker está instalado y en ejecución, pero no hay contenedores activos. Curiosamente, recientemente reinicié el kernel 4.8.6 para probar otro problema que tenía y con ese kernel pude acceder a images.linuxcontainers.org, pero docker no se inició, así que me pregunto si esto podría tener que ver con docker .

Configuración

/etc/resolv.confse ve así (pero por alguna razón no estoy al tanto, en realidad es un enlace simbólico a /run/resolvconf/resolv.conf):

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 192.168.1.254
nameserver 127.0.0.53
search lan

Si consulto el primer servidor de nombres listado, obtengo el mismo resultado que si no agrego la dirección del servidor de nombres:

$ host images.linuxcontainers.org 192.168.1.254
images.linuxcontainers.org is an alias for canonical.images.linuxcontainers.org.
canonical.images.linuxcontainers.org has address 91.189.91.21
canonical.images.linuxcontainers.org has address 91.189.88.37
canonical.images.linuxcontainers.org has IPv6 address 2001:67c:1560:8001::21
canonical.images.linuxcontainers.org has IPv6 address 2001:67c:1562::41

Si consulto el segundo, se agota el tiempo de espera sin llegar a un servidor:

$ host images.linuxcontainers.org 127.0.0.53
;; connection timed out; no servers could be reached

Si consulto el segundo pero uso el nombre canónico, ¿funciona y luego se agota el tiempo de espera?

$ host canonical.images.linuxcontainers.org 127.0.0.53
Using domain server:
Name: 127.0.0.53
Address: 127.0.0.53#53
Aliases:

canonical.images.linuxcontainers.org has address 91.189.88.37
canonical.images.linuxcontainers.org has address 91.189.91.21
;; connection timed out; no servers could be reached
;; connection timed out; no servers could be reached

Editar 1:

/etc/nsswitch.conf Se ve como esto:

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat
gshadow:        files

hosts:          files resolve [!UNAVAIL=return] dns
networks:       files

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

netgroup:       nis

Editar 2

El nsswitch.conf modificado ahora se ve así:

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat
gshadow:        files

hosts:          files resolve dns
networks:       files

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

netgroup:       nis

Editar 3

Contenido de /etc/systemd/resolved.conf:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See resolved.conf(5) for details

[Resolve]
#DNS=
#FallbackDNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844
#Domains=
#LLMNR=yes
#DNSSEC=no
#Cache=yes
DrAl
fuente
1
/etc/resolv.confgeneralmente es un enlace simbólico en Ubuntu, eso es normal. ¿Qué /etc/nsswitch.confcontiene?
muru
@muru Lo he agregado anteriormente (este no es un enlace simbólico)
DrAl
2
@ ThatGuy Gracias por eso. Esto no funcionará con todos los servidores (ya que depende de si el servidor busca el nombre de dominio); en este caso, podría usar canonical.images.linuxcontainers.org de todos modos, ya que parece funcionar. Sin embargo, también necesitaría persuadir lxc image listy lxc launchusar esto en lugar de la dirección integrada.
DrAl
1
@DrAl, esta es la primera vez que ve la resolvepalabra clave hosts, parece incorrecto. Debería tener algo como hosts: files dns [!UNAVAIL=return]o si tiene instalado mDNS files dns mdns4_minimal [NOTFOUND=return] mdns4. puede eliminar [NOTFOUND=return]o [!UNAVAIL=return], de todos modos, es la acción predeterminada si no queda nada para consultar.
user.dz
1
@ user.dz, he intentado eliminar esto (aunque es mi configuración predeterminada por mi instalación ya que nunca he tocado este archivo anteriormente). Esto parece permitir que wget funcione (aunque después de unos segundos de retraso "resolviendo images.linuxcontainers.org). Gracias. ¿Alguna idea de por qué esto podría haberse agregado a mi /etc/nsswitch.conf? La lista de paquetes que he instalado en el servidor aparece en un enlace en la sección "La PC" anterior.
DrAl

Respuestas:

2
  • Esta es la primera vez que ve la resolvepalabra clave hosts, parece incorrecto. Deberías tener algo como

    hosts: files dns [NOTFOUND=return]
    

    o si tienes mDNS instalado

    hosts: files dns mdns4_minimal [NOTFOUND=return] mdns4
    

    Puede eliminar [NOTFOUND=return]o [!UNAVAIL=return], de todos modos, es la acción predeterminada si no queda nada para consultar.

  • Bueno, después de investigar un poco, podría encontrar que hay un módulo NSS nuevo para mí.

    libnss-resolve

    nss module to resolve names via systemd-resolved
    
    nss-resolve is a plugin for the GNU Name Service Switch (NSS) functionality
    of the GNU C Library (glibc) providing DNS and LLMNR resolution to programs via
    the systemd-resolved daemon (provided in the systemd package).
    
    Installing this package automatically adds resolve to /etc/nsswitch.conf.
    

    Podría terminar instalándolo de alguna manera y no con los paquetes que mencionó. No hay paquete depende de ello.

    ~$ apt-cache rdepends libnss-resolve
    libnss-resolve
    Reverse Depends:
    

    Pero no puedo decir nada ahora, por qué systemd-resolvedno era confiable. Es mejor informarlo como error systemd.

user.dz
fuente
1
Interesante, gracias. Traté de eliminar "resolver" y wgetobtuve mucho más rápido, por lo que parece que eso fue lo que estaba causando el problema. Mi línea de hosts en nsswitch.conf ahora solo tiene "archivos dns".
DrAl
1
Solía dpkg-query -l '*resolve*'comprobar y encontré que libnss-resolveestá instalado, así que instalé aptitudey ejecuté aptitude why libnss-resolvey dice i ubuntu-standard Recommends libnss-resolve.
DrAl
1
@DrAl, ¿qué versión es esta? No tengo U16.04 tal dependencia entre ubuntu-standard& libnss-resolve.
user.dz
1
Eso nos da algo de luz sobre la configuración actual, pero tiene la última solución, lo que significa que este otro error (systemd-resolve / nss-resolve no es confiable). ¿Tiene su servicio en ejecuciónsystemctl status systemd-resolved.service
User.dz
1
@DrAl, por lo que usa valores predeterminados, desde man resolved.conf, eso significa que volvemos a /etc/resolv.conf: /. resolvedebería tener el mismo efecto que dnsen nsswitch.conf.
user.dz