Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ip_address_show_自作実装から学ぶNetlinkソケットプログラミング
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Takafumi Akiba
August 13, 2025
45
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ip_address_show_自作実装から学ぶNetlinkソケットプログラミング
Takafumi Akiba
August 13, 2025
More Decks by Takafumi Akiba
See All by Takafumi Akiba
地方学生の成長を加速させる支援とは 〜新雪プログラムでの開発経験と修了後の展望〜
tarry
0
60
ICCE-Asia Presentation Slide
tarry
0
37
tcで遊ぶ!WebRTC配信をわざと崩してみた話
tarry
1
110
新雪プログラム 学内説明会
tarry
0
31
人の移動を活用した電子ペーパー更新システムの開発
tarry
0
260
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
The untapped power of vector embeddings
frankvandijk
2
1.8k
The Spectacular Lies of Maps
axbom
PRO
1
870
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Mobile First: as difficult as doing things right
swwweet
225
10k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.7k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
45k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.6k
Transcript
ip address show 自作実装から学ぶ Netlinkソケットプログラミング 北海道情報大学大学院 修士2年 秋葉貴文
自己紹介 2 秋葉 貴文 所属 • 北海道情報大学大学院 修士2年 湯村研究室 好きなもの
• 電子ペーパー,ネットワーク,プログラミング ひとこと • yumulabステッカー配布しております!
はじめに • 本発表で紹介する内容は昨日の夜学んだ内容です. • 間違いなどあっても温かく見守ってください 3
ip address show コマンドとは? 基本情報 • LinuxでネットワークインターフェースのIPアドレスや関連情報を表示 • IPv4 と
IPv6 のアドレス,サブネットマスク,インターフェースの状態など • パッケージ:iproute2の一部 • 実行ファイル:/sbin/ip • 内部的にはNetlinkソケットを使ってカーネルから情報を取得 4
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アドレスのみ表示
Netlinkソケットとは? • Linuxカーネルとユーザー空間プロセスが情報をやり取りするためのソケット • ネットワーク設定や状態取得,インターフェース情報の取得などを行う • 今回はインターフェース情報の取得に用いる • 特徴 •
アドレスファミリ:AF_NETLINK を使う • 通信の種類や目的をOSに伝える番号 • インターネット通信:AF_INET,AF_INET6 • カーネルとの制御情報のやり取り専用の通信路を作る • 例 • NETLINK_ROUTE : ネットワーク情報取得 • NETLINK_NETFILTER:パケットフィルタ設定 Netlinkソケットとは,カーネル設定や状態を直接やり取りするための特別なパイプ 6
ip address show を自作していく GOAL • インターフェースごとのIPv4, v6アドレスを表示できること TODO 1.
Netlinkソケットでインターフェース情報をカーネルに要求する 2. カーネルから struct ifaddrmsg を先頭に持つレスポンスを受け取る • struct ifaddrmsg : IPアドレスに関する基本情報 • struct ifinfomsg : インターフェース本体の状態情報 • 今回は使わない 3. ユーザー空間でレスポンスをパースし,整形して表示する 7
Netlinkソケットでインターフェース情報を要求する ソケット作成とバインド • AF_NETLINK / NETLINK_ROUTE はルーティング/アドレス管理用チャネル • sa.nl_pid =
getpid() • ユーザープロセス側のNetlinkエンドポイント ID • この値で往復の対応をつけられる 8
Netlinkソケットでインターフェース情報を要求する リクエストメッセージの組み立て • RTM_GETADDR:アドレス一覧を要求 • NLM_F_DUMP:ダンプ要求 • 該当する全エントリを複数メッセージで返してくる • ifa_family
= AF_UNSPEC:IPv4/IPv6 両方が対象 • nlmsg_seq:複数やり取り時に応答を識別するための番号 9
struct ifaddrmsg を先頭に持つレスポンスを受け取る ifaddrmsg 先頭のレスポンスを受け取って分解 • マルチパートメッセージを読み切る • NLM_F_DUMP の応答は複数の
RTM_NEWADDR に分割され,最後に NLMSG_DONE が来る • そこまで読み続ければ「全部取った」ことになる • NLMSG_ERROR は struct nlmsgerr で errno が入ってくる(負値) 10
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
ユーザー空間でレスポンスをパースし,整形して表示 • ip addr show っぽく IFを番号行 + アドレス行を字下げ •
prefixlen をそのまま /24 /64 として表示 12
デモ! 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
まとめ ip address show コマンド • ネットワークインターフェースの IPv4/IPv6 アドレス・prefix・状態を表示 •
Netlinkソケットでカーネルから情報取得 Netlinkソケット • カーネルとユーザー空間プロセス間の制御情報通信路(AF_NETLINK) • 「カーネル設定や状態をやり取りする専用パイプ」 自作手順 1. 要求送信 2. レスポンス受信 3. 表示 動作確認 • コマンドの実行 • dummy インターフェース作成後の表示確認 14