Síť v Linuxu

ip, DNS, /etc/hosts, porty, ss.

Síť je to, co spojí tvůj počítač se zbytkem světa — s routerem doma, s webem, se serverem v cloudu. V Linuxu se skoro všechno kolem sítě dá zjistit a nastavit z terminálu pár příkazy: jakou máš IP adresu, kudy data odcházejí ven (brána/gateway), jak se jméno jako github.com mění na IP, a co na tvém stroji zrovna poslouchá na síti. Až pochopíš těch pár vrstev, přestane být „nefunguje mi internet" magie — a stane se z toho pár otázek, na které umíš odpovědět.


Pár pojmů na úvod

  • IP adresa = číselná adresa počítače v síti, něco jako telefonní číslo. Verze IPv4 vypadá jako 192.168.1.42, novější IPv6 jako 2001:db8::1. Podle ní ostatní vědí, kam ti poslat data.
  • Síťové rozhraní (NIC / interface) = „zásuvka do sítě". Fyzická karta (eth0, enp3s0), Wi-Fi (wlan0, wlp2s0) nebo virtuální (lo, docker0). Každé může mít vlastní IP.
  • Brána (gateway / default route) = router, kterému stroj předá data, když cíl není v místní síti. Bez ní se dostaneš tak akorát na souseda v LAN, ale ne na internet.
  • DNS = telefonní seznam internetu. Překládá jména (example.com) na IP adresy, protože lidé si pamatují jména a počítače potřebují čísla.
  • Port = číslo „dveří" na jedné IP adrese. Web běží typicky na portu 80/443, SSH na 22. Jedna IP, hodně portů — každá služba má svoje.
  • Loopback (127.0.0.1, localhost) = adresa „já sám". Data po ní nikdy neopustí počítač; slouží k tomu, aby spolu mluvily programy na jednom stroji.

IP adresa a rozhraní — kdo jsem v síti

Každý počítač v síti má aspoň jednu IP adresu a aspoň jedno rozhraní, přes které je připojený. Rozhraní si představ jako konkrétní kabel nebo Wi-Fi anténu; IP adresa je číslo, které na tom rozhraní „visí". Vypíšeš je příkazem ip addr (zkráceně ip a):

ip addr
# nebo krátce
ip a

Typický výstup (zkráceno):

1: lo: <LOOPBACK,UP,LOWER_UP> ...
    inet 127.0.0.1/8 scope host lo
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
    inet 192.168.1.42/24 scope global dynamic enp3s0

Co z toho čteš:

  • lo je loopback — vždy tam je, vždy má 127.0.0.1. K němu se dostaneme níž.
  • enp3s0 je fyzické rozhraní, které má IP 192.168.1.42. To /24 je maska sítě — říká, které adresy jsou „místní" (tady 192.168.1.0192.168.1.255).
  • UP znamená, že rozhraní je aktivní. Když tam UP chybí, rozhraní je vypnuté a síť po něm nejede.

💡 Adresy 192.168.x.x, 10.x.x.x a 172.16–31.x.x jsou privátní — používají se v domácích a firemních sítích a na veřejném internetu je nikdo nevidí přímo. Ven jdeš přes router, který je „přeloží" na svou veřejnou IP (NAT).


Kudy data odcházejí ven — brána a routovací tabulka

IP adresa ti řekne, kdo jsi. Ale když chceš poslat data na github.com, počítač musí vědět kudy. K tomu slouží routovací tabulka — seznam pravidel „pro tenhle rozsah adres jdi tudy". Vypíšeš ji:

ip route
# nebo krátce
ip r
default via 192.168.1.1 dev enp3s0 proto dhcp ...
192.168.1.0/24 dev enp3s0 proto kernel scope link src 192.168.1.42

Dva řádky, dvě pravidla:

  • 192.168.1.0/24 dev enp3s0 — „adresy v mojí místní síti pošli přímo přes enp3s0". Soused v LAN je na dosah bez routeru.
  • default via 192.168.1.1default route neboli brána. „Cokoli, co nesedí na žádné konkrétnější pravidlo (= zbytek světa), pošli routeru 192.168.1.1." Ten to pošle dál.

Bez řádku default via ... se dostaneš jen do místní sítě a internet nejede — i když máš IP a kabel v pořádku. To je jeden z nejčastějších tichých problémů (viz Failure modes).


DNS — jak se jméno mění na IP

Do prohlížeče píšeš github.com, ale síť pracuje s IP adresami. Překlad jména na IP obstarává DNS. Když se zeptáš na github.com, počítač pošle dotaz na DNS server (typicky ten od providera nebo router) a dostane zpátky IP, na kterou se pak teprve připojí.

