Portál AbcLinuxu, 15. července 2025 09:44
Asi byste měl (po více než osmi letech) vzít konečně na vědomí, že příkaz ifconfig
je (v Linuxu) obsolete. Viz dokumentace k iproute2:
Theip
utility does not change thePROMISC
orALLMULTI
flags. These flags are considered obsolete and should not be changed administratively.
a o něco dále:
The values ofPROMISC
andALLMULTI
flags shown by theifconfig
utility and by theip
utility are different .ip link ls
shows the true device state, whileifconfig
shows the virtual state which was set withifconfig
itself.
ifconfig
, ale na Linuxu už osm let ne, na Linuxu jsou to nástroje z balíčku iproute2, tedy zejména příkaz ip
. To, že pro některé operace částečně funguje i ifconfig
, je spíš shoda okolností a v tomto případě tomu tak navíc není - viz ta citace.
Ale to je právě ta zásadní chyba. Příkaz pro konfiguraci síťových rozhraní není obyčejná aplikace, kde by takový argument měl svůj smysl. Je to příkaz, který komunikuje přímo s jádrem a pomáhá konfigurovat to, jak jádro funguje. Takový příkaz prostě musí být svázán s tím, jak příslušná část jádra funguje a jaké rozhraní pro konfiguraci dává k dispozici. Tuto podmínku příkaz ifconfig
od vydání jádra 2.2.0 (leden 1999) nesplňuje, funguje pouze částečně v emulaci, ukazuje vám neexistující objekty, neukazuje existující a nezřídka dělá něco úplně něco jiného, než co se tváří že dělá. Ale tomu se nelze divit, prostě to jádro funguje jinak, než ifconfig
(a nejen on, týká se to také třeba route
nebo arp
) předpokládá.
Je to jako kdybyste používal ke konfiguraci paketového filtru příkaz ipchains
. Také to na jednoduchých příkladech bude do určité míry fungovat, ale spoustu věcí pomocí něj nenakonfigurujete vůbec a i u těch, které nakonfigurovat půjdou, to často povede k neočekávaným (a nepříjemným) efektům (přesně jako u ifconfig
). Dnes ovšem dávno nikoho nenapadne na systémech s jádrem 2.6 používat příkaz ipchains
- bohužel na rozdíl od ifconfig
; a to přesto, že ipchains
je obsolete až od jádra 2.4, tedy o jednu stabilní řadu a dva roky kratší dobu než ten nešťastný ifconfig
. A stejně jako na BSD používáte BSD příkaz pro konfiguraci paketového filtru a na Linuxu linuxový příkaz, bylo by logické používat na BSD jeho příkaz pro konfiguraci síťových rozhraní a na Linux ten, který je k tomu určen v Linuxu. A to opravdu není ifconfig
- už více než osm let ne.
Asi záleží na tom, jak přesně byla myšlena formulace "the virtual state which was set with ifconfig
itself. Jestli tak, že ifconfig
pouze nastavuje a zobrazuje virtuální příznak nezávislý na skutečném stavu rozhraní, nebo tak, že ifconfig
rozhraní skutečně přepne, ale zobrazuje nezávislý příznak, který se mění pouze v případě, že přepnutí provedl ifconfig
.
Můžete si to nakonec vyzkoušet:
#ifconfig eth0 | grep -c PROMISC
0
#ifconfig eth0 promisc
#ifconfig eth0 | grep -c PROMISC
1
#ifconfig eth0 -promisc
#ifconfig eth0 | grep -c PROMISC
0
#tcpdump -i eth0 &
#ifconfig eth0 | grep -c PROMISC
0 -- wtf???
#ip link show eth0 | grep -c PROMISC
1 -- ok
Samozř. to hovoří jasně pro používání iproute2, nicméně pokud potřebujete nastavit promisc, ifconfig shodou náhod stále funguje.
[42962802.070000] eth0: set allmulti [43387826.260000] device eth0 entered promiscuous mode [43387832.000000] device eth0 left promiscuous mode
toho promisc jsem si u ifconfig nevsimnul
A dobře jste udělal. Na příkaz ifconfig
jako takový (v Linuxu) ve vlastním zájmu zapomeňte.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.