Jan 19

Written by m4r3k and tagged by .

Spousta lidí na Linuxu stále používá ifconfig přesto, že se jedná o nástroj, jehož koncept ve skutečnosti neodpovídá současnému síťovému modelu v jádře. Na Linuxu je pro user-space manipulaci se síťovým modelem určen nástroj ip. Prosím používejte jej místo nástroje ifconfig. Distributoři jej však stále ze svých distribucí nevyřadili. Protože jej stále mnoho lidí používá rozhodl jsem se vytvořit tuto stránku, kde se budu snažit sbírat reálné argumenty proti ifconfigu a pro ip. Většina uživatelů is totiž neuvědomuje, že používáním obsolete ifconfigu si mohou znesnadnit debbugování v případě nesnází, nebo si přímo na nesnáze zadělávat.

Něco jsou mé výtvory, zbytek je sesbírán z různých diskusí. Seznam citátů se budu snažit aktualizovat a rozšiřovat. Pokud víte o nějakém důvodu proč je používání ifconfigu na Linuxu špatné a tento důvod zde ještě uveden není, tak mi jej napište do komentářů a já jej milerád přidám.




Emulace virtuálních rozhraní

Chtěl bych upozornit na jeden problém, který sice na první pohled vypadá jako formalita, ale občas může mít poměrně zásadní důsledky: ifconfig se chová, jako by skutečně existovalo samostatné virtuální rozhraní eth0:0 a při pokusu pracovat s ním (např. nastavit mu příznaky) pracuje ve skutečnosti s rozhraním eth0. Zejména kombinace s tím, že ifconfig nedostatečně rozlišuje mezi “rozhraní je UP” a “rozhraní má přiřazenu adresu“, může věci neznalého uživatele “kousnout do zadku”…

Autor: Michal Kubeček

Ifconfig nefunguje, jedná se o emulaci

ifconfig v Linuxu nefunguje, pouze je tam (nepříliš dokonale) emulován. Ten zásadní problém není v nepřehledné a chaotické syntaxi, ale v tom, že ifconfig je založen na jiné koncepci síťových rozhraní, než jaká je interně použita v jádře. A to prostě nemůže dělat dobrotu - a také nedělá.

S oblibou to přirovnávám k tomu, kdybyste chtěl pro konfiguraci paketového filtru používat emulaci ipchains (nebo ještě spíš ipfwadm, který také patří k jádru 2.0). Pár jednoduchých příkladů vám bude fungovat, ale jakmile narazíte na mantinely té emulace, máte problém. Je velmi nešťastné, že zatímco u ipchains to většina lidí chápe, spousta (jinak docela informovaných) uživatelů Linuxu se pořád zoufale zuby nehty drží emulovaného ifconfigu a tvrdošíjně odmítá používat nativní nástroje.

Autor: Michal Kubeček

Ifconfig si vymýšlí

Příkazy ifconfig a ip si nemohou vymýšlet svou koncepci jen tak, jak je napadne. Oba totiž fungují jen jako user space rozhraní pro konfiguraci driverů jádra. Takže je podstatné, jak jsou síťová rozhraní implementována v jádře, na tom chtě nechtě musíte stavět. Příkaz ifconfig to nerespektuje, protože je postaven na koncepci, která byla ve starších verzích jádra (do řady 2.0). Příkaz ip vychází z koncepce, která tam je teď.

To, že když pomocí ifconfig zkusíte změnit parametry rozhraní eth0:0, změní ve skutečnosti parametry eth0, je prostě něco víc, než jen nějaká “jmenná koncepce”. Sice není to chyba příkazu samotného, ale je to chyba toho, kdo ho používá v prostředí, pro které nebyl navržen a pro které se nehodí. Až si jednou v domnění, že odstraňujete druhou IP adresu, sestřelíte interface, přes který jste připojen na vzdálený počítač, třeba ten rozdíl uvidíte v jasnějších barvách.

Autor: Michal Kubeček

Ifconfig nezobrazuje všechny IP adresy

Jádro umožňuje jednomu rozhraní přiřadit několik IP adres. Avšak v případě, že přiřadíte rozhraní více IP adres stejného typu (třeba IPv4, nebo IPv6) tak vám nástroj ifconfig zobrazí jen jednu z nich. Podívejme se na příklad:

mantisha:/etc # ifconfig eth0
eth0      Zapouzdření:Ethernet  HWadr 00:16:D4:61:AE:81
          inet adr:82.209.54.76  Všesměr:255.255.255.255 Maska:255.255.255.248
          inet6-adr: fe80::216:d4ff:fe61:ae81/64 Rozsah:Linka
          AKTIVOVÁNO VŠESMĚROVÉ_VYSÍLÁNÍ BĚŽÍ MULTICAST  MTU:1500  Metrika:1
          RX packets:19452562 errors:0 dropped:0 overruns:0 frame:0
          TX packets:21042280 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 délka odchozí fronty:1000
          RX bytes:2344514951 (2235.9 Mb)  TX bytes:3412421561 (3254.3 Mb)
          Přerušení:20 Vstupně/Výstupní port:0x4000
