ゼロから作ったソフトウェアルータ

CURONOS

学習駆動コース 柚山大哉

世界最速を目指そう!

機能CURONOSはゼロから開発したソフトウェアルータです. ゼロからというのは, ブートローダなどOSにかかわる部分から全て作っているということです. 自作OSにネットワークの機能が載っていると考えてもらえるとわかりやすいかもしれません. CURONOSは普通のコンピュータ(x86_64のCPUを搭載したもの)上やクラウド上でOSとして動作しますが, 既存のOSをベースとしません. 世の中にあるソフト
ウェアルータはたいてい, LinuxやBSDをベースに作られており, 一つぐらいOSからまるごと開発されたソフトウェアルータがあっても良いのではないか,すべて作ってすべて理解できたら大変面白いのではないかと考え, 開発を始めました. CURONOSはOSから全部開発しているので, 当然世界最速のルータになる潜在性があるのです.

ネットワークシステム• シリアルコンソール• マルチコアサポート• ハードウェアドライバ• IP• Intel Gigabit Ethernet driver (e1000e)• Intel 10GbE driver (ixgbe)• Virtio net driver•••••

多くのコマンド
スタートアップConfig
アプリケーションサポート(予定)その他多くの機能
自動テスト

••
••

フラグメンテーション
ルーティングテーブル
フォワーディング
ブロードキャスト• ICMP• Echo Reply (receive ping)• Destination Unreachable• Time exceeded• UDP/TCP• Socket API• TCP Active Connect

CURONOSの特徴
アーキテクチャ

高い堅牢性

JITパケットフィルタ
通信をフィルタする機械語を生成

IPフォワーディングIP

ip filter 192.0.2.0/24
ip filter 133.27.0.0/16
ip filter jit flash

Ethernet
Network Card Driver
Network Card

コマンド入力Network Card

Translate

1CPUコンテクストで通信の受信からそのパケットの再送出までを行う. 受信処理は割り込みまたはPollingで行うことができる. バッファリングを行わないため, 低遅延な通信を実現しています.

...
B9 00 00 00 00
FF C189 C281 E2 00 FF FF FF
81 FA 00 02 80 C074 17
FF C189 C281 E2 00 00 FF FF
81 FA 85 1B 00 0074 05
B9 00 00 00 00
89 C8...

; mov ecx, 0; inc ecx; mov edx, eax; and eax, $00ffffff; cmp eax, $000280c0; je 0x17; inc ecx; mov edx, eax; and eax, $0000ffff; cmp edx, $0x851b0000; je $0x05; mov ecx, 0; mov eax, ecx

CURONOSはOSからすべて開発しているため, 大変細かな問題に注意して開発しなければ突然停止するなどの問題を引き起こす恐れがあります. そのため, 問題にいち早く気付く必要があり, そのための工夫を行っています.

ファジングによる通信試験
オープンソースなファジングツールであるISIC(IP Stack IntegrityChecker)を利用し, 開発しているプロトコルスタックがシステムに問題を引き起こすことがないかを検証しています. この試験によって, 受信に一度エラーが発生した場合, ネットワークインターフェースの受信処理が停止する問題を発見できました.

生成された機械語

分散処理

CPU#1

Network Card

Network Card

CPU#2

CPU#3

受信バッファ

送信バッファ

マルチコアでの複数の送信/受信キューの使用もサポートしており, 40GbEやそれ以上に高速な通信行う準備が整っています.

ツールが生成する多様な通信

IPフィルタリングを行う機械語をルータ起動後にも動的に生成できる機能を備え, コマンドを通してドライバ内にフィルタリングコードを配置できます. ドライバ内でドロップすることで,無駄な処理を上位レイヤに送ることを防ぐことができます. さらに, フィルタの何番目のエントリに引っかかったかを記録しているため, それをもとにエントリの順番を入れ替えるなどの拡張ができます. このような設定を機械語に変換して動作させるアプローチはパケットフィルタ以外の分野でも使用できるのではないかと考えています.

メモリ使用の記録
デバッグビルド時にはメモリのアロケーションをハッシュテーブルに記録し, 開放する際に削除する機構を実装. BGPなどで大量の経路情報の登録と取り消しを扱う際に, メモリの開放に不備があると大きな問題を引き起こします. この機構によって実際にIP経路テーブルにメモリの二重開放の開放の問題があることを発見できました.
[06:36:48][CPU0/WARNING] Debug memory map index 38912 is already 0, 0x1f29390 double free?
[06:36:48][CPU0/TRACE] Free address 0x1f29350[06:36:48][CPU0/WARNING] Debug memory map index 79872 is already 0, 0x1f29350 double free?
[06:36:48][CPU0/TRACE] Free address 0x1f29310[06:36:48][CPU0/WARNING] Debug memory map index 120832 is already 0, 0x1f29310 double free?

テーブルに記録されていないアドレスを解放した際の警告

現実世界・インターネットでの運用実験
ルータとはデータを2つ以上のネットワーク間に中継する機器であるので, ルータの機能を実験するにはどこかにネットワークを用意する必要があります. ローカルでの実験
では面白さが足りないので, 大学よりグローバルアドレスのサブネットを借用し, インターネットにてグローバル通信の実験を行いました.
大学内のデータセンタにあるVMware ESXi上に仮想マシンとしてCURONOSを仮想マシンとして動作させ, 借用したサブネットのゲートウェイとして稼働させました. CURONOSの配下に2台のホストを配置し, WebのやICMPの通信を実験しました.
My traceroute

The Internet

133.27.3.1[v0.93]133.27.16.34
Keys:Help

Display modeRestart statistics

Host
1. ve-302.ncs1.sfc.wide.ad.jp
2. 203.178.140.162
3. 203.178.140.164
4. fw1-sfc-wide-boundary-v4.sfc.keio.ac.jp
5. gw2-core-v4.sfc.keio.ac.jp
6. gw-d-trust.sfc.keio.ac.jp
7. curonos.d-trust.sfc.keio.ac.jp
8. c-host0.d-trust.sfc.keio.ac.jp

Order of fields
Packets
Loss%
Snt
Last
0.0%
20
1.1
0.0%
20
0.4
0.0%
20
0.5
0.0%
20
0.7
0.0%
20
0.8
0.0%
20
0.7
0.0%
20
1.0
0.0%
20
1.3

quit
Pings
Avg Best1.10.9
0.3
0.2
0.6
0.3
1.9
0.3
4.9
0.5
0.7
0.5
0.9
0.7
1.2
1.0

Wrst StDev
1.3
0.1
0.5
0.1
1.0
0.1
25.8
5.6
31.9
8.9
0.9
0.1
1.3
0.1
1.6
0.1

curonos(133.27.179.68)

インターネットからのCURONOSネットワーク内ホストの観測

その結果, 連続200時間以上, 総計500時間以上の稼働を記録し, 多くの方にCURONOSをc-host0(133.27.179.82)
利用した通信を体験して楽しんでもらえました.

c-web(133.27.179.84)

謝辞
CURONOSが動作しているサーバ

2022/3/4

本作品の開発で, SecHack365の皆様, 慶應義塾大学 環境情報学部 村井純合同研究室, WIDEプロジェクトの多くの方々に大変お世話になりました.ここにお礼申し上げます. ありがとうございました.

本作品に関する連絡先
daiya@sfc.wide.ad.jp

More information > https://web.sfc.wide.ad.jp/~daiya/curonos
CURONOSを動かす場所を大募集中!!

1