Kde je nastavené, koho se ptát:

  • /etc/resolv.conf — klasický soubor se seznamem DNS serverů (nameserver 1.1.1.1). Historicky ho ladíš tady, ale na moderních systémech ho často spravuje automat a ručně editovat nemá smysl.
  • systemd-resolved — na Fedoře, Ubuntu a spol. běžně vyřizuje DNS tahle služba. /etc/resolv.conf pak bývá jen symlink na ni (127.0.0.53). Stav zjistíš:
    resolvectl status
    
  • /etc/hosts — malý ruční seznam „jméno → IP", který se prohlíží dřív než DNS. Zápis 127.0.0.1 localhost je tam vždycky. Když sem přidáš řádek, přebije DNS pro to jméno:
    # /etc/hosts
    192.168.1.50   muj-server.local
    

🚩 /etc/hosts je mocný, ale zákeřný: když sem někdy něco napíšeš a zapomeneš na to, jméno bude ukazovat „napořád" na tvou ručně zadanou IP a žádný DNS s tím nehne. První místo, kam kouknout, když se jméno chová divně.

Ověřit, jak se konkrétní jméno překládá:

dig github.com +short      # jen výsledné IP
host github.com            # čitelněji, i zpětně
getent hosts github.com    # funguje vždy (dig/host bývají v balíku bind-utils/dnsutils, nemusí být)

Porty a co poslouchá

Na jedné IP adrese může běžet spousta služeb naráz — rozlišují se portem. Když chceš vědět, co na tvém stroji naslouchá (čeká na příchozí spojení), použiješ ss:

ss -tulpn

Co znamenají ta písmenka:

  • t = TCP, u = UDP (dva hlavní typy spojení),
  • l = jen naslouchající sokety (listening),
  • p = ukaž proces (který program to je) — často chce sudo, jinak neuvidíš cizí,
  • n = čísla místo jmen (nepřekládej porty na názvy, je to rychlejší a jasnější).

Ukázka výstupu:

Netid  State   Local Address:Port   Process
tcp    LISTEN  127.0.0.1:5432       postgres
tcp    LISTEN  0.0.0.0:22           sshd

Klíčový detail je Local Address:

  • 127.0.0.1:5432 — služba poslouchá jen na loopbacku. Dostane se k ní pouze program na tomtéž počítači. Zvenčí je neviditelná. (Tak je správně schovaná databáze.)
  • 0.0.0.0:22 — poslouchá na všech rozhraních, tedy i směrem do sítě. Kdokoli, kdo na stroj vidí (a projde firewallem), se může připojit.

Ten rozdíl 127.0.0.1 vs 0.0.0.0 je jeden z nejdůležitějších v celé kapitole — plete si ho spousta lidí a vede to buď k „proč se nemůžu připojit", nebo naopak k nechtěně vystavené službě.


Diagnostika — když něco nejede

Pár nástrojů, kterými rozklíčuješ „nefunguje mi internet" na konkrétní příčinu:

ping 1.1.1.1          # jde vůbec konektivita? (odpovídá vzdálená IP?)
ping github.com       # jde konektivita PŘES DNS? (funguje překlad jména?)
dig github.com        # jak se jméno překládá na IP (a odkud)
host github.com       # totéž, čitelněji
curl -I https://github.com   # skutečně navážu HTTP spojení? (hlavičky odpovědi)
wget -qO- https://example.com   # stáhni obsah (rychlá zkouška, že web odpovídá)
traceroute github.com   # kudy data putují — kde se cesta zasekne

Logika je vždycky od nejnižší vrstvy nahoru:

  1. ping 1.1.1.1 — mluví stroj vůbec ven? Když ne, problém je nízko (rozhraní, brána, kabel).
  2. ping github.com — pokud IP pinguje, ale jméno ne, je rozbité DNS (viz Failure modes).
  3. curl/wget — spojení navázané, teď jde o konkrétní službu (odpovídá web? správný port?).
  4. traceroute — ukáže každý „skok" (router) po cestě; kde přestanou přibývat, tam je zádrhel.

💡 ping posílá tzv. ICMP pakety. Některé servery (a firewally) ping schválně ignorují — takže „neodpovídá na ping" ještě nutně neznamená „je mrtvý". Proto se hodí zkusit i curl na konkrétní port.


NetworkManager a nmcli (krátce)

Na desktopu i na spoustě serverů síť spravuje NetworkManager — služba, která se stará o připojení (zapamatuje si Wi-Fi, přidělí IP přes DHCP, nastaví DNS). Ovládat ji z terminálu umí nmcli:

