GNU/Linux >> Znalost Linux >  >> Linux

ip vs ifconfig příkazy pro a proti

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 inetutils
    jdebp % 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-tools
    jdebp % 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ů nosh
    jdebp % 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í.


Linux
  1. Naučte se rozdíl mezi příkazy „su“ a „su -“ v Linuxu

  2. Linuxové příkazy – přehled a příklady

  3. Linuxové příkazy:jobs, bg a fg

  1. Najděte soubor pomocí příkazů Najít a najít v Linuxu

  2. 11 Užitečné příkazy „ssh“ a „scp“ v Linuxu

  3. Rozdíl mezi ${} a $() v Bash

  1. Sledujte příkazy a úkoly pomocí příkazu watch v systému Linux

  2. Úvod do linuxových příkazů chgrp a newgrp

  3. Rozdíl mezi příkazy 'ifconfig' a ​​'ip'