Linuxのネットワーキングは、個別のサブシステムリリースではなく、メインラインの段階的なリリースによって進化します。以下のマイルストーンは、各機能を含む最初の安定版カーネルを示します。後続のカーネルでは、プロトコルの対応範囲、ドライバー、オフロード、またはユーザー空間インターフェースが追加されている場合があります。
ネットワーク機能のクイックファクト #
| Feature | Kernel | Release Date | Maintainer Page | Quick Fact |
|---|---|---|---|---|
| Netfilter and iptables | 2.4.0 | January 4, 2001 | netfilter.org | Netfilterは拡張可能なパケット処理フックを導入し、iptablesはフィルタリング、NAT、パケット変更のルールをユーザー空間に公開しました。 |
| NAPI | 2.6.0 | December 17, 2003 | NAPIは割り込み通知とポーリングを組み合わせ、高いレートでインターフェースがパケットを受信する際の割り込みオーバーヘッドを削減しました。 | |
| CUBIC TCP congestion control | 2.6.13 | August 28, 2005 | CUBICは、直前の輻輳イベントからの経過時間に対する3次関数から輻輳ウィンドウを選択します。Linux 2.6.19では、後にデフォルトのTCP輻輳制御アルゴリズムになりました。 | |
| Network namespaces | 2.6.24 | January 24, 2008 | 初期対応では、ネットワークデバイス、プロトコルスタック、ルーティングテーブル、ファイアウォールルール、ソケットが分離されました。後続のリリースでは、デバイスとプロトコルの対応範囲が拡張されました。 | |
| Generic Receive Offload (GRO) | 2.6.29 | March 23, 2009 | GROは上位層で処理する前に関連パケットを集約し、NIC固有の受信オフロードを必要とせずにパケット単位のコストを償却します。 | |
| Receive Packet Steering and Receive Flow Steering | 2.6.35 | August 1, 2010 | RPSは受信処理をソフトウェアでCPU間に分散し、RFSはフローの局所性を追加して、パケット処理を消費側アプリケーションに追従させます。 | |
| TCP Fast Open client support | 3.6 | September 30, 2012 | TFOは、クライアントが有効なCookieを持つ場合、接続開始時のSYNにアプリケーションデータを含められます。サーバー対応はLinux 3.7で追加されました。 | |
| nftables | 3.13 | January 20, 2014 | nftables project | nftablesは、プログラム可能なパケット分類エンジンと、個別のiptables、ip6tables、arptables、ebtablesインターフェースを置き換えることを目的としたNetlink APIを追加しました。 |
| Extended BPF | 3.18 | December 7, 2014 | eBPF project | bpf()システムコールとeBPF仮想マシンは、ソケットフィルター、トラフィック制御、トレーシング、後のXDPで使用される検証済みJITコンパイルプログラムの基盤を提供しました。 |
| Virtual Routing and Forwarding (VRF) | 4.3 | November 2, 2015 | VRFデバイスによって、インターフェースは1つのネットワーク名前空間を共有しながら個別のルーティングテーブルを使用できます。これにより、別の名前空間を作成せずにルートを分離できます。 | |
| eXpress Data Path (XDP) | 4.8 | October 2, 2016 | XDP project | XDPはカーネルがソケットバッファーを割り当てる前にeBPFプログラムを実行し、早期のパケット破棄、リダイレクト、ロードバランシングを可能にします。 |
| BBR congestion control | 4.9 | December 11, 2016 | Google BBR | BBRは、パケット損失を主要な輻輳シグナルとして扱うのではなく、ボトルネック帯域幅とラウンドトリップ伝搬時間をモデル化します。 |
| Kernel TLS transmit offload | 4.13 | September 3, 2017 | kTLSは、送信データのTLSレコード暗号化とフレーミングをカーネル内に移しました。受信対応はLinux 4.17で追加されました。 | |
| AF_XDP sockets | 4.18 | August 12, 2018 | XDP project | AF_XDPは共有メモリリングを介してXDPプログラムをユーザー空間に接続し、ドライバーに応じてコピー方式とゼロコピー方式をサポートします。 |
| Multipath TCP | 5.6 | March 29, 2020 | MPTCP upstream project | 初期のアップストリームMPTCP対応により、1つの論理トランスポート接続で異なる経路上の複数のTCPサブフローを使用できるようになりました。 |
| WireGuard | 5.6 | March 29, 2020 | WireGuard | WireGuardは、小規模なプロトコルと暗号面を備えた、カーネル内暗号化レイヤー3トンネルを追加しました。 |
| IPv6 BIG TCP | 5.19 | July 31, 2022 | BIG TCPはホストスタック内でGSOでないパケットサイズを大きくできるため、高速リンクでのパケット単位のオーバーヘッドを削減します。IPv4対応はLinux 6.3で追加されました。 |
リリース日はLinuxカーネルGit履歴のメインラインタグに従っています。機能のバージョンは、KernelNewbiesのリリース概要とカーネルネットワーキング文書で相互参照しています。
カーネルとユーザー空間の境界 #
Linuxにはadd_route()やcreate_veth()のようなシステムコールはありません。代わりに、ユーザー空間はカーネル制御インターフェースを選択し、汎用システムコールを介してアクセスします。特にNetlinkは、システムコールではなく、ソケットプロトコルのファミリーです。
| Syscalls | Control Interface | Network Configuration Role | Current Guidance |
|---|---|---|---|
socket(), bind(), sendmsg(), and recvmsg() | Netlink | プロセスはAF_NETLINKソケットを開き、Netlinkファミリーと構造化メッセージを交換します。NETLINK_ROUTEは、リンク、アドレス、ルート、近隣、トラフィック制御、および関連オブジェクトを設定します。Generic Netlinkとサブシステムプロトコルは、nftables、nl80211、ethtool、devlink、WireGuardなどを対象とします。 | システム全体のネットワーク設定には、該当するNetlinkファミリーを優先します。メッセージ属性、確認応答、マルチパート応答、APIの進化には慎重な処理が必要なため、保守されているライブラリまたはツールを使用します。 |
ioctl() | Socket and device ioctls | SIOCSIFFLAGS、SIOCSIFADDR、SIOCSIFMTUなどの要求でインターフェースを設定します。プライベートデバイスioctlと旧来のethtoolおよびWireless Extensions ABIも同じシステムコールを使用します。 | 互換性のためioctl対応を維持しますが、サブシステムにNetlink APIがある場合は使用します。ioctlコマンドは固定された要求構造体を持つため、安全な拡張が困難です。 |
setsockopt() and getsockopt() | Socket options | ソケットオプションは、マーク、バッファーサイズ、デバイスバインディング、マルチキャストメンバーシップ、TCPパラメーター、接続済みフィルターなど、ソケット単位の動作を設定します。旧来のiptablesも、プロトコル固有のソケットオプションを介してルールをアップロードおよび読み取ります。 | 1つのソケットに属する設定には、引き続きソケットオプションを使用します。新しいファイアウォール統合では、旧来のiptablesソケットオプションABIではなく、Netlink上のnftablesを使用します。 |
bpf() | eBPF object API | bpf()はプログラムのロード、マップの作成と更新、オブジェクトの照会、対応するBPFリンクの作成を行います。ネットワークプログラムは、ソケット、トラフィック制御、cgroup、XDPなどのフックで実行できます。一部のアタッチ経路では、引き続きNetlinkまたはソケットオプションを使用します。 | 生のbpf()コマンドを発行するのではなく、libbpfを使用します。フックが対応している場合はBPFリンクを優先します。リンクによってアタッチメントの有効期間が明示されるためです。必要な場合は、フックで確立されたNetlink APIを使用します。 |
openat(), read(), and write() | procfs and sysfs | /proc/sys/net下のファイルはネットワークsysctlを公開し、/proc/netおよび/sys/class/net下の一部のファイルは状態または限定的な制御を公開します。これらの呼び出しは仮想ファイルを操作しますが、データはカーネルが供給または消費します。 | ホストまたは名前空間のチューナブルには、文書化されたsysctlを使用します。構造化されたNetlinkダンプが存在する場合は、procfsを解析しないでください。procfsの形式は主にテキストインターフェースであり、属性が省略される場合があるためです。 |
clone(), clone3(), unshare(), and setns() | Network namespaces | CLONE_NEWNETはネットワーク名前空間を作成するか、名前空間セットアップ経路に実行を移します。setns()は既存の名前空間に参加します。その後、設定コマンドは呼び出しスレッドの名前空間によって選択されたネットワークスタックを操作します。 | まず名前空間を確立し、その後Netlinkで設定します。名前空間の切り替えはスレッド単位の状態として扱い、制御されていないマルチスレッドプロセスから同時に変更しないでください。 |
ほとんどの管理操作では、対象ネットワーク名前空間を管理するユーザー名前空間内のCAP_NET_ADMINが必要です。eBPF操作では、プログラムの種類、アタッチポイント、カーネルバージョンに応じて、CAP_BPF、CAP_PERFMON、またはその他のケーパビリティも必要になる場合があります。
推奨インターフェースの変化 #
- 初期のLinuxではioctl、ソケットオプション、仮想ファイルが使用されていました。
ifconfig、route、arpなどのプログラムは、ネットワークデバイスおよびルーティングioctlを発行していました。/proc/sys/netはグローバルなチューナブルを提供し、旧来のiptablesによるファイアウォール世代ではプロトコル固有のソケットオプションが使用されていました。 - Rtnetlinkが拡張可能なネットワーク制御プレーンになりました。 Linux 2.2は、
NETLINK_ROUTEを介してリンク、複数のアドレス、ルート、近隣、トラフィック制御オブジェクトを公開しました。そのため、iproute2ツール(ip、bridge、tc)は、新しい設定においてioctl指向のnet-toolsコマンドを置き換えました。 - サブシステム固有のNetlinkファミリーが固定プライベートABIを置き換えました。 Generic Netlinkおよび関連プロトコルによって、システムコールを変更せずにコマンドとtype-length-value属性を進化させられるようになりました。nl80211はWireless Extensionsを、nftablesは旧来のiptablesルールABIを置き換え、新しいethtool操作ではデバイスioctlではなくNetlinkが使用されます。
- eBPFがプログラム可能なデータプレーン境界を追加しました。
bpf()システムコールはプログラムとマップを管理しますが、設定はアタッチポイントごとに分かれています。rtnetlinkはトラフィック制御と既存のXDPアタッチメントを設定し、ソケットオプションは従来のソケットフィルターをアタッチし、BPFリンクは対応するフックに対してファイルディスクリプターによる有効期間管理を提供します。 - 新しい制御プレーンは記述されたNetlink APIを優先します。 現在のカーネルネットワーキング開発では、機械可読な仕様によってNetlinkファミリーを文書化しています。アプリケーションはこれらのAPIを使用し、確認応答と拡張確認応答を要求し、対応する構造化された代替がないインターフェースに限ってioctlまたはテキストファイル解析を使用すべきです。
対応するUAPIの詳細については、カーネルのNetlink入門、rtnetlink(7)、netdevice(7)、bpf(2)ドキュメントを参照してください。
Rtnetlink #
rtnetlinkのrtはroutingを意味しますが、このインターフェースはカーネルの汎用ネットワーク制御プロトコルへと拡張されています。プロセスはsocket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)を開き、RTM_*メッセージを送信します。各メッセージには、struct nlmsghdr、オブジェクト固有の固定ヘッダー、アラインメントされたtype-length-value属性が含まれます。
Rtnetlinkは、次の3種類のやり取りをサポートします。
- Do request: 1つのオブジェクトを作成、置換、変更、削除し、確認応答を受信します。
- Dump request: すべてのリンクやすべてのルートなど、オブジェクトクラスを列挙します。カーネルは
NLMSG_DONEで終了するマルチパート応答を返します。 - Multicast notification: リンク、アドレス、ルート、近隣、ルール、トラフィック制御などの変更についてグループを購読します。通知では返信と同じオブジェクトメッセージを使用するため、プログラムはローカルキャッシュを維持できます。
管理対象オブジェクト #
| Object | Principal Messages | Operations and State |
|---|---|---|
| Network links | RTM_NEWLINK, RTM_SETLINK, RTM_DELLINK, RTM_GETLINK | 登録されたリンク種別がサポートする仮想デバイス(vethペア、ブリッジ、ボンド、VLANデバイス、VRF、macvlan/macvtap、VXLAN、Geneve、ダミーデバイスなど)を作成および削除します。管理状態、MTU、名前、MACアドレス、キュー数、グループ、エイリアス、マスター関係、名前空間配置、プロトコル固有のリンクオプションを変更します。キャリア状態、動作状態、キュー設定、物理識別子、VF設定、統計情報、XDPアタッチメント情報を照会します。 |
| Link properties | RTM_NEWLINKPROP, RTM_DELLINKPROP, RTM_GETLINKPROP | 補助的なリンクプロパティ、主に代替インターフェース名を追加、削除、一覧表示します。 |
| Protocol addresses | RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR | IPv4、IPv6、対応する非IPアドレスを追加、置換、削除、列挙します。属性は、ローカルおよびピアアドレス、プレフィックス長、スコープ、ブロードキャストまたはエニーキャストアドレス、フラグ、ラベル、推奨有効期間、有効期間を記述します。 |
| Address-selection labels | RTM_NEWADDRLABEL, RTM_DELADDRLABEL, RTM_GETADDRLABEL | インターフェースアドレスとは独立して、IPv6の送信元および宛先アドレス選択ラベルを管理します。 |
| Routes | RTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE | 複数のテーブルで、ユニキャスト、ローカル、ブロードキャスト、マルチキャスト、blackhole、unreachable、prohibit、throwルートを管理します。ルートは、入力および出力インターフェース、ゲートウェイ、優先送信元、メトリック、MTU、輻輳制御パラメーター、有効期限、realm、マーク、マルチパスネクストホップ、軽量トンネルカプセル化を選択できます。RTM_GETROUTEは、テーブルダンプと、指定されたフローキーによるルート検索の両方をサポートします。 |
| Policy-routing rules | RTM_NEWRULE, RTM_DELRULE, RTM_GETRULE | 優先度と、送信元、宛先、入力または出力インターフェース、ファイアウォールマーク、UID範囲、IPプロトコル、ポート、DSCP、フローレベル、レイヤー3マスターデバイスなどのセレクターに基づいて、ルーティングテーブルまたはアクションを選択します。アクションには、テーブル検索、goto、blackhole、unreachable、prohibitがあります。 |
| Nexthop objects | RTM_NEWNEXTHOP, RTM_DELNEXTHOP, RTM_GETNEXTHOP | 各ルートにすべての経路を埋め込むのではなく、再利用可能なネクストホップとネクストホップグループ(レジリエントグループを含む)を作成します。オブジェクトには、ゲートウェイ、デバイス、グループメンバーシップ、重み、保護フラグ、カプセル化状態が含まれます。 |
| Resilient nexthop buckets | RTM_NEWNEXTHOPBUCKET, RTM_DELNEXTHOPBUCKET, RTM_GETNEXTHOPBUCKET | レジリエントネクストホップグループで使用されるバケットとネクストホップのマッピングを検査し、対応している場合は制御します。メンバーシップの変更によって影響を受けるフローを少なくできます。 |
| Neighbours | RTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH | ARP、IPv6 NDP、および関連する近隣キャッシュエントリを管理および検査します。状態には、プロトコルアドレス、リンク層アドレス、インターフェース、到達可能性状態、ルーターおよびプロキシフラグ、プローブデータ、オフロード状態、キャッシュタイムスタンプが含まれます。ブリッジ転送データベースのエントリも、ブリッジ固有の属性を持つ近隣メッセージを使用します。 |
| Neighbour tables | RTM_NEWNEIGHTBL, RTM_SETNEIGHTBL, RTM_GETNEIGHTBL | 近隣探索のガベージコレクションしきい値、到達可能時間、再送時間、プローブ数、キュー制限、stale時間、プロキシ動作を調整し、テーブル統計を読み取ります。 |
| Traffic-control queueing disciplines | RTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC | ルート、ingress、egress、子qdiscをアタッチ、設定、置換、検査、削除します。例としてfq、fq_codel、htb、tbf、netem、cake、clsact、およびドライバーが対応する場合のハードウェアオフロードqdiscがあります。 |
| Traffic classes | RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS | classful qdisc下のクラス階層を管理します。レート、上限、優先度、親ハンドル、実装固有のパラメーターが含まれます。 |
| Traffic-control filters and chains | RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER, RTM_NEWCHAIN, RTM_DELCHAIN, RTM_GETCHAIN | パケットを分類し、クラスまたはアクションを選択します。フィルターにはflower、u32、route、matchall、BPFがあり、チェーンはブロックを順序付けられたステージに分割します。属性によってハードウェアオフロードを要求し、オフロードが成功したかどうかを報告できます。 |
| Traffic-control actions | RTM_NEWACTION, RTM_DELACTION, RTM_GETACTION | drop、redirect、mirror、police、tunnel-key操作、VLAN操作、パケット編集、コネクショントラッキング、サンプリング、BPF実行など、再利用可能なアクションを作成および検査します。 |
| Bridge multicast database | RTM_NEWMDB, RTM_DELMDB, RTM_GETMDB | グループ、ポート、VLAN、送信元固有マルチキャスト状態、ルーターポート状態、タイマー、ハードウェアオフロード情報を含む、ブリッジおよびswitchdevのマルチキャスト転送エントリを管理します。 |
| Bridge VLAN state | RTM_NEWVLAN, RTM_DELVLAN, RTM_GETVLAN | ブリッジポート上のVLANメンバーシップとVLAN単位のブリッジオプションを管理します。VLANネットワークデバイスの作成とは異なり、後者ではリンク種別vlanを指定したRTM_NEWLINKを使用します。 |
| Network-namespace identifiers | RTM_NEWNSID, RTM_DELNSID, RTM_GETNSID | ピアネットワーク名前空間に対して、名前空間ローカルな数値IDを割り当て、解決します。rtnetlink属性は、オブジェクトが別の名前空間を参照するときにこれらのIDを使用します。 |
| Per-interface protocol configuration | RTM_NEWNETCONF, RTM_DELNETCONF, RTM_GETNETCONF | 転送、逆方向パスフィルタリング、マルチキャスト転送、プロキシ近隣動作、リンク停止時のルート処理など、選択されたIPv4、IPv6、MPLSインターフェース設定を読み取り、変更を受信します。対応範囲は/proc/sys/netより狭いです。 |
| Data Center Bridging | RTM_GETDCB, RTM_SETDCB | 対応ドライバーと、優先度、優先度グループ、Priority Flow Control、アプリケーション優先度、DCBケーパビリティなどのData Center Bridging設定を交換します。 |
| Prefix and IPv6 ND information | RTM_NEWPREFIX, RTM_NEWNDUSEROPT | プレフィックスやユーザーオプションなど、IPv6 Router Advertisementから学習した情報を配信します。これらのメッセージクラスは、汎用セッターとして動作するのではなく、主にカーネルが観測した状態を報告します。 |
| Multicast and anycast address reports | RTM_GETMULTICAST, RTM_GETANYCAST and corresponding notification types | 操作を実装しているアドレスファミリーについて、マルチキャストおよびエニーキャストアドレスの状態を列挙または報告します。対応はアドレスファミリーに依存します。 |
| Link and offload statistics | RTM_NEWSTATS, RTM_GETSTATS, RTM_SETSTATS | 標準リンクカウンター、リンク単位の拡張統計、選択されたオフロード統計を取得します。セッター対応は対象サブシステムが実装する属性に限定されます。 |
| Cache and tunnel reports | RTM_NEWCACHEREPORT, RTM_NEWTUNNEL, RTM_DELTUNNEL, RTM_GETTUNNEL | アドレスファミリーのキャッシュイベントを報告し、アドレスファミリーが実装するトンネル状態を管理または報告します。利用可能性と受け付ける属性はプロトコルモジュールに依存します。 |
RTM_NEW*は常に「新規作成のみ」を意味するわけではありません。フラグが変更の意味を決定します。
| Flag | Meaning |
|---|---|
NLM_F_CREATE | 存在しない場合にオブジェクトを作成します。 |
NLM_F_EXCL | オブジェクトがすでに存在する場合は失敗します。 |
NLM_F_REPLACE | 既存のオブジェクトを置き換えます。 |
NLM_F_APPEND | 対応している場合、順序付きコレクションの末尾にオブジェクトを追加します。 |
NLM_F_ACK | 成功またはNLMSG_ERROR確認応答を返します。 |
NLM_F_DUMP | マルチパート列挙を要求します。`NLM_F_ROOT |
アプリケーションはNETLINK_EXT_ACKも有効にすべきです。拡張確認応答は、拒否された属性を特定し、人間が読めるカーネルメッセージを含め、ポリシー制約を報告できます。成功した確認応答は、カーネルがそのメッセージを処理したことを意味しますが、個別のrtnetlink要求のシーケンスがトランザクショナルになることは意味しません。
名前空間と一貫性モデル #
rtnetlinkソケットは、それが関連付けられているネットワーク名前空間で動作します。そのため、ほとんどの要求は、その名前空間のリンク、ルート、ルール、近隣、トラフィック制御オブジェクトだけを参照および変更します。リンク属性によってデバイスを別の名前空間に移動でき、名前空間IDメッセージによってピア名前空間への参照を作成できます。
変更要求では通常、対象ネットワーク名前空間を所有するユーザー名前空間内のCAP_NET_ADMINが必要です。機密性のあるデバイスまたはプロトコル情報を公開する読み取り要求も制限される場合があります。
ダンプはアトミックなスナップショットではありません。マルチパートダンプの進行中にオブジェクトが変更される可能性があり、受信バッファーがオーバーフローするとマルチキャスト通知が失われる場合があります。状態同期器は次の処理を行うべきです。
- 必要なマルチキャストグループにソケットを開いてバインドします。
- 一意のシーケンス番号でダンプを要求します。
- シーケンス番号と送信元ポートIDによってユニキャスト返信を照合します。
- ダンプ中に到着した通知を処理します。
ENOBUFS、中断されたダンプ、不正な属性を検出します。- 同期を証明できない場合はキャッシュを破棄し、ダンプを再実行します。
スコープの境界 #
Rtnetlinkはネットワークトポロジー、アドレス指定、転送、近隣、トラフィック制御を管理しますが、すべてのネットワークサブシステム向けのインターフェースではありません。
| Facility | Control Interface |
|---|---|
| nftables and connection tracking | NETLINK_NETFILTER families |
| Wi-Fi configuration | Generic Netlink上のnl80211 |
| Modern NIC settings | Generic Netlink上のethtool |
| devlink devices, ports, resources, and health reporters | Generic Netlink上のdevlink |
| WireGuard peer and key configuration | Generic Netlink上のwireguard |
| MPTCP path-manager configuration | Generic Netlink上のmptcp_pm |
| Per-socket TCP, UDP, multicast, and device-binding options | setsockopt() |
| Network sysctls not represented by netconf messages | /proc/sys/net |
| eBPF program and map lifecycle | bpf()。アタッチには追加でrtnetlinkを使用する場合があります |
権威ある操作一覧はinclude/uapi/linux/rtnetlink.hで定義されています。カーネルは、リンク、アドレス、ルート、ルール、近隣、トラフィック制御向けの機械可読仕様も公開しています。高水準プログラムでは、UAPI構造体のレイアウトと属性検証を手作業で再現するのではなく、保守されているライブラリまたはiproute2を使用すべきです。
ユーザー空間ネットワークユーティリティ #
Linuxには、単一のユーザー空間ネットワークスタックはありません。コマンドラインツール、ポリシーデーモン、設定レンダラー、ルーティングデーモン、コンテナプラグインは、異なるカーネル制御インターフェースにアクセスします。そのため、高水準コマンドはカーネルではなくデーモンを制御する場合があります。
| Software | Primary Role | Path to the Kernel |
|---|---|---|
| iproute2 | ipはリンク、アドレス、ルート、ルール、近隣、ネットワーク名前空間を管理し、bridgeはブリッジ状態を管理し、tcはトラフィック制御を管理し、ssはソケットを検査します。 | プログラムはiproute2の内部Netlinkサポートを直接使用します。ほとんどの設定はrtnetlinkを通過し、ソケット検査には診断用Netlinkファミリーを使用します。iproute2は実行可能ファイルのスイートであり、他のネットワークマネージャーが必要とするデーモンではありません。 |
| NetworkManager | Ethernet、Wi-Fi、モバイルブロードバンド、VPN、IP設定、DNS統合の接続プロファイルとポリシーを維持します。nmcli、nmtui、デスクトップアプレット、アプリケーションはクライアントです。 | nmcliはlibnmを使用して、D-Bus経由でNetworkManagerデーモンを呼び出します。デーモンのLinuxプラットフォーム層は通常のリンク、アドレス、ルート、ルール、トラフィック制御操作のためにNetlinkソケットを直接開き、これらの操作をip実行ファイル経由では送信しません。オプションのヘルパーは、Wi-Fi認証、PPP、DHCP、DNS、ファイアウォール統合などを処理します。 |
| systemd-networkd | 宣言的な.network、.netdev、.link設定を適用し、DHCPおよびルーター検出クライアントを実行し、ネットワーク状態を維持します。networkctlは検査および制御用CLIです。 | systemd-networkdはsystemd内部のNetlink実装を使用してカーネルを設定します。networkctlは管理対象設定でiproute2を呼び出すのではなく、networkdのAPIと状態を使用します。 |
| Netplan | ディストリビューションレベルのYAMLをバックエンド設定に変換し、その設定の適用を調整します。 | NetplanはNetworkManagerまたはsystemd-networkdをレンダラーとして選択します。継続的なカーネル設定を実行するのは、NetplanのYAMLパーサーではなく選択されたデーモンです。 |
| nftables | nftはファイアウォール、NAT、パケット分類、集合またはマップのルールを作成します。libnftablesはアプリケーションに同じエンジンを公開します。 | nftはlibnftablesとlibnftnlを使用し、NETLINK_NETFILTERを介してnftablesサブシステムとバッチメッセージを交換します。rtnetlinkまたはiproute2は使用しません。 |
| firewalld | 動的なファイアウォールゾーン、サービス、ポリシー、実行時設定と永続設定を維持します。firewall-cmdは主要CLIです。 | firewall-cmdはD-Bus経由でfirewalldデーモンを呼び出します。デーモンは通常、NetworkManagerまたはiproute2にルールのインストールを依頼するのではなく、nftablesバックエンドを通じてルールを適用します。 |
| ethtool | リンクモード、チャネル、リング、コアレッシング、オフロード、RSS、統計、ファームウェアデータなど、ドライバーとNICのプロパティを読み取り、変更します。 | 新しい操作ではethtool Generic Netlinkファミリーを使用します。古い操作またはまだ変換されていない操作ではSIOCETHTOOL ioctlを使用するため、選択される経路はコマンドとカーネルの対応状況に依存します。 |
iw | 802.11物理デバイス、仮想インターフェース、チャネル、ステーション、スキャン、省電力、規制状態を検査および設定します。 | iwはnl80211 Generic Netlinkファミリーにコマンドを送信します。ipを呼び出しませんが、生成されたインターフェースの通常のリンクおよびIP層設定は引き続きipが担当します。 |
| wpa_supplicant and iwd | Wi-Fiのスキャン、認証、アソシエーション、ローミング、鍵管理を実行します。 | 各デーモンはnl80211を通じてcfg80211/mac80211を制御します。NetworkManagerはD-Bus経由でいずれかのデーモンを制御でき、Wi-Fiデーモンがその後カーネルと通信します。 |
| conntrack-tools | Netfilterのコネクショントラッキング状態を一覧表示、変更、監視、複製します。 | conntrackとconntrackdは、rtnetlinkとは独立して、NETLINK_NETFILTER上のctnetlinkを使用します。 |
| bpftool | eBPFプログラム、マップ、リンク、BTF、cgroup、および選択されたネットワークアタッチメントをロードおよび検査します。 | ほとんどのオブジェクトライフサイクル操作では、libbpfとbpf()システムコールを使用します。一部のネットワーク操作では、rtnetlinkで管理されるXDPおよびトラフィック制御状態も検査または変更します。 |
| FRRouting and BIRD | BGP、OSPF、IS-IS、RIPなどのルーティングプロトコルを実装し、学習したルートをカーネルFIBと調整します。 | FRRoutingのプロトコルデーモンはzebraデーモンにルートを送信し、zebraがrtnetlinkを通じてカーネルを設定します。BIRDはLinux上で、ルーティングソケットまたはNetlinkを通じて独自のカーネルプロトコル同期を実行します。どちらも定常状態のルートインストールにip実行ファイルを必要としません。 |
| Open vSwitch | 仮想化、コンテナ、オーバーレイ、ソフトウェア定義ネットワーキング向けのプログラム可能な仮想スイッチングを実装します。 | ovs-vsctlはOVSデータベースを変更し、ovs-vswitchdはその設定を消費して、OVS Generic Netlinkファミリーを通じてLinux OVSデータパスを制御します。補助的なリンクおよびトンネル設定ではrtnetlinkも使用される場合があります。 |
| CNI plugins | 対応するランタイムがプラグインを呼び出したときに、コンテナネットワーク名前空間を設定します。一般的なプラグインはvethペア、ブリッジ、ルート、ポリシー、オーバーレイを作成します。 | プラグインは短時間実行のプログラムとして動作し、通常はGo Netlinkライブラリを直接使用します。プラグインはファイアウォール、eBPF、IPAM、データストアコンポーネントを追加で呼び出すかリンクする場合があります。CNIは単一のカーネルバックエンドではなく、呼び出しと結果の形式を規定します。 |
| net-tools | 旧来のifconfig、route、arp、netstatコマンドを提供します。 | ツールは主にネットワークデバイスおよびルーティングioctlを使用し、procfsを解析します。新しい自動化では、iproute2と構造化されたNetlinkインターフェースがこれらに取って代わります。 |
制御と依存関係の経路 #
矢印はパッケージの所有関係ではなく、実行時の制御フローを表します。NETLINK_ROUTE、NETLINK_NETFILTER、nl80211は、AF_NETLINKソケットを介して到達するカーネルプロトコルです。
この図は、一般的なnmcliの依存関係に関する疑問に直接答えます。
nmcliはlibnmを通じて要求を構築します。- libnmはD-Bus経由で要求をNetworkManagerデーモンに送信します。
- NetworkManagerは独自のNetlink実装を通じて、通常のカーネルネットワーク状態を適用します。
- iproute2は同じカーネルAPIの独立した管理クライアントであり、NetworkManagerとカーネルの間の中間層ではありません。
シェル自動化では、プログラムからip、nft、または別のCLIを呼び出すことが依然として有用です。ただし、長時間実行されるマネージャーは一般にライブラリを使用するか、カーネルプロトコルを直接実装します。直接アクセスによってコマンド出力の解析を避けられ、マネージャーは非同期状態通知を購読できます。
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)