mantisha:/etc # ip a show eth0
2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:16:d4:61:ae:81 brd ff:ff:ff:ff:ff:ff
    inet 82.209.54.76/29 brd 255.255.255.255 scope global eth0
    inet 192.168.1.1/24 scope global eth0
    inet6 fe80::216:d4ff:fe61:ae81/64 scope link
       valid_lft forever preferred_lft forever

Jak vidíte dle výstupu příkazu ip má zařízení eth0 přiřazeno 2 adresy IPv4. ifconfig však zobrazuje IPv4 adresu jen jednu. ifconfig dokonce ani nezobrazí žádné varování, nebo chybovou zprávu. Jedná se o jednoznačnou chybu v koncepci nástroje ifconfig.

Autor: Marek Stopka

17 Responses

  1. Ilfirin Says:

    A co teda používat?

  2. m4r3k Says:

    No přece ip :-)

  3. hush Says:

    alebo mozog

  4. xkucf03 Says:

    Je dobře, že děláš takovouhle osvětu :-) Chce to jen překonat počáteční odpor k učení se nových příkazů a hned je to lepší, holt zvyk je železná košile.

  5. xkucf03 Says:

    Teď vlastně koukám, že je to hlavně soubor Michalových citátů pod článkem http://www.abclinuxu.cz/blog/escaped/2006/2/11/120814 :-)

  6. m4r3k Says:

    2xkucf03: Přesně tak.. Ale jeden je můj ;-)

  7. Ondrej Zajicek Says:

    A ted zaludna otazka. Proc nepouzivat ifconfig v situaci, kdy si jsem jist, ze nebudu potrebovat vic nez jednu IP adresu na kazdem rozhrani.

  8. frEon Says:

    2Ondrej Zajicek: Odpovim ti jeste zaludnejsi otazkou. Proc si pamatovat syntaxe dvou prikazu, kdyz ti staci znat jeden?

  9. Ondrej Zajicek Says:

    > Proc si pamatovat syntaxe dvou prikazu, kdyz ti staci znat jeden?

    Syntaxi ifconfigu stejne vsichni znaji. Navic zakladni pouziti je tak jednoduche, ze se nezapomene. Navic zakladni nastaveni sitoveho zarizeni je pri pouziti fconfigu tak 2* jednodussi nez pri pouziti programu ip .

  10. You suck motherfucker Says:

    Linux zadny ifconfig nema ! Ten je pouze v GNU/Linux, tak co tady placas? Navic je ifconfig standardni nastroj ve vsech UNIXech a proto jej budu pouzivat dal a to same plati pro ipchains.

    Don’t touch the working *NIX tool, or I will kill you with the automatic hammer =)

  11. m4r3k Says:

    2You suck motherfucker: No ty si se teda předvedl. Slušně to neumíš? Možná je ifconfig standardni nastroj ve vsech UNIXech, ale to nic nemění na tom, že v Linuxu nefunguje.

  12. CET Says:

    Nazdar. Zatim pouzivam taky prevazne ifconfig a route, ikdyz prikaz ip znam. Uz nekolikrat jsem se pokusil ip zacit pouzivat, ale docela me odradila jednak slozitost (prece jenom, ifconfig je pouze na konfiguraci sitovek, ip krome sitovek konfiguruje taky routing a to o dost sloziteji nez route) a slabsi dokumentace. Slozitost by se dala prekousnout, dokumentace se uz mozna zlepsila. Rozhodne obcas ip pouziju, abych zjistil, co si mysli on o nastaveni sitovek a obcas tam i najdu reseni. Ale chtel bych se vyjadrit ke tvym duvodum.

    Aktulane tady mas 4 duvody. Pricemz prvni tri “Emulace virtuálních rozhraní”, “Ifconfig nefunguje, jedná se o emulaci” a “Ifconfig si vymýšlí” jsou, IMO, porad jedno a to same. Prvni dva zduraznuji, ze jde o emulaci (nevim, proc je to ve dvou zvlastnich duvodech), a nezduvodnuji, co je na tom spatneho (pise se tam pouze, ze “Pár jednoduchých příkladů vám bude fungovat, ale jakmile narazíte na mantinely té emulace, máte problém.” zadny prikladm, a “může věci neznalého uživatele “kousnout do zadku”…”). Muzu si udelat treba vlastni configip, ktery nebude delat nic jineho, nez zapisovat pouze IP adresu a masku na nejakou sitovku a bude to uplne jedno, pokud to bude delat presne to, co chci. ifconfig pouzivam proto, protoze s nim jednoduse dokazu nastavit IP adresu sitovky a on tak funguje. Pokud budu chtit das dve IPcka na jednu sitovku, pouziju prikaz ip.

    Dale v prvnim a tretim pises o “nastavovani priznaku” a “zmenach parametru” aliasu. Zase by stacilo to uvest pouze v jednom duvodu (proc ve dvou?) a hlavne, uvest priklad a srovnani s ip. Napr. ja nevim, co si pod tim predstavit a hlavne by bylo zajimavy srovnani prave s tim prikazem ip, aby clovek videl, jake problemy mu to muze prinest, kdyz bude pouzivat ifconfig.

    Jedinej duvod, kterej zatim uznavam jako skutecne opravnenej a realnej je ten ctvrtej “Ifconfig nezobrazuje všechny IP adresy”. To muze byt problem, kdyz clovek hleda nejaky IPcko a ono je jako secundarni na nejakym eth bez aliasu, pak si s ifconfigem moc neporadi. Jak jsem psal, ja tohle obcas kontroluju prikazem ip. Akorat bych nerekl, ze to je chyba koncepce ifconfigu, ale pouze backward-compatibility. Spousta dalsich nastroju proste od ifconfigu ocekava presne takovyhle format. A pokud uz nejaky distro pouziva prikaz ip, tak predela i tyhle dalsi skripty. Osobne mam gentoo, kde si jde vybrat, jestli bude system na konfiguraci pouzivat ip nebo ifconfig a uz jsem presel na ip, ikdyz aktivne ale vsude jinde pouzivam ifconfig.

    Zkus sjednotit ty duvody 1-3 a pridej k nim priklady (jako je hezky priklad ve 4.duvodu) a budou opravnene - zatim jsou to jen duvody stylu “ifconfig je spatny, ip je lepsi”.

  13. partizan Says:

    Mna osobne odradzuju od ip 2 veci:
    1; ifconfig ma omnoho prehladnejsi vystup ako ip a show
    2; ifco +tab eth0 - 8 klaves po ip adresu
    ip a add dev eth0 - 15 stlaceni klaves
    to predstavuje v konzole 2x viac pisania + zlozitejsi zapis.
    3; ifconfig je vseobecne rozsireny v *nix svete…
    4; ip route show
    192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.8
    default via 192.168.1.1 dev eth1

    nepride mi to moc prehladne oproti route
    Destination Gateway Genmask Flags Metric Ref Use Iface
    192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
    0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth1

    kde je to pekne rozdelene do tabulky

    V podstate mi syntax samotna pri ip nevadi, ale tie vystupy su fakticky otrasne

  14. CET Says:

    partizan) s bodem 3 souhlasim bez vyhrad - freebsd ma napr taky ifconfig

    body (1) a (4) uz jsou trosku sporne, ikdyz ja taky preferuju ifconfig, objektivne bych rekl, ze “prehlednost vystupu” (a) zalezi na zvyku - pokud si zvyknes na ip, tak ti to uz neprijde, a (b) ip musi byt mene prehlednejsi, protoze musi ukazovat vic informaci.

    co se tyce budu (2), muzes si klidne napsat jednopismenne skriptiky/aliasy/funkce, takze pak by se tvuj duvod pro ifconfig obratil. Jinak na druhou stranu, “ip” akceptuje zkracene tvary, takze nemusis psat “ip a add”, ale staci “ip a a IP/prefix dev eth”, takze o tolik to zase delsi neni, vlastne je tam navic jenom to “dev”, coz zase takovej problem neni.

  15. Michal Says:

    Par lidi tady zminuje ze je lepsi pouzivat ifconfig protoze je na kazdem unixu. To je sice pravda, ale bohuzel jeho syntaxe se mezi jednotlivymi systemy vyrazne lisi. I kdyz budete vedet jak se nastavi interface pomoci ifconfig na Linxu tak vam to moc nepomuze s nastavenim sitovky na Solarisu. Jelikoz na Linuxu pouzivam “ip” a na Solarisu “ifconfig” tak se mi alespon neplete syntaxe. Tedy bod pro “ip” ;-)

  16. anicka Says:

    No ja nevim. Ja radeji pouzivam ifconfig a route - at je nebo neni rozbity, na 99 procent veci, ktere na svych vlastnich pocitacich bezne nastavuju, bohate staci. Na louskani manpage od ip je dost casu, az kdyz to nefunguje. (A nebo kdyz pisu skript pro nejaky server, na kterem zalezi.)

    Uz jsem si jednou zkousela zvyknout na pouzivani ip porad, ale jedine co jsem z toho mela, byla lehce vyjukana freya (OS X), ktera rozumi jen ifconfigu. (A rozbity je taky, jen tam nic lepsiho neni :-))

  17. the.max Says:

    ifconfig zobrazuje vsechny ip adresy, pokud byly zadany pomoci ifconfigu jako aliasy. pak je videt eth0, eth0:1, eth0:2 atd… prikaz ip je vidi take. pokud adresy zadavam pomoci prikazu ip, pak je ifconfig opravdu nevidi.

Leave a Comment


Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.