OSC hiroshima 2014
-
Upload
nemumu -
Category
Devices & Hardware
-
view
356 -
download
0
description
Transcript of OSC hiroshima 2014
![Page 1: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/1.jpg)
ルーターの作り方
2014/09/20 OSC 広島 2014
ねむねむ@nemumupoyo
![Page 2: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/2.jpg)
HN:ねむねむ
情報系の学生です
Twitter:@nemumupoyo
![Page 3: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/3.jpg)
自作ルーターって何?
![Page 4: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/4.jpg)
市販のルーターじゃダメなん?
![Page 5: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/5.jpg)
市販のルーターに対する不満• NICが足りない
!• 持ち運べない、環境が変わると再設定が必要 !
• パケットの転送先を動的に変更できない !
• 処理能力が低い (処理能力が高いルーターは買えない)
![Page 6: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/6.jpg)
OpenFlowとか あるじゃん
![Page 7: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/7.jpg)
OpenFlowじゃダメなの?• L2からビット単位でパケットを弄りたい
!• 独自のプロトコルが作れない !
• RFCに反した操作ができない
!
• でもOpenFlowも便利だよね
![Page 8: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/8.jpg)
OpenFlowじゃダメなの?• L2からビット単位でパケットを弄りたい
!• 独自のプロトコルが作れない !
• RFCに反した操作ができない
!
• でもOpenFlowも便利だよね
実用性 => OpenFlow 独自機能・学習用途 => 自作ルーター
![Page 9: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/9.jpg)
そろそろ作り方の解説
![Page 10: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/10.jpg)
作成する前に必要な確認• 主にC/C++で開発(別の言語でも出来るよ)
!• カーネルランドとユーザーランドを選択する必要有り !
• チェックサムオフロード機能があるか (ユーザーランドで作成する場合はオフにしないと
フックポイントの問題でチェックサムの確認で失敗する)
![Page 11: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/11.jpg)
カーネルランド? ユーザーランド?
![Page 12: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/12.jpg)
ざっくりとした説明
カーネルランド
ユーザランド (保護領域)
カーネルモジュール
ハードウェア
![Page 13: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/13.jpg)
ユーザーランドの特徴• 比較的ドキュメントが多い !
• デバッグが比較的容易 !
• 移植性の高いプログラムを作りやすい !
• フックポイントを選べない(自由度が低い)
![Page 14: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/14.jpg)
ユーザーランドプログラミングの良書
特徴:他書と比べてソースコードの割合が多い
![Page 15: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/15.jpg)
カーネルランドの特徴• ドキュメントはカーネルソース !
• コンパイル時にカーネルのソースが必要 !
• 処理優先度が高い(無限ループでフリーズ)
!
• NICがチェックサムを計算する前のパケットをフックすることができる
![Page 16: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/16.jpg)
カーネルランドプログラミングの参考資料
![Page 17: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/17.jpg)
今回はカーネルランドで作ってみる
![Page 18: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/18.jpg)
フックポインタの設定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](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/19.jpg)
フック関数の定義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](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/20.jpg)
カーネル定義の便利な型struct in6_addr { union { __u8 u6_addr8[16]; __be16 u6_addr16[8]; __be32 u6_addr32[4]; }in6_u; }; // IPアドレスがサブネットごとに取り出せる
![Page 21: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/21.jpg)
まとめ• 自作ルーターならオレオレプロトコルが作れる !
• ルーティングしつつパケットを好き放題に操作できる !
• パケットのフォーマットを覚えるきっかけになる !
• 自作ルーターは楽しい(´・_・`)
![Page 22: OSC hiroshima 2014](https://reader033.fdocument.pub/reader033/viewer/2022051610/54840221b4af9f870d8b4a77/html5/thumbnails/22.jpg)
ご静聴ありがとうございました@nemumupoyo