以下の問題は完答することが通過条件ではありません.いかに応募者のみなさんが 技術に興味があるか, 手を動かしているか. (もしくは手を動かしてくれそうか)を 判断する基準で見させていただきます. また演習課題は難易度を高く設定しているため 基本的に完答できないくらいを目安に作問しています. みなさんがどれだけ この問題に挑戦し, 熱意を持って手を動かしてくれるかを測っています.
以下から自由に課題を選択して答えてください.全てをまんべんなく解いてもよく, もちろん一つだけをものすごく深掘りして取り組むのでも構いません. しかし基本的に調査課題は取り組んでいただきたいです.
ネットワークや, パケットに関するプログラミングの経験がある場合(入門中も可), どのようなものを作ったのか(作っているか, 作りたいか) 説明してください. また, 本ゼミのテーマである「モジューラブルなソフトウェアルータの開発」 に関わる作りたいソフトウェアやそれに対するロマン,必要性等を説明してください.
インターネット上ではたくさんの計算インスタンスがネットワークに接続しています. ここでの計算インスタンスとはVMや物理サーバ, コンテナ等を示します. これらはIPを利用して相互に接続されていますが, 特定のインスタンスに対する経路 を全て静的に設定するのではなく, いくつかの動的ルーティングプロトコルやSDN コントローラを利用して経路設定をソフトウェアによって行なっています. ルーティングプロトコルやSDNコントローラについて調べてあなたの知識を説明 してください. どのようなルーティングプロトコルやSDNコントローラがあるのか. それぞれどのような特徴があるのか, メリット/デメリット等の考察があるとさらに 良いと思います.
講義概要にも記述されている通り, Linux等でパケット転送を行うには いくつか手段があります. DPDKやXDP等を利用するケースや, AP-PACKET等を 利用するケースなど様々ですが, それらにどのような違いがあるかを説明してください. 性能や機能等の何かに集中して, 利点欠点等を考察できていると良いです. またもしどれか一つでも使ったことがあればその所感や難しさがあれば 説明してください.
本ゼミを受講するにあたり, 特に興味ある分野等があれば記述してください. ざっくばらんにあなたの興味範囲とかを書いてもらえるとありがたいです! 選考を通過したあとには, 具体的に何をやっていくかを再度議論するので その時の材料になります. 以下に簡単な例を示します.
- この技術で高い能力を身に付けたい. とか
- この技術を講師(城倉/slankdev)にみっちり教えて欲しい. とか
ちなみに僕はパケット転送プログラミング. ネットワーク仮想化. BGP等のルーティングプロトコルの実装, SRv6等の新しいフォワーディング方式等が 特に好きで仕事でも取り扱っています.
LinuxにはNetwork Namespace (netns)というネットワークスタックを仮想的に 複数生成する機能があります.コンテナ型の仮想化技術の多くはそれぞれの コンテナに対して一つのnetnsを作成し, それらをVethで接続してコンテナを 外部ネットワークに接続させています. ここでは三つのnetnsを作成し, 添付の図のように接続して ns1からns3に対して通信を 行うような仮想ネットワークを構築し, その方法を説明してください. 利用するアドレス対に関しては図中のものを利用してください.
{図がここにはいる}
環境構築に利用するOSはLinuxであればおそらくなんでも構いませんが, Network Namespaceの機能に制限がかかっている可能性があるため, Ubuntu18.04か,Centos 7を推奨とします.
もし余裕があればSRv6やTC等を利用して, 独自のパケット制御をするような環境を 構築し, その方法を説明してください. SRv6を利用する場合はkernel 4.18以上を 利用することが推奨です.
添付の icmp_data.pcap
というpcapファイルにはある画像が隠されています.
これらのパケットには, 基本的なICMPのパケットが記録されているように見えますが,
実はICMPヘッダの後ろのデータ部分を全て繋げるとある画像が復元できます.
実際にコードを書いてその画像を復元してください.
プログラムの実装は原則どの言語を利用しても構いませんが, C/C++, Golang, Rust等のシステムソフトウェア開発に利用される言語がおすすめです. 画像ファイルを復元することがタスク的にはゴールですが, 以下のような マイルストーンがあると思います.
- pcapをwireshark等のprotocol analyzerで開いてデータを確認する.
- pcapから一つ一つのパケットを好きなプログラミング言語で読み取る.
- パケットのヘッダを解析し, どのような通信かをプログラムで解析する.
- ICMPパケットのデータ部分をそれぞれ連結し, 画像を復元する.
もし余裕があれば,特定の「フレームワークを利用することを禁止する」等の 特別ルールを加えてこの課題を突破してみてください. 例えば「libpcapは使ってはいけない」等です.
(Special Thanks, 策問者: Takaaki Hoyo)