Strona główna
» LINUX
»
Napraw „Tymczasową awarię rozwiązywania DNS” w Debianie 12 za pomocą systemd-resolved
Napraw „Tymczasową awarię rozwiązywania DNS” w Debianie 12 za pomocą systemd-resolved
Błąd Temporary failure in name resolutionoznacza, że aplikacja nie mogła przekształcić nazwy hosta, np. deb.debian.orgw adres IP. W systemie Debian 12 (Bookworm) nie oznacza to automatycznie, że systemd-resolvedproblem jest rozwiązany. System Debian 12 nie jest instalowany systemd-resolveddomyślnie, a DNS może być zarządzany bezpośrednio przez NetworkManager, ifupdown, narzędzia DHCP lub inny resolver. Jeśli celowo włączono [brakuje informacji o błędzie] systemd-resolved, najszybszym rozwiązaniem jest zidentyfikowanie warstwy, która uległa awarii, przed zmianą konfiguracji.
Ten praktyczny podręcznik koncentruje się na systemach, które używają lub mają używać systemu systemd-resolved. Dokumentacja pakietu Bookworm Debiana zawiera informacje o instalowaniu systemd-resolvedprzełączników /etc/resolv.confz zarządzaniem systemd-resolved. Usługa ta zapewnia lokalny szczątkowy serwer DNS 127.0.0.53i akceptuje informacje DNS z konfiguracji globalnej, konfiguracji sieci dla poszczególnych łączy, DHCP, resolvectl. oraz usług zarządzania siecią. Więcej informacji można znaleźć na stronie pakietu Debian systemd-resolved oraz w podręczniku Debian systemd-resolved .
Szybka lista kontrolna diagnozy
Sprawdzać
Rozkaz
Co mówi ci wynik
Podstawowa ścieżka sieciowa
ping -c 3 1.1.1.1
Jeśli adres IP działa, ale nazwa hosta nie, sprawdź DNS. ICMP może zostać zablokowany, więc nie traktuj nieudanego pinga jako dowodu na awarię sieci.
Usługa Resolver
systemctl is-active systemd-resolved
activepotwierdza, że demon jest uruchomiony, ale nie dowodzi, że nadrzędny serwer DNS jest użyteczny.
Skuteczny DNS
resolvectl status
Pokazuje globalne i indywidualne serwery DNS, zakresy, domeny routingu i aktywny tryb rozpoznawania nazw.
ścieżka wyszukiwania glibc
getent ahosts debian.org
Testuje rozwiązywanie nazw hostów za pomocą ścieżki przełączania usług nazw (Name Service Switch) systemu, a nie tylko za pomocą narzędzia specyficznego dla DNS.
Dzienniki rozwiązywacza
journalctl -u systemd-resolved -b
Przydatne w przypadku niedostępnych serwerów DNS, problemów z działaniem w trybie awaryjnym i problemów z protokołem.
1. Sprawdź, czy problem dotyczy DNS, a nie ogólnej łączności
Zacznij od przetestowania nazwy hosta, a następnie adresu IP:
Jeśli wyszukiwanie nazwy hosta zakończy się niepowodzeniem, a bezpośredni test IP zakończy się powodzeniem, prawdopodobną domeną błędu jest DNS. Jeśli oba testy zawiodą, najpierw sprawdź interfejs, trasę, bramę, sieć VLAN, powiązanie Wi-Fi, zaporę sieciową lub sieć nadrzędną. Zmiana DNS nie naprawi brakującej trasy domyślnej.
Bezpośrednie polecenie ping IP kończy się powodzeniem, natomiast rozwiązanie debian.org kończy się niepowodzeniem. Jest to dobry znak, że łączność istnieje, ale rozwiązywanie nazw DNS nie działa.
Aby uzyskać bardziej deterministyczne sprawdzenie routingu, uruchom także:
ip address
ip route
Zwykle powinieneś mieć adres oczekiwanego interfejsu i trasę domyślną. Dokładna nazwa interfejsu może brzmieć enp1s0, ens160, eth0lub coś innego.
2. Sprawdź, czy systemd-resolved jest faktycznie używany
Nie zakładaj, że jest on obecny tylko dlatego, że komputer korzysta z systemd. Sprawdź zarówno pakiet, jak i usługę:
dpkg -s systemd-resolved 2>/dev/null | grep '^Status'
systemctl status systemd-resolved --no-pager
resolvectl status
Jeśli pakiet jest nieobecny, a na komputerze działa inna, działająca konfiguracja zarządzania DNS, instalacja systemd-resolvednie jest automatycznie właściwym rozwiązaniem. Jeśli system powinien z niego korzystać, a usługa jest zainstalowana, ale zatrzymana, włącz ją i uruchom:
sudo systemctl enable --now systemd-resolved
Jeśli to polecenie nie zadziała, przed ponownym uruchomieniem usługi sprawdź dzienniki:
journalctl -u systemd-resolved -b --no-pager
3. Przed zastąpieniem pliku /etc/resolv.conf sprawdź jego poprawność
Najczęstszym błędem konfiguracyjnym jest traktowanie /etc/resolv.confpliku jako izolowanego. Dzięki temu systemd-resolvedplik może działać w kilku obsługiwanych trybach. Zalecany przez upstream tryb szczątkowy łączy się /etc/resolv.confz /run/systemd/resolve/stub-resolv.conf, który kieruje tradycyjnych klientów DNS do 127.0.0.53. Inny prawidłowy tryb łączy się z /run/systemd/resolve/resolv.conf, który bezpośrednio udostępnia znane serwery upstream, ale traci routing DNS dla każdego łącza systemd-resolved dla aplikacji, które odczytują ten plik bezpośrednio.
ls -l /etc/resolv.conf
cat /etc/resolv.conf
Przed zmianą pliku /etc/resolv.conf sprawdź, czy jest on zwykłym plikiem czy dowiązaniem symbolicznym; różni menedżerowie sieci korzystają z różnych modeli własności.
Zwykły plik nie jest automatycznie błędny. NetworkManager lub inny menedżer resolverów może celowo przejąć nad nim kontrolę. Jeśli jednak ten host jest zaprojektowany do korzystania z trybu szczątkowego rozwiązywanego przez systemd, nieaktualny zwykły plik, nieaktualne dowiązanie symboliczne lub plik wskazujący na nieosiągalne serwery nazw może spowodować błędy wyszukiwania.
Przywróć zalecane łącze szczątkowe, gdy tryb szczątkowy jest zamierzony
Gdy ten host celowo używa systemd-resolved w trybie szczątkowym, plik /etc/resolv.conf może wskazywać na utrzymywany plik szczątkowy w pliku /run/systemd/resolve/stub-resolv.conf.
Oczekiwane jest, że plik szczątkowy będzie widoczny nameserver 127.0.0.53. Jest to lokalny odbiornik, a nie serwer DNS nadrzędny. Użyj tego polecenia resolvectl status, aby sprawdzić, z którymi serwerami nadrzędnymi systemd-resolved faktycznie się skontaktuje. To rozróżnienie jest udokumentowane w podręczniku systemd-resolved Bookworm .
4. Sprawdź, czy systemd-resolved ma użyteczny serwer DNS
Uruchomić:
resolvectl status
Skoncentruj się na łączu, które przenosi trasę domyślną. Prawidłowa konfiguracja powinna zazwyczaj uwzględniać jeden lub więcej serwerów DNS dla tego łącza lub odpowiednie globalne serwery DNS. Jeśli nie ma dostępnego serwera DNS, samo naprawienie dowiązania symbolicznego nie pomoże: lokalny stub nie ma dokąd wysyłać zapytań.
Możesz przetestować resolver bezpośrednio:
resolvectl query debian.org
W podręczniku Debiana resolvectl udokumentowano status, query, flush-caches, oraz polecenia DNS dla poszczególnych łączy służące do inspekcji i rozwiązywania problemów.
5. Jeśli właścicielem interfejsu jest NetworkManager, napraw DNS w profilu połączenia
W instalacjach na komputerach stacjonarnych i wielu systemach Debian ogólnego przeznaczenia, NetworkManager może udostępniać dane DNS dla każdego łącza do systemd-resolved. Najpierw zidentyfikuj aktywny profil i aktualne wartości DNS:
nmcli connection show --active
nmcli device show
W systemach NetworkManager należy sprawdzać i zmieniać ustawienia DNS w profilu połączenia zamiast wielokrotnie ręcznie edytować plik /etc/resolv.conf.
Jeśli DHCP dostarcza nieprawidłowy serwer DNS, zmień profil NetworkManager, zamiast edytować go /etc/resolv.confpo każdym ponownym uruchomieniu. Na przykład, jeśli Twoja polityka sieciowa zezwala na publiczne resolvery:
6. Jeśli interfejs jest własnością systemd-networkd, skonfiguruj DNS dla każdego łącza
W przypadku serwerów korzystających z systemd-networkd, umieść ustawienia DNS w odpowiednim .networkpliku w /etc/systemd/network/. Prosty przykład oparty na DHCP to:
UseDNS=noMa to znaczenie, gdy chcesz zignorować serwery DNS dostarczane przez DHCP. Bez tego, serwer DNS DHCP jest używany domyślnie. Domains=~.to domena routingu tylko dla głównego serwera DNS, dzięki czemu łącze to nadaje się do zapytań, które nie pasują do bardziej szczegółowej domeny routingu. Nie dodawaj go bezmyślnie w systemach z wieloma adresami lub VPN, gdzie podział DNS jest celowy.
sudo systemctl restart systemd-networkd
resolvectl status ens160
W przypadku systemd-networkd, DNS można zdefiniować dla każdego łącza w pliku .networkd, a następnie zweryfikować przy użyciu resolvectl.
7. Używaj globalnego pliku solved.conf tylko wtedy, gdy naprawdę chcesz mieć dostęp do DNS w całym systemie
/etc/systemd/resolved.conflub w sekcji „drop-in” /etc/systemd/resolved.conf.d/można zdefiniować serwery DNS systemu. Jest to przydatne w przypadku polityki obejmującej cały host, ale jest mniej precyzyjne niż konfiguracja dla każdego łącza na komputerach z sieciami VPN, wieloma interfejsami lub prywatnymi strefami DNS.
Lokalne dodawanie jest zazwyczaj bardziej przejrzyste niż edycja głównego pliku w stylu dostawcy:
sudo systemctl restart systemd-resolved
resolvectl status
W podręczniku Debian solved.conf wyjaśniono, że DNS=serwery DNS systemu i ustawienia administratora /etc/systemd/resolved.conf.d/mają pierwszeństwo przed konfiguracją o niższym priorytecie.
8. Opróżnij pamięć podręczną dopiero po naprawieniu konfiguracji bazowej
Nieaktualna pamięć podręczna może utrudniać rozwiązywanie problemów, ale opróżnianie pamięci podręcznej nie zastępuje naprawy niedostępnego serwera nadrzędnego lub uszkodzonej konfiguracji łącza. Po wprowadzeniu rzeczywistej zmiany w konfiguracji można uruchomić:
Po poprawieniu konfiguracji DNS, pamięć podręczną należy opróżniać tylko wtedy, gdy będzie to potrzebne przy rozwiązywaniu problemów, a nazwę hosta należy sprawdzić bezpośrednio przez systemd-resolved.
W dokumentacji Systemd zaznaczono, że pamięć podręczna jest zwykle opróżniana automatycznie po zmianie konfiguracji sieci, więc wielokrotne ręczne opróżnianie pamięci podręcznej nie powinno być podstawowym rozwiązaniem.
9. Przeczytaj dziennik programu rozwiązującego błąd, jeśli błąd nadal występuje
Jeśli resolvectl statuswydaje się to rozsądne, ale zapytania nadal przekraczają limit czasu, sprawdź dziennik programu rozwiązującego problemy lokalne:
Dziennik rozwiązany przez systemd może ujawnić awarie serwerów nadrzędnych, obniżoną jakość obsługi protokołów i zachowanie awaryjne.
Sprawdź, czy nie występują powtarzające się przekroczenia limitu czasu serwera, zmiany serwera zapasowego, błędy walidacji DNSSEC lub komunikaty wskazujące na ograniczone funkcje protokołu. Serwer resolwerowy może działać normalnie, podczas gdy jego skonfigurowany serwer nadrzędny jest niedostępny przez zaporę sieciową, sieć VPN, zasady routingu lub listę kontroli dostępu (ACL).
10. Sprawdź pełną ścieżkę wyszukiwania
Nie zatrzymuj się po jednym udanym resolvectlzapytaniu. Sprawdź ścieżkę używaną przez normalne aplikacje:
Na koniec przetestuj zarówno ścieżkę rozwiązywania problemów systemowych, jak i aplikację, która pierwotnie nie działała, np. apt.
getentjest przydatny, ponieważ wyszukiwanie nazw hostów w glibc podąża za hosts:linią w /etc/nsswitch.conf. Jeśli resolvectl querysię powiedzie, ale nie powiedzie, sprawdź konfigurację NSS. Podręcznik nss-resolvegetent Debiana opisuje opcjonalny moduł i zalecaną kolejność, która może kierować wyszukiwania nazw hostów w glibc przez systemd-resolved, zachowując jednocześnie mechanizmy awaryjne.libnss-resolve
Typowe objawy i najczęstsze miejsca, w których należy szukać
Objaw
Prawdopodobny obszar
Następne sprawdzenie
Łączność IP działa, ale wszystkie nazwy hostów zawodzą
Ścieżka NSS lub resolvera specyficzna dla aplikacji
getent ahostsI/etc/nsswitch.conf
DNS ulega awarii po ponownym uruchomieniu lub połączeniu
Konfiguracja należąca do menedżera sieci
NetworkManager lub profil systemd-networkd
Nazwy publiczne działają, nazwy wewnętrzne zawodzą
Podział DNS, VPN, routing domen
Serwery DNS per-link i Domains=wresolvectl status
Tylko jedna aplikacja nie działa
Aplikacja, kontener, serwer proxy lub niestandardowy resolver
Porównaj tę aplikację z getentiresolvectl query
Zalecana kolejność naprawy
Sprawdź, czy istnieje podstawowa łączność sieciowa i domyślna trasa.
Sprawdź, czy systemd-resolvedfaktycznie zamierzasz zarządzać usługą DNS na tym hoście.
Sprawdź systemd-resolvedstan usługi i resolvectl status.
/etc/resolv.confPrzed zmianą sprawdź własność i tryb dowiązania symbolicznego.
Jeżeli tryb szczątkowy jest zamierzony, przywróć stub-resolv.confłącze.
Napraw upstream DNS u aktualnego właściciela: NetworkManager, systemd-networkd, DHCP, VPN lub globalnie rozwiązana konfiguracja.
Pamięć podręczną należy opróżnić dopiero po poprawieniu konfiguracji.
Sprawdź za pomocą resolvectl, getent, i aplikacji, która pierwotnie uległa awarii.
Kluczową zasadą jest własność: /etc/resolv.confsystemd-resolved i menedżer sieci są częściami jednego łańcucha resolverów. Trwała poprawka zmienia DNS na poziomie, który jest jej właścicielem, zamiast wielokrotnie zastępować ostatecznie wygenerowany plik.