web-dev-qa-db-ja.com

ip vs ifconfigコマンドの長所と短所

ある時点で、私が出会ったLinuxに関する(Linux Foundationからの)教材では、次のことが言及されています。

ipコマンドはioctlシステムコールではなくnetlinkソケットを使用するため、ifconfigよりも用途が広く効率的です。

フードの下で何が起こっているのか理解できないので、誰かがこれについて少し詳しく説明できますか?

追伸私はそれらのツールで このトピック を認識していますが、それらがどのように動作するかについてのこの特定の違いには対処していません

33
pkaramol

FreeBSDやOpenBSDなどのオペレーティングシステムのifconfigコマンドは、他のオペレーティングシステムに合わせて更新されました。今日では、これらのオペレーティングシステムであらゆる種類のネットワークインターフェイス設定を構成し、さまざまなネットワークプロトコルを処理できます。 BSDは、これらのioctl()サポートを提供します。

これはLinuxの世界では起こりませんでした。今日、3つのifconfigコマンドがあります。

  • ifconfig from 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パケット:9087エラー:0ドロップ:0オーバーラン:0フレーム:0 
     TXパケット:9087エラー:0ドロップ済み:0オーバーラン:0キャリア:0 
    コリジョン:0 txqueuelen:1000 
     RXバイト:51214341 TXバイト:51214341 
     jdebp%
  • ifconfig from NET-3 net-tools
    jdebp%ifconfig -l 
     ifconfig:オプション_-l' not recognised.
    ifconfig:_-- help 'は、使用方法の情報を提供します。
     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パケット9087バイト51214341(48.8 MiB)
     RXエラー0ドロップ0オーバーラン0フレーム0 
     TXパケット9087バイト51214341(48.8 MiB)
     TXエラー0ドロップ0オーバーラン0キャリア0コリジョン0 
     jdebp%
  • ifconfig from(バージョン1.40 of) 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アドレス127.0.0.1 prefixlen 8 bdaddr 127.0.0.1 
     inet4アドレス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 
    リンクアドレス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アドレス127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 
     inet6アドレス:: 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% 

ご覧のとおり、GNU inetutilsおよびNET-3 net-tools ifconfigsには、IPv6に関して、複数のアドレスを持つインターフェースに関して、および以下のような機能に関して、いくつかのマークされた欠陥があります。 _-l_。

IPv6の問題の一部は、ツール自体に欠けているコードです。しかし、それは主に、Linuxが(他のオペレーティングシステムが提供するように)ioctl()インターフェースを介してIPv6機能を提供しないという事実が原因です。プログラムは、ネットワーキングioctl() sを介してIPv4アドレスを表示および操作するだけです。

Linuxは代わりに、ソケットの特殊な、やや奇妙なアドレスファミリ_AF_NETLINK_の異なるインターフェイスsend()およびrecv()を介してこの機能を提供します。

GNUおよびNET-3 ifconfigs couldは、この新しいAPIを使用するように調整されました。これを行うことに対する反対論は、他のオペレーティングシステムに移植できないことでしたが、これらのプログラムは実際にはalready移植性がありませんanywayだったため、あまり議論の余地はありませんでした。

しかし、それらは調整されておらず、今日まで予測されたままです。 (何人かの人々は何年にもわたってさまざまな時点でそれらに取り組みましたが、悲しいことに、改善はプログラムに取り入れられませんでした。例: Bernd Eckenfelsはパッチを受け入れませんでした いくつかのnetlink API機能を追加しましたNET-3 net-tools ifconfigへ、パッチが作成されてから4年後。)

代わりに、新しいLinux APIを使用するipコマンドが異なる構文を持ち、ファッショナブルな_commandsubcommand_スタイルのインターフェイスの背後にいくつかの他の関数を組み合わせたため、一部の人々はツールセットを完全に再発明しました。

FreeBSDのifconfig(GNUもNET-3 ifconfigも、ifconfigにもないこと)のコマンドライン構文と出力スタイルを持つipが必要でした。 Linuxでnetlink APIを使用するifconfigを作成できることの証明として、それを作成しました。

したがって、引用したようなifconfigについて受け取られた知恵は、もはや真実ではありません。 「ifconfigはnetlinkを使用しない」と言うのはnow untrueです。 2つをカバーした毛布は3つをカバーしません。

