Začneme krátkým pohledem do dávné historie. S prastarými linuxovými jádry bylo potřeba ke konfiguraci sítě používat balíček net-tools
, který obsahoval tradiční příkazy jako ifconfig, route, arp, netstat a podobně. Ty používají přímou komunikaci s rozhraním pomocí ioctl. Jádro 2.2 přišlo s protokolem netlink, který je přímo určený pro komunikaci jaderných a uživatelských procesů. Zároveň spatřil světlo světa nový balíček iproute2
, který netlink využívá a všechny důležité funkce schovává do jediného příkazu ip
. Ten v moderních distribucích slouží ke konfiguraci sítě. Staré rozhraní pro ifconfig zatím v jádře zůstává kvůli zpětné kompatibilitě.
Konkrétně:
- jádro 2.2 vyšlo 25. ledna 1999
- balíček iproute2 vyšel 17. dubna 1999
- linuxový ifconfig se nevyvíjí od verze 1.60, která vyšla 15. dubna 2001
Jak vidíte, nejde rozhodně o žhavou novinku, naopak je už mnoho dlouhých let (po celou dobu existence serveru Root.cz) doporučováno použití iproute2 místo zastaralého net-tools. V řadě linuxových distribucí je dnes iproute2 nainstalován ve výchozím stavu (v Debianu od Jessie), v některých je ho potřeba doinstalovat. Poznámka: Ve světe BSD je ifconfig stále hlavním nástrojem konfigurace sítě. Pozor ale na to, že jde o jiný software, který se navíc dále vyvíjí souběžně s vývojem systému.
Proč ne ifconfig?
Abychom nebyli jen na úrovni akademických úvah o tom, co je správnější a systémovější, ukážeme si konkrétní situace, ve kterých při použití ifconfigu dochází k nejrůznějším problémům. Jak jsme si už řekli: staré utility jsou stále ještě součástí distribucí, ale nevyvíjí se. Při jejich použití proto můžete narazit na nekonzistenci či chybné chování. Přestože není cílem článku přímo porovnávat obě řešení, je dobré upozornit na některé problémy.
Příkaz ifconfig například nepočítá s více různými IPv4 adresami na jednom rozhraní. Pokud je přidáte, ukáže ifconfig ve svém výpisu vždy jen první z nich. Očekává totiž, že každá další adresa bude mít samostatné virtuální (alias) rozhraní, které je ale od jádra 2.4 označeno jako zastaralé (obsolete). Jen kvůli ifconfigu zůstala možnost uložit název (ve skutečnosti neexistujícího) rozhraní jako label k adrese.
Linuxové jádro dovoluje nastavit rozhraním libovolný název kromě lomítka a NUL. Můžete tedy pojmenovat své rozhraní třeba eth0:nix
a normálně s ním pracovat pomocí utilit používajících netlink. Z ifconfigu bude ale nepřístupné, protože ten předpokládá za dvojtečkou číslo.
Aliasy pak přináší ještě další problémy, protože se v ifconfigu tváří jako samostatná rozhraní a nejsou ve výpise nijak odlišeny. Pokud se ale pokusíte používat nad eth0:1 třeba iptables nebo iproute2, pak narazíte. Stejně tak pokud se neodlišený alias pokusíte aktivovat pomocí ifconfig up
nebo mu nastavit jiné flagy, nepodaří se vám to. Pochopitelně, protože nejde o reálné rozhraní. Utilita ifconfig se však bude tvářit, že je vše v pořádku a neohlásí žádnou chybu.
Pokud rozhraní nastavíte více IPv6 adres, bude se ifconfig chovat sice korektně a vypíše je všechny, ale nedoplní k nim zásadní informace. Neinformuje například o tentative stavu, jak jsme upozornili v článku o detekci duplicitních adres. Ve výpisu se adresy sice normálně objeví, ale není možné je použít z důvodu testování na možné kolize, což ifconfig neoznámí.
Výstup ifconfigu je lokalizovaný, takže jeho použití ve skriptech je velmi problematické. Pokud bude mít uživatel nastavený jiný jazyk, může se rozbít parsování výstupu.
Stará varianta nepočítá s maskou sítě zapsanou ve formátu CIDR. Pokud tedy chcete zadat masku ručně, musíte ji vypsat v plném formátu – třeba jako 255.255.240.0. Pokud masku neuvedete, bude se ifconfig řídit třídou IP adresy.
Toto je jen část problémů, na které můžete narazit. Podstatné je, že ifconfig často zatajuje podstatné informace, kvůli kterým je konfigurace sítě velmi problematická. Začátečník, který o tom neví, může zbytečně trávit probdělou noc nad nefunkčním systémem.
Vše v jednom
Pro porovnání příkazů z obou balíčků si prohlédněte následující tabulku:
net-tools (staré) | iproute2 (současné) |
---|---|
arp | ip neigh |
ifconfig | ip addr |
ipmaddr | ip maddr |
iptunnel | ip tunnel |
route | ip route |
brctl | ip link (+ bridge) |
Příklady použití
Většinu akcí zvládnete pomocí příkazu ip
. Následuje několik příkladů, které vám osvětlí základní práci s tímto příkazem. Většinu parametrů je možné libovolně zkracovat, pokud je výsledek jednoznačný. Místo ip addr
tak můžete použít ip a
a místo ip route
zase třeba ip rou
nebo rovnou ip r
. V příkladech ale uvádím parametry celé, aby byl výsledek zcela zřejmý.
Nastavení rozhraní
Pokud spustíme příkaz jen s parametrem addr
, vypíše nám informace o stavu síťových rozhraní.
# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether ee:ff:33:61:22:aa brd ff:ff:ff:ff:ff:ff inet 192.168.1.10/24 brd 192.168.1.255 scope global dynamic eth0 valid_lft 34648sec preferred_lft 34648sec inet6 2001:db8:5555:1::10/128 scope global dynamic valid_lft 34892sec preferred_lft 34892sec inet6 2001:db8::211:22ff:fe33:4455/64 scope global noprefixroute dynamic valid_lft 7173sec preferred_lft 1773sec inet6 fe80::ecff:33ff:fe61:22aa/64 scope link valid_lft forever preferred_lft forever 3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000 link/ether ee:ff:33:61:22:ab brd ff:ff:ff:ff:ff:ff
Pokud vás zajímá jen stav jednoho zařízení, můžete za příkaz přidat jeho název.
# ip addr show dev eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether ee:ff:33:61:22:aa brd ff:ff:ff:ff:ff:ff inet 192.168.1.10/24 brd 192.168.1.255 scope global dynamic eth0 valid_lft 34648sec preferred_lft 34648sec inet6 2001:db8:5555:1::10/128 scope global dynamic valid_lft 34892sec preferred_lft 34892sec inet6 2001:db8::211:22ff:fe33:4455/64 scope global noprefixroute dynamic valid_lft 7173sec preferred_lft 1773sec inet6 fe80::ecff:33ff:fe61:22aa/64 scope link valid_lft forever preferred_lft forever
Pokud chcete zařízení ze stavu DOWN dostat do UP:
# ip link set dev eth0 up
Můžeme také kartě nastavit MTU nebo změnit MAC adresu:
# ip link set dev eth0 mtu 1500 # ip link set dev eth0 address aa:bb:cc:dd:ee:ff
Přidání IP adresy k rozhraní:
# ip addr add 192.168.1.11/24 dev eth0
Odebrání adresy:
# ip addr del 192.168.1.11/24 dev eth0
Routování
K prostému vypsání routovací tabulky opět stačí pouze parametr route
:
# ip route default via 192.168.1.1 dev eth0 proto static metric 1024 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10
Pokud chcete vidět routovací tabulku pro IPv6, přidejte ještě na začátek parametr -6
:
# ip -6 route 2001:db8:5555:1::10 dev eth0 proto kernel metric 256 expires 34075sec 2001:db8:5555:1::/64 dev eth0 proto ra metric 1 2001:db8:5555::/48 via fe80::baa1:11ff:ab36:3bb6 dev eth0 proto ra metric 1 fe80::/64 dev eth0 proto kernel metric 256 default via fe80::baa1:11ff:ab36:3bb6 dev eth0 proto static metric 1024
Přidání a odebrání statické routy je také velmi přímočaré a vychází z výše uvedeného příkladu pro přidělování IP adres:
# ip route add 10.0.0.0/16 via 192.168.1.1 # ip route del 10.0.0.0/16 via 192.168.1.1
Velmi šikovný je parametr get
, kterým se můžeme dotázat routovací tabulky na cestu ke konkrétní adrese. Je tak možné snadno odhalit řadu problémů s routováním. V následujícím příkladu vidíme, že cesta k Root.cz vede z naší sítě ven přes výchozí bránu:
# ip route get 91.213.160.118 91.213.160.118 via 192.168.1.1 dev eth0 src 192.168.1.10 cache
Objevování sousedů
Příkaz ip
umožňuje i nahlédnout do databáze sousedů – ARP tabulky.
# ip neigh 2001:db8:5555:1::1 dev eth0 lladdr fe80::baa1:11ff:ab36:3bb6 router REACHABLE fe80::baa1:11ff:ab36:3bb6 dev eth0 lladdr ff:ab:36:3b:b6:aa router DELAY 192.168.1.2 dev eth0 lladdr 2b:88:c6:aa:bb:cc STALE 192.168.1.1 dev eth0 lladdr ff:ab:36:3b:b6:aa REACHABLE
Zvyk je železná košile
Problémem ifconfigu zůstává fakt, že jsou na něj uživatelé stále zvyklí, pořád dokola se objevuje v návodech a ostřílení unixáci jej pořád linuxákům doporučují. Pokud se konečně rozhodnete začít používat ip místo ifconfigu, začněte co nejdříve. Trvá poměrně dlouho než v hlavě natrvalo přehodíte výhybku a prsty budou psát ip místo ifconfig automaticky. Je jasné, že tu s námi ifconfig ještě nějaký čas bude a jen tak nezmizí. Zvyk je železná košile, ale ta nová je pohodlnější a bez děr.
Za odbornou pomoc děkuji Pavlu Šimerdovi a Ondřeji Caletkovi.