route コマンド

Download Report

Transcript route コマンド

route コマンド
tomine@sing (B1)
<[email protected]>
親:yasu
目的

プログラミングに関する経験と知識の向上


C 言語に対する知識や経験を深める
題材として、route コマンド
なぜ、route コマンド?


ルーティングに興味があった
route コマンドは C 言語の機能を多用する



ソケット
ポインタ
構造体
route コマンドとは


UNIX OS に実装されている
IPルーティングテーブルを手動で操作


ルーティングの基礎
静的なルーティング

動的ルーティングの場合は、
ルーティングプロトコルデーモンが
自動的に変更
今回は

route コマンドではなく…


netstat –rn –f inet のような出力をするもの
ネットワークアドレスとサブネット長を引数にす
ると、その引数にマッチする経路を表示する

このようなものを作っていきます
route_more

機能は2つ



どちらもsysctl関数を使う


route_more show
route_more match
カーネルの持っているルーティングテーブル
の全ての内容を取ってくる
実装環境

FreeBSD 5.0-RELEASE
sysctl() 関数

どのようなプロセスでもルーティングテーブ
ルとインターフェースリストを取得できる


スーパーユーザの権限不要
与える引数によって返ってくる内容が違う


int 型の配列の中に欲しいものの情報を書く
今回はAF_ROUTEを渡す
route_more show

route_show()




sysctlでルーティングテーブルをすべて引き
出す
for 文でひとつずつルーティング情報のエント
リを読み出す
ネットマスクの値からプレフィックス長を調べる
netstat –rn のように表の形式で表示
route_more match

route_match()

引数として渡されたネットワークアドレスとサブ
ネット長を文字列処理をする



/ を境にネットワークアドレスとプレフィックス長に
分ける
ネットワークアドレスは inet_aton() をして構造体
に入れる
プレフィックス長は atoi() で int 型変数へ入れる
route_more match

route_match() (つづき)



sysctlでルーティングテーブルをすべて引き
出す
for 文でひとつずつルーティング情報のエント
リを読み出す
ネットマスクの値からプレフィックス長を調べる


引数として与えられたプレフィックス長と比較する
引数より小さかったら表示しない
route_more match

route_match() (つづき)

プレフィックス長からアドレスのネットワーク部
を抜き出す



引数のアドレスとルーティングテーブルのエントリ
のネットワーク部を排他的論理和(XOR)演算する
演算の結果が0以外なら表示しない
netstat –rn のように表の形式で表示
デモ
今後の課題

今回はルーティングソケットを自分では操
作しなかった


ソケットの操作も大切なので追って勉強する
AP などへのルートのエントリの Gateway
にインターフェースのインデックスや MAC
アドレスを表示できなかった

今後、実装する
まとめ

今回のタームプロジェクトを通じて学習した
もの


論理演算やポインタなどの新しい知識
ルーティングの基本概念



ルーティングテーブルの内容
マッチ …など
C 言語の基本的な扱い方