DNS działa z hostem, ale nie z wget

10

TL; DR

Mam dziwną sytuację, w której mogę wyszukiwać DNS na niektórych hostach, ale na innych nie. Wydaje się, że jest to związane z plikiem resolv.conf, który ma jeden wpis serwera nazw wskazujący na mój serwer nazw, a drugi, który prawdopodobnie ma związek z dokerem, ale nie jestem pewien, jak to naprawić.

Problem

Czytałem doskonałe wprowadzenie Stéphane Graber do LXD i chciałem go wypróbować. Dlatego zrobiłem:

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

Skonfigurowałem go ze wszystkimi ustawieniami domyślnymi. Potem napisałem:

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

Niektóre testy

Próbowałem uzyskać dostęp do tego adresu z przeglądarki internetowej na innym komputerze i działało dobrze. Pomyślałem, że coś jest nie tak z konfiguracją DNS, ale:

$ 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

Więc spróbowałem 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"

co sprawiło, że pomyślałem, że wystąpił problem z moim połączeniem internetowym, ale jeśli korzystam z us.images.linuxcontainers.org (o czym wspomniałem gdzieś w Internecie):

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

Próbowałem również canonical.images.linuxcontainers.org, który (zgodnie z hostpowyższym) jest tym, co images.linuxcontainers.org jest aliasem i to też działało, więc wygląda na to, że hostmoże wyszukiwać images.linuxcontainers.org, podczas gdy wgeti lxcnie może, ale wget mogę uzyskać dostęp do canonical.images.linuxcontainers.org i większości innych stron, które próbowałem.

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

Ja również próbowałem wget -4i wget -6aby wykluczyć problemy z IPv6, ale wyniki były takie same w obu kierunkach. W końcu wypróbowałem kilka innych programów, w3male nie ma też żadnej różnicy.

Oczywiście czegoś mi brakuje; czy ktoś może zaoferować jakąkolwiek poradę, dlaczego nie mogę lxcpobrać listy obrazów?

PC

Komputer jest stosunkowo nową instalacją z systemem Ubuntu Server 16.10 z bardzo małą liczbą dodatkowych pakietów zainstalowanych na głównym hoście. Docker jest zainstalowany i działa, ale nie ma żadnych kontenerów. Co ciekawe, ostatnio zrestartowałem się do jądra 4.8.6, aby przetestować inny problem, który miałem i przy pomocy tego jądra mogłem uzyskać dostęp do images.linuxcontainers.org, ale okno dokujące nie uruchomiło się, więc zastanawiam się, czy może to mieć związek z dokerem .

Konfiguracja

/etc/resolv.confwygląda to tak (ale z jakiegoś powodu nie jestem świadomy, tak naprawdę jest dowiązaniem symbolicznym /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

Jeśli wykonam kwerendę na pierwszym wymienionym serwerze nazw, otrzymam taki sam wynik, jak w przypadku, gdy nie dołączę adresu serwera nazw:

$ 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

Jeśli wykonam kwerendę drugą, upłynie limit czasu, nie osiągając serwera:

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

Jeśli zapytam drugą, ale użyję nazwy kanonicznej, to zadziała, a następnie upłynie limit czasu ???

$ 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

Edycja 1:

/etc/nsswitch.conf wygląda tak:

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

Edytuj 2

Zmodyfikowany plik nsswitch.conf wygląda teraz tak:

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

Edytuj 3

Zawartość /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
źródło
1
/etc/resolv.confjest zwykle dowiązaniem symbolicznym na Ubuntu, to normalne. Co /etc/nsswitch.confzawiera
muru
@muru Dodałem go powyżej (ten nie jest dowiązaniem symbolicznym)
DrAl
2
@ThatGuy Dzięki za to. To nie będzie działać na każdym serwerze (ponieważ zależy to od tego, czy serwer będzie szukał nazwy domeny) - w tym przypadku mógłbym po prostu użyć canonical.images.linuxcontainers.org, ponieważ wydaje się, że to działa. Jednak ja również musiałaby przekonać lxc image listi lxc launchkorzystać z tego zamiast wbudowanego adres.
DrAl
1
@DrAl, To jest pierwszy raz, gdy widzisz resolvesłowo kluczowe hosts, wydaje się nieprawidłowe. Powinieneś mieć coś takiego hosts: files dns [!UNAVAIL=return]lub jeśli masz zainstalowany mDNS files dns mdns4_minimal [NOTFOUND=return] mdns4. możesz usunąć [NOTFOUND=return]lub [!UNAVAIL=return], i tak jest to akcja domyślna, jeśli nic nie zostało do zapytania.
user.dz
1
@ user.dz, próbowałem to usunąć (chociaż jest to domyślna konfiguracja mojej instalacji, ponieważ nigdy wcześniej nie dotknąłem tego pliku). Wydaje się, że pozwala to wgetowi działać (choć po kilku sekundach opóźnia „rozwiązywanie obrazów.linuxcontainers.org). Dziękuję! Każdy pomysł, dlaczego mógł zostać dodany do mojego /etc/nsswitch.conf? Lista pakietów, które mam zainstalowany na serwerze jest wymieniony w linku w sekcji „Komputer” powyżej
DrAl

Odpowiedzi:

2
  • To jest pierwszy raz, kiedy resolvesłowo kluczowe hosts wydaje się nieprawidłowe. Powinieneś mieć coś takiego

    hosts: files dns [NOTFOUND=return]
    

    lub jeśli masz zainstalowany mDNS

    hosts: files dns mdns4_minimal [NOTFOUND=return] mdns4
    

    Możesz usunąć [NOTFOUND=return]lub [!UNAVAIL=return], i tak jest to akcja domyślna, jeśli nic nie pozostało do zapytania.

  • Po kopaniu odkryłem, że jest dla mnie nowy moduł NSS

    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.
    

    Możesz skończyć jakoś go zainstalować, a nie z wspomnianymi pakietami. Od tego nie zależy żadna paczka.

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

    Ale nie mogę teraz nic powiedzieć, dlaczego to systemd-resolvedbyło niewiarygodne. Lepiej zgłosić to jako błąd systemd.

user.dz
źródło
1
Ciekawe, dziękuję. Próbowałem usunąć „rozwiązać” i zrobiłem wgetto znacznie szybciej, więc wygląda na to, że to właśnie powodowało problem. Moja linia hostów w pliku nsswitch.conf ma teraz po prostu „pliki dns”.
DrAl
1
Kiedyś dpkg-query -l '*resolve*'sprawdzałem i znalazłem, że libnss-resolvejest zainstalowany, więc zainstalowałem aptitudei uruchomiłem aptitude why libnss-resolvei tak mówi i ubuntu-standard Recommends libnss-resolve.
DrAl
1
@DrAl, która to wersja? U16.04 nie mam takiej zależności między ubuntu-standard& libnss-resolve.
user.dz
1
To daje nam trochę światła na temat bieżącej konfiguracji, ale masz ostatnią poprawkę, co oznacza ten kolejny błąd (systemd-resolved / nss-resol jest niewiarygodny). Czy masz uruchomioną usługęsystemctl status systemd-resolved.service
user.dz
1
@DrAl, więc używa domyślnych wartości man resolved.conf, co oznacza, że ​​wróciliśmy do /etc/resolv.conf: /. resolvepowinien mieć taki sam efekt jak dnsw nsswitch.conf.
user.dz