Upload
nemumu
View
358
Download
0
Embed Size (px)
DESCRIPTION
OSC 広島 2014のLTで発表したスライドです。
Citation preview
ルーターの作り方
2014/09/20 OSC 広島 2014
ねむねむ@nemumupoyo
HN:ねむねむ
情報系の学生です
Twitter:@nemumupoyo
自作ルーターって何?
市販のルーターじゃダメなん?
市販のルーターに対する不満• NICが足りない
!• 持ち運べない、環境が変わると再設定が必要 !
• パケットの転送先を動的に変更できない !
• 処理能力が低い (処理能力が高いルーターは買えない)
OpenFlowとか あるじゃん
OpenFlowじゃダメなの?• L2からビット単位でパケットを弄りたい
!• 独自のプロトコルが作れない !
• RFCに反した操作ができない
!
• でもOpenFlowも便利だよね
OpenFlowじゃダメなの?• L2からビット単位でパケットを弄りたい
!• 独自のプロトコルが作れない !
• RFCに反した操作ができない
!
• でもOpenFlowも便利だよね
実用性 => OpenFlow 独自機能・学習用途 => 自作ルーター
そろそろ作り方の解説
作成する前に必要な確認• 主にC/C++で開発(別の言語でも出来るよ)
!• カーネルランドとユーザーランドを選択する必要有り !
• チェックサムオフロード機能があるか (ユーザーランドで作成する場合はオフにしないと
フックポイントの問題でチェックサムの確認で失敗する)
カーネルランド? ユーザーランド?
ざっくりとした説明
カーネルランド
ユーザランド (保護領域)
カーネルモジュール
ハードウェア
ユーザーランドの特徴• 比較的ドキュメントが多い !
• デバッグが比較的容易 !
• 移植性の高いプログラムを作りやすい !
• フックポイントを選べない(自由度が低い)
ユーザーランドプログラミングの良書
特徴:他書と比べてソースコードの割合が多い
カーネルランドの特徴• ドキュメントはカーネルソース !
• コンパイル時にカーネルのソースが必要 !
• 処理優先度が高い(無限ループでフリーズ)
!
• NICがチェックサムを計算する前のパケットをフックすることができる
カーネルランドプログラミングの参考資料
今回はカーネルランドで作ってみる
フックポインタの設定static struct nf_hook_ops hook_ops[] __read_mostly = { // ルーティングでLANに入る時のフック
{ .hook = hook_routing_in, // フック先関数
.pf = PF_INET6, .hooknum= NF_INET_PRE_ROUTING, .priority = 0, .owner = THIS_MODULE } };
フック関数の定義unsigned int hook_routing_in(unsigned int hook, struct sk_buff *skb, // パケットの先頭ポインタ
const struct net_device *in, const struct net_device *out, int (*okfunc)(struct sk_buff *) ){ /* パケットをごにょごにょ */
}
カーネル定義の便利な型struct in6_addr { union { __u8 u6_addr8[16]; __be16 u6_addr16[8]; __be32 u6_addr32[4]; }in6_u; }; // IPアドレスがサブネットごとに取り出せる
まとめ• 自作ルーターならオレオレプロトコルが作れる !
• ルーティングしつつパケットを好き放題に操作できる !
• パケットのフォーマットを覚えるきっかけになる !
• 自作ルーターは楽しい(´・_・`)
ご静聴ありがとうございました@nemumupoyo