これまでずっと「netlinkの方が効率的」と言うのは誤りです。 ifconfigを使用して行うタスクの場合、netlink APIとioctl() AP​​Iの間の効率に関しては、それほど多くはありません。特定のタスクに対してほぼ同じ数のAPI呼び出しを行います。

実際、各API呼び出しは、ioctl()システムの場合とは異なり、netlinkの場合はtwoシステムコールです。また、netlink APIには、使用頻度の高いシステムでは、ツールがAPI呼び出しの結果を通知する確認メッセージを受信しない可能性があることを明示的に組み込んでいるという欠点があることは間違いありません。

さらに、ipがGNUおよびNET-3 ifconfigs netlinkを使用しているためよりも「より用途が広い」と言っているのは事実ではありません。より多くのタスクを実行し、1つの大きなプログラムで別のプログラムで行うようなことを行います以外ifconfig。これらの追加のタスクを実行するために内部で使用するAPIの機能だけでは、より汎用性が高くありません。これについては、APIに固有のことは何もありません。たとえば、FreeBSD ioctl() AP​​Iを使用するオールインワンツールを記述して、個々のifconfigよりも「用途が広い」と同様に述べることができます。 routearp、およびndpコマンド。

Netlink APIを使用するLinux用のroutearp、およびndpコマンドも記述できます。

参考文献

49
JdeBP

多くのディストリビューションにある標準のifconfigは、いくつかの理由で廃止されています。カーネルとの古くて限られた方法での対話、そして実際には、もはやすべてのネットワーク構成を理解していません。 ifconfigを使用して実行できるipバージョンなどの一部のネットワーク構成を操作することはできません。さらに、ネットワーク名前空間のifconfigサポートは制限されています。

逸話として、ipでのみ表示され、SuSE ifconfigでは表示されないインターフェイスIPエイリアスを見つけました。

内部の違いについて:From ifconfig vs ip:What’s Difference and Comparing Network Configuration

ipは最初のサイトでは少し複雑に見えるかもしれませんが、ifconfigよりも機能がはるかに広いです。これは、ネットワークスタックの2つのレイヤー、つまりレイヤー2(リンクレイヤー)、レイヤー3(IPレイヤー)で機能的に編成され、net-toolsパッケージからの上記のすべてのコマンドの機能を実行します。

ifconfigは主にシステムのインターフェースを表示または変更しますが、このコマンドは次のタスクを実行できます。

  • インターフェイスプロパティの表示または変更。

  • ホストの新しい静的ARPエントリの作成に沿ったARPキャッシュエントリの追加、削除。

  • すべてのインターフェースに関連付けられたMACアドレスの表示。

  • カーネルルーティングテーブルの表示と変更。

それを古代の対応するifconfigと区別する主なハイライトの1つは、後者がネットワーク構成にioctlを使用することです。これはカーネルとの相互作用のあまり評価されない方法ですが、前者ははるかに柔軟な後継である同じためにnetlinkソケットメカニズムを利用します。 rtnetlink(ネットワーク環境操作機能を追加)を使用してカーネルとユーザー空間間の相互通信のためのioctlの使用。

Netlinkの使用/利点について:From LJ-Kernel Korner-Why and How to Use Netlink Socket

Netlinkソケットは、特別なIPCカーネルとユーザースペースプロセス間で情報を転送するために使用されます。ユーザースペースプロセス用の標準ソケットAPIを介して2つの間に全二重通信リンクを提供します。カーネルモジュール用の特別なカーネルAPI Netlinkソケットは、アドレスファミリーAF_NETLINKを使用します。

.....

上記の機能が、ユーザーワールドとカーネルワールド間の通信に、システムコール、ioctl、またはprocファイルシステムの代わりにnetlinkを使用する理由システムコール、ioctl、またはprocファイルを追加して新しい機能を追加するのは簡単なことではありません。カーネルを汚染し、システムの安定性を損なう恐れがあります。ただし、netlinkソケットは単純です。netlink.hに追加する必要があるのは、プロトコルタイプである定数だけです。その後、カーネルモジュールとアプリケーションは、ソケットスタイルのAPIを使用してすぐに通信できます。

....

Netlinkソケットは、ユーザー空間アプリケーションとカーネルモジュール間の通信のための柔軟なインターフェイスです。アプリケーションとカーネルの両方に使いやすいソケットAPIを提供します。全二重、バッファI/O、マルチキャスト、非同期通信など、他のカーネル/ユーザー空間IPCにはない高度な通信機能を提供します。

9
Rui F Ribeiro