O DNS funciona com o host, mas não com o wget

10

TL; DR

Tenho uma situação estranha em que posso fazer pesquisas de DNS em alguns hosts, mas não em outros. Isso parece estar relacionado ao resolv.conf ter uma entrada de servidor de nomes apontando para o meu servidor de nomes e outra que deve estar relacionada ao docker, mas não tenho certeza de como corrigi-lo.

O problema

Estive lendo a excelente introdução de Stéphane Graber ao LXD e queria experimentá-la. Portanto, eu fiz:

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

Eu o configurei com todas as configurações padrão. Eu então digitei:

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

Alguns testes

Tentei acessar esse endereço de um navegador da Web em outro PC e funcionou bem. Então, achei que algo devia estar errado com a configuração do DNS, mas:

$ 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

Então eu tentei o 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"

o que me fez pensar que havia um problema com minha conexão com a Internet, mas se eu usar us.images.linuxcontainers.org (que vi menção em algum lugar da 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]

Eu também tentei canonical.images.linuxcontainers.org, que (de acordo com hostacima) é o que images.linuxcontainers.org é um alias e funcionou também, então parece que hostpode procurar images.linuxcontainers.org, enquanto wgete lxcnão pode, mas wget pode acessar canonical.images.linuxcontainers.org e a maioria dos outros sites que experimentei.

$ 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]

Eu também tentei wget -4e wget -6para descartar problemas IPv6, mas os resultados foram os mesmos de qualquer maneira. Finalmente, tentei alguns outros programas, como também w3mnão há diferença.

Obviamente estou perdendo alguma coisa; alguém pode oferecer algum conselho sobre por que não consigo lxcbaixar a lista de imagens?

O PC

O PC é uma instalação relativamente nova, executando o Ubuntu Server 16.10, com muito poucos pacotes adicionais instalados no host principal. O Docker está instalado e em execução, mas não há contêineres. Curiosamente, eu reiniciei recentemente o kernel 4.8.6 para testar outro problema que eu estava tendo e com esse kernel eu pude acessar images.linuxcontainers.org, mas o docker não seria iniciado, então estou pensando se isso pode estar relacionado ao docker .

Configuração

/etc/resolv.confse parece com isso (mas, por algum motivo que não conheço, é na verdade um link simbólico para /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

Se eu consultar o primeiro servidor de nomes listado, obtenho o mesmo resultado como se não acrescentasse o endereço do servidor de nomes:

$ 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

Se eu consultar o segundo, atingirá o tempo limite sem acessar um servidor:

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

Se eu consultar o segundo, mas usar o nome canônico, ele funciona e depois expirar ???

$ 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 parece com isso:

# /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

O nsswitch.conf modificado agora se parece com isso:

# /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

Conteúdo 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
fonte
1
/etc/resolv.confgeralmente é um link simbólico no Ubuntu, isso é normal. O que /etc/nsswitch.confcontém?
Muru
@muru eu adicionei-lo acima (este não é um link simbólico)
Dral
2
@ThatGuy Obrigado por isso. Isso não funcionará com todos os servidores (pois depende se o servidor procura o nome de domínio) - nesse caso, eu poderia usar o canonical.images.linuxcontainers.org de qualquer maneira, pois isso parece funcionar. No entanto, eu também precisaria persuadir lxc image liste lxc launchusá-lo em vez do endereço interno.
DrAl
1
@DrAl, esta é a primeira vez que vê a resolvepalavra-chave hosts, parece errado. Você deve ter algo parecido hosts: files dns [!UNAVAIL=return]ou se tiver o mDNS instalado files dns mdns4_minimal [NOTFOUND=return] mdns4. você pode remover [NOTFOUND=return]or [!UNAVAIL=return], é a ação padrão de qualquer maneira, se não restar nada para consultar.
user.dz
1
@ user.dz, tentei remover isso (embora seja o padrão configurado pela minha instalação, pois nunca havia tocado neste arquivo). Isso parece permitir que o wget funcione (embora após alguns segundos demore "resolvendo images.linuxcontainers.org). Obrigado! Alguma idéia de por que isso pode ter sido adicionado ao meu /etc/nsswitch.conf? A lista de pacotes que eu instalado no servidor está listado em um link na seção "O PC" acima.
DrAl

Respostas:

2
  • Esta é a primeira vez que vê a resolvepalavra-chave hosts, parece errado. Você deveria ter algo como

    hosts: files dns [NOTFOUND=return]
    

    ou se você possui o mDNS instalado

    hosts: files dns mdns4_minimal [NOTFOUND=return] mdns4
    

    Você pode remover [NOTFOUND=return]or [!UNAVAIL=return], é a ação padrão de qualquer maneira, se não restar nada para consultar.

  • Bem, depois de algumas pesquisas, descobri que há um módulo NSS novo para mim

    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.
    

    Você pode acabar instalando-o de alguma forma e não com os pacotes que você mencionou. Não há pacote depende disso.

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

    Mas não posso dizer nada agora, por que systemd-resolvednão era confiável. É melhor denunciá-lo como erro systemd.

user.dz
fonte
1
Interessante, obrigado. Eu tentei remover "resolver" e wgetfiquei muito mais rápido, então parece que foi isso que estava causando o problema. Minha linha de hosts no nsswitch.conf agora possui apenas "arquivos dns".
DrAl
1
Eu costumava dpkg-query -l '*resolve*'verificar e descobri que libnss-resolveestá instalado, então eu instalei aptitudee corri aptitude why libnss-resolvee diz i ubuntu-standard Recommends libnss-resolve.
DrAl
1
@DrAl, que versão é essa? Eu não tenho essa dependência entre U16.04 ubuntu-standarde & libnss-resolve.
user.dz
1
Isso nos dá alguma luz sobre a configuração atual, mas você tem a última correção, o que significa que esse é outro bug (systemd-resolved / nss-resolve não é confiável). Você tem o serviço em execuçãosystemctl status systemd-resolved.service
user.dz 27/11
1
@DrAl, portanto, usa padrões, from man resolved.conf, isso significa que estamos de volta a /etc/resolv.conf: /. resolvedeve ter o mesmo efeito que dnsem nsswitch.conf.
user.dz