ifconfig
příkaz na operačních systémech jako FreeBSD a OpenBSD byl aktualizován v souladu se zbytkem operačního systému. V dnešní době dokáže konfigurovat nejrůznější nastavení síťového rozhraní na těchto operačních systémech a zpracovat řadu síťových protokolů. BSD poskytují ioctl()
podporu pro tyto věci.
To se ve světě Linuxu nestalo. Dnes existují tři ifconfig
příkazy:
ifconfig
z GNU inetutilsjdebp % inetutils-ifconfig -l enp14s0 enp15s0 lo jdebp % inetutils-ifconfig lo lo Link encap:Local Loopback inet addr:127.0.0.1 Bcast:0.0.0.0 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:9087 errors:0 dropped:0 overruns:0 frame:0 TX packets:9087 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:51214341 TX bytes:51214341 jdebp %
-
ifconfig
z NET-3 net-toolsjdebp % ifconfig -l ifconfig: option
-l' not recognised. ifconfig:
--help' gives usage information. jdebp % ifconfig lo lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> inet6 ::2 prefixlen 128 scopeid 0x80<compat,global> inet6 fe80:: prefixlen 10 scopeid 0x20<link> loop txqueuelen 1000 (Local Loopback) RX packets 9087 bytes 51214341 (48.8 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 9087 bytes 51214341 (48.8 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 jdebp % -
ifconfig
z (verze 1.40) sady nástrojů noshjdebp % ifconfig -l enp14s0 enp15s0 lo jdebp % ifconfig lo lo link up loopback running link address 00:00:00:00:00:00 bdaddr 00:00:00:00:00:00 inet4 address 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1 inet4 address 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 inet6 address ::2 scope 0 prefixlen 128 inet6 address fe80:: scope 1 prefixlen 10 inet6 address ::1 scope 0 prefixlen 128 jdebp % sudo ifconfig lo inet4 127.1.0.2 alias jdebp % sudo ifconfig lo inet6 ::3/128 alias jdebp % ifconfig lo lo link up loopback running link address 00:00:00:00:00:00 bdaddr 00:00:00:00:00:00 inet4 address 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1 inet4 address 127.1.0.2 prefixlen 32 bdaddr 127.1.0.2 inet4 address 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 inet6 address ::3 scope 0 prefixlen 128 inet6 address ::2 scope 0 prefixlen 128 inet6 address fe80:: scope 1 prefixlen 10 inet6 address ::1 scope 0 prefixlen 128 jdebp %
Jak můžete vidět, GNU inetutils a NET-3 net-tools ifconfig
mají některé výrazné nedostatky, pokud jde o IPv6, pokud jde o rozhraní, která mají více adres, a pokud jde o funkce jako -l
.
Problémem IPv6 je částečně chybějící kód v samotných nástrojích. Ale hlavně je to způsobeno tím, že Linux neposkytuje (jako jiné operační systémy) funkčnost IPv6 prostřednictvím ioctl()
rozhraní. Umožňuje pouze programům vidět a manipulovat s adresami IPv4 prostřednictvím sítě ioctl()
s.
Linux místo toho poskytuje tuto funkci prostřednictvím jiného rozhraní, send()
a recv()
na speciální a poněkud zvláštní adresové rodině soketů AF_NETLINK
.
GNU a NET-3 ifconfig
s mohl byly upraveny pro použití tohoto nového API. Argumentem proti tomu bylo, že to nebylo přenositelné na jiné operační systémy, ale tyto programy byly v praxi již stejně není přenosný takže to nebyl moc argument.
Ale nebyly upraveny a zůstaly tak, jak bylo uvedeno, dodnes. (Někteří lidé na nich v průběhu let pracovali v různých fázích, ale vylepšení se, bohužel, nikdy nedostala do programů. Například:Bernd Eckenfels nikdy nepřijal opravu, která by do síťových nástrojů NET-3 přidala nějakou schopnost netlink API. ifconfig
, 4 roky po napsání opravy.)
Místo toho někteří lidé zcela přetvořili sadu nástrojů jako ip
příkaz, který používal nové Linux API, měl jinou syntaxi a kombinoval několik dalších funkcí za módním command subcommand
-styl rozhraní.
Potřeboval jsem ifconfig
který měl syntaxi příkazového řádku a výstupní styl FreeBSD ifconfig
(což ani GNU ani NET-3 ifconfig
má a který ip
určitě nemá). Tak jsem jeden napsal. Jako důkaz, že lze napsat ifconfig
který používá netlink API na Linuxu, ano.
Takže přijatá moudrost o ifconfig
, jako to, co citujete, už není ve skutečnosti pravda. Nyní je to nepravdivé říct, že "ifconfig
nepoužívá netlink.". Deka, která přikryla dva, nezakryje tři.
Vždy to bylo nepravdivé tvrzení, že „netlink je efektivnější“. Pro úkoly, které člověk dělá s ifconfig
, není toho moc, pokud jde o efektivitu mezi netlink API a ioctl()
API. Jeden provede téměř stejný počet volání API pro jakýkoli daný úkol.
Každé volání API jsou ve skutečnosti dvě systémová volání v případě netlink, na rozdíl od jednoho v ioctl()
Systém. A pravděpodobně má netlink API tu nevýhodu, že na silně využívaném systému explicitně zahrnuje možnost, že nástroj nikdy neobdrží potvrzovací zprávu informující ho o výsledku volání API.
Navíc je nepravdivé říkat, že ip
je "univerzálnější" než GNU a NET-3 ifconfig
s protože používá netlink . Je univerzálnější, protože dělá více úkolů a dělá věci v jednom velkém programu, které by člověk dělal se samostatnými programy jinými než ifconfig
. Není všestrannější jednoduše díky rozhraní API, které interně používá k provádění těchto zvláštních úkolů. Na tom není nic vlastní API. Dalo by se napsat all-in-one nástroj, který by používal FreeBSD ioctl()
API, a stejně dobře uvádějí, že je „univerzálnější“ než individuální ifconfig
, route
, arp
a ndp
příkazy.
Dalo by se napsat route
, arp
a ndp
příkazy pro Linux, které také používaly netlink API.
Další čtení
- Jonathan de Boyne Pollard (2019).
ifconfig
. průvodce nosem . Software. - Eduardo Ferro (2009-04-16). ifconfig:hlásí špatnou IP adresu / počáteční opravu . Chyba Debianu #359676.
Standardní ifconfig
máme v mnoha distribucích je zastaralé z několika důvodů. Mluví s jádrem zastaralým a omezeným způsobem a ve skutečnosti už nerozumí všem konfiguracím sítě. S některými konfiguracemi sítě, jako je ifconfig
, nebudete moci manipulovat verze, které můžete dělat s ip
. Kromě toho ifconfig
podpora síťových jmenných prostorů je omezená.
Jako neoficiální příběh jsem našel alias IP rozhraní, které jsou viditelné pouze v ip
a ne v SuSE ifconfig
.
Pokud jde o rozdíly pod kapotou:Od ifconfig vs ip:Jaký je rozdíl a porovnání konfigurace sítě
Ačkoli
ip
může na první stránce vypadat trochu složitě, ale je mnohem širší ve funkčnosti než ifconfig. Je funkčně organizován na dvou vrstvách Networking Stack, tj. Layer 2 (Link Layer), Layer 3 (IP Layer) a provádí práci všech výše uvedených příkazů z balíčku net-tools.Zatímco
ifconfig
většinou zobrazuje nebo upravuje rozhraní systému, tento příkaz je schopen provádět následující úkoly:
Zobrazení nebo úprava vlastností rozhraní.
Přidávání a odstraňování položek mezipaměti ARP při vytváření nového statického záznamu ARP pro hostitele.
Zobrazení MAC adres spojených se všemi rozhraními.
Zobrazení a úprava směrovacích tabulek jádra.
Jedním z hlavních předností, které jej oddělují od jeho starobylého protějšku ifconfig, je to, že druhý používá ioctl pro konfiguraci sítě, což je méně oceňovaný způsob interakce s jádrem, zatímco první využívá mechanismus netlink socket pro stejný, který je mnohem flexibilnějším nástupcem ioctl forinter- komunikace mezi jádrem a uživatelským prostorem pomocí rtnetlink (který přidává možnost manipulace se síťovým prostředím).
O použití/výhodách netlinku:Od LJ - Kernel Korner - Proč a jak používat Netlink Socket
Netlink socket je speciální IPC používaný pro přenos informací mezi procesy jádra a uživatelského prostoru. Poskytuje plně duplexní komunikační spojení mezi těmito dvěma prostřednictvím standardních rozhraní API pro procesy v uživatelském prostoru a speciálního rozhraní API jádra pro moduly jádra. Soket Netlink používá rodinu adres AF_NETLINK.
......
Proč výše uvedené funkce používají netlink místo systémových volání, souborové systémy ioctls nebo proc pro komunikaci mezi uživatelem a světy jádra? Je netriviální úkol přidat systémová volání, soubory ioctls nebo proc pro nové funkce; riskujeme znečištění jádra a poškození stability systému. Netlink socket je však jednoduchý:do netlink.h je třeba přidat pouze konstantní typ protokolu. Modul jádra a aplikace pak mohou okamžitě komunikovat pomocí rozhraní API typu socket.
....
Netlink socket je flexibilní rozhraní pro komunikaci mezi aplikacemi v uživatelském prostoru a moduly jádra. Poskytuje snadno použitelné rozhraní API pro aplikace i jádro. Poskytuje pokročilé komunikační funkce, jako je full-duplex, I/O s vyrovnávací pamětí, multicastová asynchronní komunikace, které v jiných IPC s jádrem/uživatelským prostorem chybí.