GNU/Linux >> Linux の 問題 >  >> Linux

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

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

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

  • ifconfig 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 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 (バージョン 1.40 の) 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 % 
    から

ご覧のとおり、GNU inetutils と NET-3 net-tools ifconfig s には、IPv6 に関して、複数のアドレスを持つインターフェイスに関して、および -l のような機能に関して、いくつかの顕著な欠陥があります。 .

IPv6 の問題の一部は、ツール自体の一部のコードが欠落していることにあります。しかし、大部分は、Linux が ioctl() を介して IPv6 機能を (他のオペレーティング システムが提供するように) 提供しないという事実によって引き起こされます。 インターフェース。これは、ネットワーク ioctl() を介して、プログラムが IPv4 アドレスを参照および操作できるようにするだけです。

Linux は代わりに、別のインターフェース send() を通じてこの機能を提供します。 と recv() ソケットの特別な、そして少し変わったアドレスファミリ、AF_NETLINK .

GNU と NET-3 ifconfig できる この新しい API を使用するように調整されています。そうすることに反対した理由は、他のオペレーティング システムに移植できないというものでしたが、これらのプログラムは すでに 実際に使用されていました。 とにかくポータブルではありませんとにかく それはあまり議論ではありませんでした。

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

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

ifconfig が必要でした FreeBSD ifconfig のコマンドライン構文と出力スタイルを持っていた (GNU でも NET-3 ifconfig でもありません) 持っていて、どの ip ほとんどの場合、持っていません)。だから私は1つ書いた。 ifconfig を書ける証拠として

Linux で netlink API を使用します。

ifconfig について一般に受け入れられている知恵 、あなたが引用したものなどは、もはや真実ではありません。それは今では真実ではありませんifconfig」と言う は netlink を使用しません。".2 をカバーしたブランケットは 3 をカバーしません。

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

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

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

route と書くこともできます 、 arp 、および ndp netlink API を使用した Linux 用のコマンドも含まれています。

さらに読む

  • ジョナサン・デ・ボイン・ポラード (2019)。 ifconfig . ノッシュ ガイド .ソフトウェア。
  • エドゥアルド・フェッロ (2009-04-16)。 ifconfig:間違った IP アドレス / 初期パッチを報告する . Debian バグ #359676。

標準の ifconfig 多くのディストリビューションでは、いくつかの理由で非推奨になっています。カーネルとの会話は時代遅れで限定的なものであり、実際、すべてのネットワーク構成を理解しているわけではありません。 ifconfig などの一部のネットワーク構成を操作できなくなります ip で実行できるバージョン .さらに、ifconfig ネットワーク名前空間のサポートは制限されています。

逸話として、ip でのみ表示されるインターフェイス IP エイリアスを見つけました SuSE ifconfig にはありません .

内部の違いについて:ifconfig と ip から:What’s Difference and Comparing Network Configuration

<ブロック引用>

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

ifconfig の間 ほとんどの場合、システムのインターフェースを表示または変更します。このコマンドは次のタスクを実行できます:

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

  • ホストの新しいスタティック ARP エントリを作成しながら、ARP キャッシュ エントリを追加、削除します。

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

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

それを古い対応する ifconfig から分離する主なハイライトの 1 つは、後者がネットワーク構成に ioctl を使用することです。これは、カーネルとの相互作用のあまり評価されていない方法ですが、前者は、inter- rtnetlink を使用したカーネルとユーザー空間間の通信 (ネットワーク環境操作機能を追加します)。

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

<ブロック引用>

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

.....

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

....

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


Linux
  1. Linuxのchgrpおよびnewgrpコマンドの概要

  2. Linuxでの「su」コマンドと「su-」コマンドの違いを学ぶ

  3. Linuxコマンド-概要と例

  1. Linuxのrebootおよびshutdownコマンド

  2. 11 Linux で便利な「ssh」および「scp」コマンド

  3. Bash の ${} と $() の違い

  1. Linuxのwatchコマンドでコマンドとタスクを監視する

  2. Linuxコマンド:jobs、bg、およびfg

  3. 「ifconfig」コマンドと「ip」コマンドの違い