Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ip_address_show_自作実装から学ぶNetlinkソケットプログラミング

Avatar for Takafumi Akiba Takafumi Akiba
August 13, 2025
10

 ip_address_show_自作実装から学ぶNetlinkソケットプログラミング

Avatar for Takafumi Akiba

Takafumi Akiba

August 13, 2025
Tweet

Transcript

  1. 自己紹介 2 秋葉 貴文 所属 • 北海道情報大学大学院 修士2年 湯村研究室 好きなもの

    • 電子ペーパー,ネットワーク,プログラミング ひとこと • yumulabステッカー配布しております!
  2. ip address show コマンドとは? 基本情報 • LinuxでネットワークインターフェースのIPアドレスや関連情報を表示 • IPv4 と

    IPv6 のアドレス,サブネットマスク,インターフェースの状態など • パッケージ:iproute2の一部 • 実行ファイル:/sbin/ip • 内部的にはNetlinkソケットを使ってカーネルから情報を取得 4
  3. ip address show コマンドの実行 5 • インターフェース番号と名前:「1: lo:」「2: eth0:」 など

    • インターフェースの状態: <LOOPBACK,UP,LOWER_UP> や state UP など • IPv4アドレス: inet 192.168.1.100/24 など • IPv6アドレス: inet6 fe80::5054:ff:fe12:3456/64 など • スコープ (scope): host, global, link などの有効範囲 • アドレスの有効期間: valid_lft および preferred_lft コマンドバリエーション • ip a • 短縮形 • ip addr show dev eth0 • インターフェース指定 • ip -6 addr • IPv6アドレスのみ表示
  4. Netlinkソケットとは? • Linuxカーネルとユーザー空間プロセスが情報をやり取りするためのソケット • ネットワーク設定や状態取得,インターフェース情報の取得などを行う • 今回はインターフェース情報の取得に用いる • 特徴 •

    アドレスファミリ:AF_NETLINK を使う • 通信の種類や目的をOSに伝える番号 • インターネット通信:AF_INET,AF_INET6 • カーネルとの制御情報のやり取り専用の通信路を作る • 例 • NETLINK_ROUTE : ネットワーク情報取得 • NETLINK_NETFILTER:パケットフィルタ設定 Netlinkソケットとは,カーネル設定や状態を直接やり取りするための特別なパイプ 6
  5. ip address show を自作していく GOAL • インターフェースごとのIPv4, v6アドレスを表示できること TODO 1.

    Netlinkソケットでインターフェース情報をカーネルに要求する 2. カーネルから struct ifaddrmsg を先頭に持つレスポンスを受け取る • struct ifaddrmsg : IPアドレスに関する基本情報 • struct ifinfomsg : インターフェース本体の状態情報 • 今回は使わない 3. ユーザー空間でレスポンスをパースし,整形して表示する 7
  6. struct ifaddrmsg を先頭に持つレスポンスを受け取る ifaddrmsg 先頭のレスポンスを受け取って分解 • マルチパートメッセージを読み切る • NLM_F_DUMP の応答は複数の

    RTM_NEWADDR に分割され,最後に NLMSG_DONE が来る • そこまで読み続ければ「全部取った」ことになる • NLMSG_ERROR は struct nlmsgerr で errno が入ってくる(負値) 10
  7. struct ifaddrmsg を先頭に持つレスポンスを受け取る ifaddrmsg 先頭のレスポンスを受け取って分解 • RTM_NEWADDR の先頭が struct ifaddrmsg

    • ifa_family : AF_INET / AF_INET6 • ifa_prefixlen : CIDR の長さ • ifa_index : どのインターフェースのアドレスか • ifa_scope : リンクローカル / グローバル など • よく使う属性 • IFA_ADDRESS : アドレス本体(IPv6 はこれが本命) • IFA_LOCAL : IPv4 ではローカルアドレス 11
  8. デモ! TODO • インターフェース名と IP アドレスが表示されること • 実行: ./self_ip_a •

    追加したインターフェースと IP アドレスが表示されること 1. dummy モジュールをロード: sudo modprobe dummy 2. 仮想 IF を追加(dummy0): sudo ip link add dummy0 type dummy 3. IP アドレスを割り当て: sudo ip addr add 192.168.100.1/24 dev dummy0 4. 有効化: sudo ip link set dummy0 up 5. 確認: ./self_ip_a 13
  9. まとめ ip address show コマンド • ネットワークインターフェースの IPv4/IPv6 アドレス・prefix・状態を表示 •

    Netlinkソケットでカーネルから情報取得 Netlinkソケット • カーネルとユーザー空間プロセス間の制御情報通信路(AF_NETLINK) • 「カーネル設定や状態をやり取りする専用パイプ」 自作手順 1. 要求送信 2. レスポンス受信 3. 表示 動作確認 • コマンドの実行 • dummy インターフェース作成後の表示確認 14