Síť v Linuxu

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

Co se naučíš: Zjistíš, jakou má stroj adresu, co poslouchá na kterém portu a kde se láme spojení.

15 min čtení + cvičeníNavazuje na:📁 Základní příkazy

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.0–192.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.1: default 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ývoj: npm 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žby, ss -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ě.