22
ルーターの作り方 2014/09/20 OSC 広島 2014 ねむねむ@nemumupoyo

OSC hiroshima 2014

  • Upload
    nemumu

  • View
    358

  • Download
    0

Embed Size (px)

DESCRIPTION

OSC 広島 2014のLTで発表したスライドです。

Citation preview

Page 1: OSC hiroshima 2014

ルーターの作り方

2014/09/20 OSC 広島 2014

ねむねむ@nemumupoyo

Page 2: OSC hiroshima 2014

HN:ねむねむ

情報系の学生です

Twitter:@nemumupoyo

Page 3: OSC hiroshima 2014

自作ルーターって何?

Page 4: OSC hiroshima 2014

市販のルーターじゃダメなん?

Page 5: OSC hiroshima 2014

市販のルーターに対する不満• NICが足りない

!• 持ち運べない、環境が変わると再設定が必要 !

• パケットの転送先を動的に変更できない !

• 処理能力が低い (処理能力が高いルーターは買えない)

Page 6: OSC hiroshima 2014

OpenFlowとか あるじゃん

Page 7: OSC hiroshima 2014

OpenFlowじゃダメなの?• L2からビット単位でパケットを弄りたい

!• 独自のプロトコルが作れない !

• RFCに反した操作ができない

!

• でもOpenFlowも便利だよね

Page 8: OSC hiroshima 2014

OpenFlowじゃダメなの?• L2からビット単位でパケットを弄りたい

!• 独自のプロトコルが作れない !

• RFCに反した操作ができない

!

• でもOpenFlowも便利だよね

実用性 => OpenFlow 独自機能・学習用途 => 自作ルーター

Page 9: OSC hiroshima 2014

そろそろ作り方の解説

Page 10: OSC hiroshima 2014

作成する前に必要な確認• 主にC/C++で開発(別の言語でも出来るよ)

!• カーネルランドとユーザーランドを選択する必要有り !

• チェックサムオフロード機能があるか (ユーザーランドで作成する場合はオフにしないと

フックポイントの問題でチェックサムの確認で失敗する)

Page 11: OSC hiroshima 2014

カーネルランド? ユーザーランド?

Page 12: OSC hiroshima 2014

ざっくりとした説明

カーネルランド

ユーザランド (保護領域)

カーネルモジュール

ハードウェア

Page 13: OSC hiroshima 2014

ユーザーランドの特徴• 比較的ドキュメントが多い !

• デバッグが比較的容易 !

• 移植性の高いプログラムを作りやすい !

• フックポイントを選べない(自由度が低い)

Page 14: OSC hiroshima 2014

ユーザーランドプログラミングの良書

特徴:他書と比べてソースコードの割合が多い

Page 15: OSC hiroshima 2014

カーネルランドの特徴• ドキュメントはカーネルソース !

• コンパイル時にカーネルのソースが必要 !

• 処理優先度が高い(無限ループでフリーズ)

!

• NICがチェックサムを計算する前のパケットをフックすることができる

Page 16: OSC hiroshima 2014

カーネルランドプログラミングの参考資料

Page 17: OSC hiroshima 2014

今回はカーネルランドで作ってみる

Page 18: OSC hiroshima 2014

フックポインタの設定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 } };

Page 19: OSC hiroshima 2014

フック関数の定義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 *) ){ /* パケットをごにょごにょ */

}

Page 20: OSC hiroshima 2014

カーネル定義の便利な型struct in6_addr { union { __u8 u6_addr8[16]; __be16 u6_addr16[8]; __be32 u6_addr32[4]; }in6_u; }; // IPアドレスがサブネットごとに取り出せる

Page 21: OSC hiroshima 2014

まとめ• 自作ルーターならオレオレプロトコルが作れる !

• ルーティングしつつパケットを好き放題に操作できる !

• パケットのフォーマットを覚えるきっかけになる !

• 自作ルーターは楽しい(´・_・`)

Page 22: OSC hiroshima 2014

ご静聴ありがとうございました@nemumupoyo