Zastaralý resolv.conf
Když se podíváme zpět na naše technické začátky, většina z nás si pamatuje, jak jsme se museli spoléhat na soubor resolv.conf
. Tento malý, ale mocný soubor byl naším oknem do světa DNS – byl to náš osobní průvodce, který nám pomáhal přetvářet názvy domén na IP adresy. Každý administrátor, ať už zkušený nebo nováček, si s ním musel nějakou dobu hrát. Pak přišel systemd a s ním i systemd-resolved, a naše oblíbené resolv.conf
se začalo chovat jako starý známý, který se najednou rozhodl, že už nebude tak spolehlivý, jak jsme si mysleli.
Dnes víme, že resolv.conf
už není tím, čím býval. Místo toho se jeho obsah generuje a spravuje prostřednictvím systemd-resolved, který ve výchozím nastavení nasměruje všechny DNS dotazy na adresu 127.0.0.53
. Pro některé starší správce, kteří si na tuto změnu ještě nezvykli, to může být jako skok do neznáma. Proč bychom měli důvěřovat něčemu, co se neustále mění a co nám vlastně říká, že už nemáme plnou kontrolu nad tím, co se děje s našimi DNS dotazy?
Mnozí z nás, kteří jsme strávili roky jako systémoví administrátoři a postupně časem někteří jako „devopsáci“, jsme zvyklí na to, že máme věci pod kontrolou. Přesně víme, kde co najdeme, a jak to funguje. Najednou tady máme tuto novou abstrakci, která se snaží zjednodušit naše životy, ale ve skutečnosti může způsobit více zmatku než užitku. Proč by se měl někdo vzdát kontroly nad něčím tak základním, jako je DNS?
Rozhodl jsem se tedy tuto problematiku podrobně prozkoumat. Co vlastně systemd-resolved dělá? Jaké jsou jeho výhody a nevýhody? A co je nejdůležitější: proč bychom měli přehodnotit své názory na tuto novou technologii? Pojďme se na to podívat zblízka a pokusme se rozplést tento zmatek kolem DNS, který se zdá být, jak jinak než, nevyhnutelným krokem vpřed v našem neustále se vyvíjejícím světě IT.
Jak to vlastně funguje v Linuxu
Pojďme se podívat na to, jak k celému procesu Linux přistupuje. Když se podíváme na to, jak většina linuxových programů v C řeší DNS, zjistíme, že se spoléhají na standardní knihovnu libc. Právě tato knihovna obsahuje funkce jako gethostbyname
, které nám umožňují vyhledávat IP adresy na základě doménového jména. Jakmile program zavolá tuto funkci, libc se dostane do hry a začne hledat, jak a kde získat potřebné informace.
Ale jak přesně ví, kde hledat? Tady přichází na scénu soubor nsswitch.conf
. Ten určuje, jakým způsobem se mají různé služby a databáze dotazovat na informace v systému. Pro DNS resolvování je klíčový, protože určuje, jaký mechanismus použít pro získávání informací o doménách. Typicky obsahuje záznam pro hosts, který může vypadat například takto:
hosts: files dns
Toto nastavení říká systému, aby nejprve hledal v lokálních souborech (např. /etc/hosts
) a poté se obrátil na DNS servery definované v resolv.conf
. Takto se zajišťuje, že pokud je doménové jméno dostupné lokálně, systém ho najde rychleji, než by musel provádět síťové dotazy.
Jakmile se tedy gethostbyname
rozhodne, že potřebuje zjistit IP adresu pro dané doménové jméno, zavolá nsswitch.conf
, aby zjistil, jaký mechanismus použít. Pokud je v konfiguraci uvedeno dns
, libc se pokusí použít DNS resolver, který v minulosti spoléhal na resolv.conf
. Tady začíná náš příběh o inovacích.
S postupem času se ukázalo, že tradiční přístup k resolvování DNS má své limity. V současném světě IT je tento klasický systém už nedostatečný. Zde přichází systemd-resolved, který přináší několik klíčových vylepšení:
- Zjednodušení správy:
systemd-resolved
centralizuje správu DNS, což znamená, že všechny aplikace mohou využívat stejný resolver a sdílet informace o DNS. - Podpora více protokolů: Nový systém podporuje nejen tradiční DNS, ale i nové protokoly jako mDNS a LLMNR, což umožňuje efektivnější lokální resolvování.
- Kešování: systemd-resolved implementuje kešování, což znamená, že opakované dotazy na stejné doménové jméno jsou rychlejší a šetří síťové zdroje.
Víme, že starý systém resolvování, ačkoliv byl funkční, potřeboval modernizaci. Právě proto jsme dnes svědky přechodu na systemd-resolved, který se snaží poskytnout efektivnější, rychlejší a uživatelsky přívětivější způsob, jak spravovat DNS dotazy v linuxovém prostředí.
Až příště zavoláte gethostbyname
, vzpomeňte si na to, jak daleko jsme se dostali od jednoduchého resolv.conf
a jak moc se změnil způsob, jakým se dnes díváme na DNS resolvování.
Zde je jednoduchý příklad zdrojového kódu v jazyce C, který používá funkci gethostbyname
k resolvování doménového jména seznam.cz na jeho IP adresu.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <arpa/inet.h>
int main() {
const char *hostname = "seznam.cz";
struct hostent *host;
struct in_addr **addr_list;
// Získání informací o hostiteli
host = gethostbyname(hostname);
if (host == NULL) {
herror("gethostbyname");
return 1;
}
// Získání seznamu IP adres
addr_list = (struct in_addr **)host->h_addr_list;
// Vypíše všechny nalezené IP adresy
for (int i = 0; addr_list[i] != NULL; i++) {
printf("IP adresa pro %s: %s\n", hostname, inet_ntoa(*addr_list[i]));
}
return 0;
}
Nové začátky s libnss-resolve
S příchodem systemd-resolved a jeho novými funkcemi se také objevila nová knihovna, která se stala klíčovým prvkem pro modernizaci DNS resolvování v Linuxu – libnss-resolve
. Tato knihovna je součástí systému Name Service Switch (NSS) a poskytuje rozhraní pro rychlejší a efektivnější resolvování DNS dotazů, než jaké nabízela tradiční libc.
Jednou z nejvýznamnějších výhod libnss-resolve je její schopnost poskytovat rychlejší API pro DNS dotazy. Na rozdíl od klasických DNS resolverů, které často využívají synchronní volání a čekají na odpověď, libnss-resolve implementuje asynchronní přístup, což znamená, že aplikace mohou pokračovat v běhu, zatímco čekají na výsledky DNS dotazů. To je zvlášť užitečné v moderních aplikačních architekturách, kde se očekává vysoký výkon a nízká latence.
Pokud chcete tuto knihovnu využít na svém Ubuntu serveru, je to poměrně jednoduché. Stačí nainstalovat balíček libnss-resolve
, což můžete provést příkazem:
sudo apt install libnss-resolve
Po instalaci je nutné upravit soubor nsswitch.conf
, aby systém věděl, že má používat novou knihovnu pro DNS resolvování. Příklad úpravy může vypadat takto:
hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns
Tímto způsobem zajistíte, že systém se obrátí na libnss-resolve
.
Zajímavé je, že pro zajištění kompatibility se staršími verzemi libc a také s aplikacemi napsanými například v Go, které nemusejí využívat standardní knihovnu libc, je v systému stále přítomen stub resolver. Ten je reprezentován symbolickým odkazem v resolv.conf
, který ukazuje na 127.0.0.53
, což je adresa, na kterou systemd-resolved naslouchá.
Pokud byste se rozhodli tento symbolický odkaz ručně přepsat, zjistíte, že se automaticky vrátí zpět na původní hodnotu. Nástroj systemd-resolved
totiž automaticky detekuje změny a obnoví odkaz, aby zajistil, že DNS dotazy budou stále správně směrovány.
Pokud byste však chtěli experimentovat s tradičním způsobem resolvování, můžete symbolický odkaz ze souboru resolv.conf
na soubor /run/systemd/resolve/stub-resolv.conf
smazat a vytvořit klasický soubor resolv.conf
, kde můžete definovat své vlastní DNS servery. Tímto způsobem se můžete vrátit ke starým metodám, i když to může znamenat, že ztratíte některé výhody, které systemd-resolved nabízí.
Konfigurace a správa s systemd-resolved
Když mluvíme o systemd-resolved
, nemůžeme opomenout soubor resolved.conf
, který hraje klíčovou roli v nastavení DNS serverů, které systém používá. Tento soubor se obvykle nachází v /etc/systemd/resolved.conf
a umožňuje uživatelům specifikovat, jaké DNS servery mají být použity pro resolvování. Například, pokud bychom chtěli nastavit Google DNS servery, mohli bychom upravit resolved.conf takto:
[Resolve]
DNS=8.8.8.8 8.8.4.4
FallbackDNS=1.1.1.1
Tímto způsobem říkáme systému, aby používal Google DNS servery (8.8.8.8 a 8.8.4.4) a jako záložní server Cloudflare (1.1.1.1). Po provedení změn je nutné restartovat systemd-resolved, aby se nové nastavení projevilo:
sudo systemctl restart systemd-resolved
Dalším užitečným nástrojem, který přichází s systemd-resolved, je příkaz resolvectl
. Tento příkaz umožňuje nejen provádět DNS dotazy, ale také poskytuje informace o aktuálním stavu resolvování. Například, pokud chcete vyřešit doménové jméno, můžete jednoduše použít:
resolvectl query seznam.cz
Tento příkaz vrátí IP adresu, která odpovídá zadanému doménovému jménu, a také další relevantní informace, jako jsou TTL (time-to-live) a použité DNS servery.
Pokud chcete získat informace o aktuálním stavu DNS resolvování, můžete použít:
resolvectl status
Tento příkaz vám poskytne přehled o všech aktuálně nastavených DNS serverech, jejich stavu a dalších užitečných informacích.
Změna zaběhlých pořádků
Na závěr bych chtěl říct, že i když systemd-resolved přináší mnoho výhod a zjednodušuje správu DNS, rozumím tomu, že někteří uživatelé by se mohli chtít vrátit ke starým pořádkům. Pokud byste se rozhodli pro tuto cestu, máte stále k dispozici dvě možnosti: buď přepsat soubor resolved.conf
, nebo smazat symbolický odkaz v /etc/resolv.conf
a vytvořit nový soubor s vlastním nastavením.
Osobně jsem si vyzkoušel, jak systemd-resolved funguje, a musím říct, že resolvování přes tento systém je znatelně rychlejší než u tradičních metod. Považuji to za krok vpřed v oblasti správy DNS.