nmcli device status         # přehled rozhraní a jejich stavu
nmcli connection show       # uložená připojení (profily)
nmcli device wifi list      # dostupné Wi-Fi sítě
nmcli device wifi connect "NazevSite" password "heslo"

💡 Příkazy ip jen ukazují a mění stav teď hned (a po rebootu se to ztratí). NetworkManager naopak drží trvalou konfiguraci. Proto: ip a a ip r na koukání a rychlou diagnostiku, nmcli (nebo GUI) na trvalé nastavení.


Loopback — 127.0.0.1 a localhost

Rozhraní lo a adresa 127.0.0.1 (jméno localhost) jsou zvláštní: data po nich nikdy neopustí počítač. Slouží k tomu, aby spolu mohly mluvit programy na jednom stroji — třeba tvá aplikace se připojí na databázi „na localhost:5432", i když je fyzicky na stejném počítači.

Proč je to užitečné:

  • Bezpečnost — služba, která poslouchá jen na 127.0.0.1, je zvenčí nedosažitelná. Ideální pro věci, které nemají co dělat na internetu (databáze, interní admin).
  • Vývojnpm run dev typicky nastartuje web na http://localhost:3000; vidíš ho jen ty.
  • Vždy funguje — loopback jede, i když nemáš žádnou síť ani kabel. ping 127.0.0.1 je test, že vůbec funguje síťová vrstva jádra.

Failure modes — časté omyly začátečníků

  • „Internet nejede" = vždycky DNS? Ne vždy, ale často. Rozliš to: ping 1.1.1.1 jde, ale ping github.com ne → konektivita je v pořádku, rozbité je DNS (překlad jména na IP). Když nejde ani ping 1.1.1.1, je problém níž (rozhraní, brána).
  • Zapomenutá brána (default route). Máš IP, rozhraní je UP, souseda v LAN pingneš — ale internet nikde. Podívej se do ip route, jestli tam vůbec je řádek default via .... Bez něj data ven nemají kudy odejít.
  • Služba poslouchá jen na 127.0.0.1 místo 0.0.0.0. Aplikace „běží", ale z jiného počítače se na ni nepřipojíš — protože poslouchá jen na loopbacku. Zkontroluj ss -tulpn a Local Address. (Opačný průšvih: nechtěně nasloucháš na 0.0.0.0 a vystavíš do sítě něco, co nemáš.)
  • /etc/hosts tiše přepisuje DNS. Jméno ukazuje na „špatnou" IP a dig přitom vrací něco jiného? Podívej se do /etc/hosts — ruční záznam tam přebíjí DNS a snadno se na něj zapomene.
  • Změna přes ip po rebootu zmizí. ip addr add ... nastaví adresu jen dočasně. Trvale to patří do NetworkManageru (nmcli) — jinak se po restartu diví, kam se nastavení podělo.

🛠️ Cvičení

  1. Kdo jsem a kudy jdu ven. Najdi svou IP adresu a rozhraní, na kterém visí, a pak zjisti adresu své brány (default route). Které dva příkazy k tomu potřebuješ a kde v jejich výstupu ty údaje jsou?
  2. Rozliš DNS od konektivity. Bez googlení popiš, čím ověříš, že problém je v DNS a ne v připojení. Které dva pingy a v jakém pořadí, a co který výsledek znamená?
  3. Co na mně poslouchá. Vypiš naslouchající služby na svém stroji a u každé rozhodni, jestli je dostupná jen lokálně, nebo i ze sítě. Podle čeho to poznáš?
  4. Přebij DNS přes /etc/hosts. Vysvětli, jak bys donutil jméno test.local ukazovat na 127.0.0.1, aniž bys sahal na jakýkoli DNS server. Proč to zabere?
  5. Přelož jméno na IP dvěma způsoby. Zjisti IP adresu example.com a pak vysvětli, proč ping na to jméno může selhat, i když samotný překlad na IP funguje.
