Příkaz ip: ovládněte linuxová síťová rozhraní

29. 4. 2015
Doba čtení: 7 minut

Sdílet

Linux je přímo určen do síťového prostředí a administrátorovým denním chlebem je konfigurace síťových rozhraní. Dříve (dávno) se k tomu používaly příkazy jako ifconfig, route nebo arp. Dnes je vše elegantně propojeno v jediném příkazu ip. Proč ho používat místo starého způsobu? Jak se s ním přesně pracuje?

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.

bitcoin školení listopad 24

# 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.

Zdroje

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.