Náčrt řešení — rozbal, až si cvičení zkusíš sám
  1. IP + brána — IP a rozhraní vypíše ip addr (ip a): hledáš řádek inet ... u svého rozhraní (např. enp3s0), ne u lo. Bránu vypíše ip route (ip r): řádek default via <IP> dev ... — ta IP za via je tvoje brána. Pozor: pokud řádek default v ip route chybí, ven se nedostaneš ani s platnou IP.
  2. DNS vs konektivita — nejdřív ping 1.1.1.1 (ping na IP, DNS se neúčastní): když odpovídá, konektivita ven funguje. Pak ping github.com (ping na jméno, nejdřív se musí přeložit přes DNS): když IP pinguje, ale jméno ne, je rozbité DNS. Když nejde ani ping 1.1.1.1, problém je níž (rozhraní/brána). Pozor: některé servery ping ignorují — jako cíl ber spolehlivou IP.
  3. Naslouchající službyss -tulpn (klidně se sudo, ať vidíš i cizí procesy). Rozhoduje sloupec Local Address: 127.0.0.1:PORT = dostupné jen lokálně, 0.0.0.0:PORT (nebo *, resp. :: u IPv6) = poslouchá i do sítě. Pozor: p vyžaduje práva, jinak u cizích služeb neuvidíš jméno procesu.
  4. /etc/hosts přebíjí DNS — do /etc/hosts přidáš řádek 127.0.0.1 test.local (jako root). Zabere to, protože systém prohlíží /etc/hosts dřív než se ptá DNS serveru — najde-li jméno tam, dál se neptá. Pozor: snadno se na takový záznam zapomene a pak se divíš, proč jméno ukazuje „nesmysl", který žádný DNS nepotvrdí.
  5. Překlad vs ping — IP zjistíš dig example.com +short nebo host example.com. ping na jméno může selhat i při funkčním překladu, protože ping (ICMP) může být na cílovém serveru nebo firewallu blokovaný — jméno se přeloží na IP správně, ale server na ping schválně neodpovídá. Pozor: „neodpovídá na ping" tedy neznamená automaticky „je nedostupný"; zkus curl -I https://example.com.

🧠 Otázky & odpovědi

Jaký je rozdíl mezi IP adresou a portem?

IP adresa identifikuje počítač v síti (kam poslat data) — třeba 192.168.1.42. Port je číslo „dveří" na té adrese, které rozliší jednotlivé služby na stejném stroji — web na 443, SSH na 22, databáze na 5432. Přirovnání: IP je adresa domu, port je číslo bytu. Jedno spojení je vždycky určené dvojicí IP + port, proto na jedné IP může běžet spousta služeb naráz, aniž by si překážely.

Ping na IP funguje, ale na jméno ne — co se děje?

Konektivita je v pořádku, ale rozbité je DNS. Ping na IP (ping 1.1.1.1) žádný překlad nepotřebuje, takže projde. Ping na jméno (ping github.com) musí jméno nejdřív přeložit na IP přes DNS — a když DNS neodpovídá nebo je špatně nastavené, ping selže ještě před odesláním. Zkontroluj, koho se stroj ptá (resolvectl status, /etc/resolv.conf) a jestli ti jméno přeloží dig github.com. Časté i to, že překlad kazí zapomenutý záznam v /etc/hosts.

Co znamená, že služba poslouchá na 127.0.0.1 versus 0.0.0.0?

127.0.0.1 je loopback — služba je dostupná jen z toho samého počítače, zvenčí je neviditelná. 0.0.0.0 znamená všechna rozhraní — služba poslouchá i směrem do sítě, takže se k ní může připojit kdokoli, kdo na stroj vidí (a projde firewallem). Pro interní věci (databáze, admin panel) chceš 127.0.0.1; pro službu, která má být dostupná zvenčí (třeba web server), potřebuješ 0.0.0.0. Který je který, zjistíš ve sloupci Local Address v ss -tulpn.

K čemu je brána (default route) a jak poznám, že mi chybí?

Brána je router, kterému stroj předá data pokaždé, když cíl není v místní síti — tedy prakticky pro celý internet. Bez ní se dostaneš jen na počítače ve stejné LAN, ale ven ne. Poznáš to tak, že máš platnou IP a rozhraní je UP, souseda v síti pingneš, ale ping 1.1.1.1 selže. Ověříš příkazem ip route: musí tam být řádek začínající default via <IP> .... Když chybí, data ven nemají kudy odejít — a žádné DNS ani kabel s tím nepohnou.

Proč /etc/hosts přebíjí DNS a kdy se to hodí?

Protože systém při překladu jména prohlíží nejdřív /etc/hosts a teprve když jméno nenajde, ptá se DNS serveru. Najde-li ho v souboru, dál se neptá — takže ruční záznam „vyhraje" nad čímkoli, co říká DNS. Hodí se to na testování (nasměruješ si muj-web.local na 127.0.0.1 bez zásahu do DNS), na lokální přezdívky serverů nebo na rychlé přesměrování. Nevýhoda: snadno se na záznam zapomene a pak se jméno chová „nevysvětlitelně" — proto je /etc/hosts první místo, kam koukat, když se překlad jména chová divně.