TremaDay #7 参加メモ

Trema Day #7 Presented by APC - connpass に参加してきました。せっかく声かけてもらってしゃべってみたのに、このままずるずると何も書かないまま流れてしまいそうなので、ムリヤリにでも書きます。自分の分しゃべった時点で割と気合いが抜けているのでメモは適当です…(いつもより怪しいです)

参照:

OpenFlow「で」覚えるネットワーク

はい。しゃべって参りました。

途中しゃべったようなしゃべってないような動機。

  • たとえば OpenFlow を作ったシステムとかツールとかを仕事で使ってみた、という話があったとしてですね。それを引き継いで継続開発してくれる人とか運用してくれる人とかを集めること自体が至難の業。
  • 入れたとしても継続的にメンテできないのでそもそも作って入れてみるってところに二の足を踏む、なんてことがあり得ますよね。
  • 探していないんだったら自前でどうにかして育成するしかない。
  • ネットワークもプログラミングもどっちにしろ両方考えないといけないんだから、「ネットワークがわからない」ことで間口を狭める必要性って特にないよね。どっちにしろ使うんだったらそれを使って学習できたらいいじゃない。

…という発想ですね。まあ試しに何かやってみるとしたらこうかなあ、という話です。

ちなみに、内容的には 3 Minutes Networking の影響を多分に受けています。あと [改訂新版] 自分のペースでゆったり学ぶ TCP/IP かな。私が見たのは改定前のやつだったはずだけど*1。細かい動作はおいといて、まずは全体的な考え方や感覚をつかもうぜ! という方向です。

ニューTrema 5つのポイント

tremaの新しいリリース, 0.5.xで入った機能の紹介

今までのTrema, 新しい Trema

  • インタフェース(使い勝手)は変わっていない。
  • 中身、インタフェースそのままで、新しい OpenFlow プロトコル対応とかがある。

#1, OF1.3.4対応しました。

  • 見た目は変わらないけど、1.3.4のメッセージが書けるようになっている。
  • trema run --openflow13 をつけると OF1.3.4をしゃべるようになる。
  • OF Message Library, Trema::PIO, OF1.3対応してる。
    • 1.3使うとマッチフィールドなどが増える。
    • インストラクションとかマルチテーブルとかも使えるようになる。
    • ドキュメント, github Trema::PIO
    • メッセージに関してはTremaから独立してPIOになった。

#2, Ruby

  • 旧TremaはほぼC言語で書いてあった。新しいTremaではRubyで書き直してある。
    • 見た目は変わらないけど中身はほぼRubyになった。
  • ユーザから見た違い
    • インストールが簡単になった。
    • いままでインストールするときにgccとか必要だったんだけど、それがいらなくなった。
    • 基本パッケージとしてOVSがあれば大丈夫。
  • インストールも早くなったし、コンパイルとかもなくなったのでインストール失敗とかがなくあんった
    • 古いTrema...デバッグしようとするとすぐC言語のところに突き当たる。
    • 新しいのは全部Ruby,通常のRuby開発ツールでパケットの中身とかTremaの仲間で追っかけてデバッグができる
  • Pryでデバッグ
    • packet-inでbreakしてpacket-inしたパケットの中身を見てあげるとかそういうのができる。
      • binding.pry 入れておくとそこでshellに落ちる
      • message class の持つメソッドを呼び出していろ気になったデータを追いかけることができる。
      • show source とかで指定したクラスのソースコードを見るとかができる

#3 コントローラ連携

  • 昔書いたコントローラとかを組み合わせて新しいコントローラにしたいとか、拡張して機能付け足したいとか。
    • Rubyのテクニックでできるようになってる

routing switch

  • topology discovery + routing
  • コントローラを組み合わせて作る
    • routing switch + path manager + topology
  • delegator を使う。このめっせーじはこの人に「委譲」しますよ。
    • ハンドラ内、どのメッセージをどのコントローラに渡すかを制御できる。
    • topology -> path manager は observer で。トポロジ変化が起きたら最短経路計算しなおす
  • クラス継承を使って書き直すこともできる
    • path manager 部分を sliceable switch に。特定 slice だけpath (path manager 機能を継承して作る)

#4 テストフレームワーク

  • OFプログラム、テスト書くのが面倒くさい。それを助けるヘルパー機能を追加
  • テスト
    • コントローラに対するインプット、アウトプット+期待するアウトプットとのチェック
    • というのをパターンごとシナリオを書く
  • hello trema のテスト
    • features replyを受け取ってdpidの出力、ログの出力
    • cucumberを使ったテスト

#5 ドキュメント

  • 今のTremaのドキュメント…cucumberのテストシナリオをそのままHTMLにして公開している。
  • APIドキュメント、テスト全部しているから整っているはず。
  • Trema...ドキュメントの充実: Trema本
    • いま新しいTremaに即した新しい本を書いてる。出る時期はまだいえないけど今すごく忙しい。
    • 十何章とかのドラフトはできあがってる。
    • もう少ししたらドラフト公開(github)。
  • 最初の本だしたときのコンセプト、編集曰く「女性のバッグに入る」

本のレビュー

  • Tremaのバグ報告
  • OF1.3のアプリ募集
  • 誤字脱字レベルの訂正でもよいので是非ご協力ください!

OVS拡張を援用して簡単なOpenFlow Programming(とPioの話)

PIO関連、OVS拡張…Nicira Extensionの話。それをTremaに入れる算段をつけてみよう。

PIO紹介

  • openflow13のflow_mod
  • pio::icmp
  • pip::udp
  • flood: 定数を与えてアクションオブジェクトを作る、みたいなものだったのもシンプルにかけるようになってる。
  • features reply 出入ってくる port の情報、32ビットマップ、整数で入ってた。のが扱いやすくなってる。

使いやすさ、わかりやすさ。

  • lldp,arpなんかも
  • OF1.3系実装

pioがtremaにはいったのは0.4.1〜2013年あたりから。

  • pio openflow 実装に変わったのが今年の6月くらいから
  • だんだんコアの部分に入っていってる。

フローテーブルのプログラム、どうするか
Nicira拡張

  • OVSベンダ拡張、NXAST_LEARNが有名

openflowのきついところ

  • 「コントローラに制御ロジック書くんだよね」「…(反応なし)」
  • もっとこのアプリを動かしたらこういうルールが入るんだよ、みたいなのを事前に定義できるようにしたい
    • 転送処理に関与しないものをもっと簡単に扱いたい
    • broadcast とかを例外的に扱うとか

packet-inは悪なのか?

  • 使わないといけないところもある

そのほかの例外

  • mac addr 学習, etc

アプリの作り込み、テーブルの作り込み、どういう道具があるか。

  • of13, 自由に使えるフィールドは metadata しかない。そこに情報を埋める、
    • REG_MOVE, copy fieldみたいなのができる
    • OUTPUT_REG, フローをまとめる・減らすとかで使える。結構便利
    • LEARNING, このアクションを指定した場合、オプションで指定したテーブルに対してmodify-strict flow modににたことを行う。割と強力なアクション。面倒なのは flow-mod-spec を指定する必要があるあたり。
    • resubmit, goto-tableみたいなものとか

extension 作るサンプル:
learning switch

  • packet-inしてOVSしていたものをOVS拡張でスイッチ内部で処理させる
    • learn/resubmit-table をつかうと packet-in をなくして learning swich 動作が作れる
  • isolated learning switch
    • learning → 入力ポートに応じて REG, VLAN IDみたいなのを入れる。次のテーブルへ
    • ブロードキャストするものはREG0かいてTable4、それ以外はTable3とか。
    • ポートのリストごとにアクションがあってあてる
    • learn/load/resubmit
  • simple router
    • next hop 見つからなかったときだけコントローラにあげる

便利だと思うので、Trema::PIOにいれませんか…。
今回はOF1.0でやりましたが1.3でもだいたい同じです。

QA

  • 使いどころ
    • サーバエッジ、ハイパーバイザ内仮想スイッチでやるものとして考えておくのがよいだろう。

いろいろなデバイスでOpenVNetを動かしてみようとした

Ras-piでTremaを動かしてみたという話を見て挑戦してみたいと思った。

Overlay(Edge overlay)

  • VMから出たパケットを細工して、目的のノードまでトンネリングして送る。
  • よくある例だと OFS+Agentとかで構成。AgentがVMのパケットをコントロール

OpenVNet

  • Neutron対応はしてない
  • マルチテナント、セキュリティグループ
  • hypervisor の横に trema-edge base のエージェントを置いて制御, MQとかで情報をやりとり

さて

最先端のデバイスをサーバにしようぜ

すごい!!

マウントやinsmodを妨害するあれこれが動いているのでその辺をつぶす脆弱性を突いてつぶす
空き領域が93MBしかない

  • もともと/dataが200MBしかない。
  • 別領域をマウントしてあれこれ
  • ビルド、OVS系コマンドも動く。
  • Trema,まずrubyが必要。openvnetが使うのでrvmがいる。すごく時間かかるけどなんとか動く。

wakame-edge(trema branch)を使う。

  • ARM, memory alighment ですぐコンパイル落ちるので頑張る。

デモ

  • adbで入ってルートを取る
  • cpuinfo みると ARM で動いてるのが見える
  • test してみると features reply 取得ができた
  • vethとか入れてみましょうか。
  • packet-in もとれてる
  • じゃopen vnet動かしましょうか
    • alignment関連のエラーでクラッシュする。

ポーティング難しいね

Dive into wireless openflow!

wireless openflow

  • 2008年のでも、初期の頃で、ゲームしながらローミングして行くみたいなデモをやってた。そんなに目新しいものでもない。

ところで。

  • openflowって便利ですよね。
  • 流れてるパケットが見える「私にも的が見える!」覚醒する感じ。

一方、無線はというと

  • つながらない、よくわからないけど不安定、なんか遅いんだけど。ごちゃごちゃみんなに文句言われる。

無線のパケット観測できるツール必要だよね

  • openflowがあるじゃない。
  • APに入って、無線のパケット見えるといいよね。

見えるようにしました。

  • of1.3 + experimentor拡張
    • stratosphere experimentor で仕様追加, pocやってみた。
      • 802.11, 6LoWPANにも対応

今日Ras-piが3台。同一SSIDでデプロイ

  • クライアントがどのAPの認証受けてどういうセッションがあるかが見えるようになってる。
  • 電波強度の情報もとれる
  • 複数のAPからステーションを観測するというのができる
    • 最適なAPがどれか、どっちにつながってるか
  • APがどれくらい混雑しているか

バイスの癖がいろいろ見える

  • windows, background scanしてく。移動してるのがすぐわかる。
  • mobile phone, すぐにスリープ杯って飛び飛びのデータしかとれない
  • iOS, 802.11kを期待した動作していて scan してこない

Internal

openflow 対応

  • 80211にどう対応させるか。今回はnetdev = openflow port ということに。
  • cfg80211系ドライバ

cfg80211 netdev

wifi controllerの進化の延長線

  • wifi controllerの流れもc-plane分離とかになりつつある
  • ベンダロックイン強いところなので、そこら辺がもっとオープンでやれるといいな
  • 802.11ネイティブフレーム直接受け取って、とかもできる。

おまけ

  • 6LoWPAN
  • bluetooth LEの上にipv6直接流れる
  • server, boarder router, server
  • boarder routerにopenflow入ってるとトラブルシュートとかの話もできるようになるので結構うれしい

Lagopusで遊ぶ(仮)

TremaDay #4, Tremaで試すFirewall

OF1.0でやってた。

  • bitmask表現、レンジを指定できない
  • L4 port どうするか?

Lagopusならなんとかしてくれる!

  • 今日のタイトル: Lagopusで試すFirewall

- OF1.3で。とりあえずルールを入れるってところまで。

Range表現どうするか。

  • TCAM: 0/1/Don't Care …Lagopusでも検索できるはず。

アルゴリズム

  • 2分探索な再帰検索でレンジをビットマスク表記にできる
  • range表記→ビットマスク表記に変えられる

TCP/UDPのポートどうしよう

  • OF1.3, Metadata, Multitable
  • src/dstをmetadataで
  • copy-firld (1.3extension, 1.5-)に対応していない
    • 書き下せばいいじゃない! 65535*2(tcp/udp) 書き込む
    • ルール数…大丈夫か? Lagopusならなんとかしてくれる!

実装

ルールの動的追加・削除ができる

  • priorityを考慮しないと死ぬ
  • ほかのアプリとの組み合わせ。テーブル設計で競合するのは注意
  • 早い? 試してません

デモ

  • 一回作ったんだけど、lagopus新しいのにしたらひこうをついてしまった
  • ルール生成して入れるところまで

QA

  • テストツールもつくる?
    • Ryu certの仕組みを使って作るのを考えてる。

近頃のDockerネットワーク

gobgp, docker, whitebox switch とかをやってたりします。

docker?

  • Linux container 技術を利用したアプリケーション基盤ソフトウェア
  • 最近ネットワーク周りに力を入れている。

6月, DockerCon, 結構ネットワーク周りの話でてる

linux container

  • ホストOSの上で、namespace で環境を区切って出す。オーバーヘッドが少ない
  • イメージが軽量。

docker本体、ネットワーク周りの話。

docker toolbox

  • ほとんどがまだVer1になってない。これから
  • libnetwork, RunC: 今日のメイン

libnetwork

  • container network model
  • endpoint(veth)をコンテナにつけたり外したり。

docker network

  • docker engine がネットワーク作る指示をlibnetworkに渡す→libnetwork driver→docekr0, nat設定を書き込む
  • libnetwork driver
    • 指定するドライバによって提供するネットワークを変えていく。
    • bridge driver: default, NATされるブリッジ
    • overlay driver: 最近できた。docker同士をvxlanでつなぐ

overlay driver

  • docker 1.8 experimental build で利用可能。
    • docker network コマンド
    • service
      • あるホストがどのエンドポイントを向くか
    • multi host
      • libkv(分散key value storeを通して情報交換(VNI情報とか), consul連携)

service と ipaddr が紐付いている。サービス指定してdockerたてるとIP引き継いで起動してくれる。

  • overlay driver, arp含むbroadcast全部落とす。linux kernel bridgeが全部落とす。


中身のあるdriver, bridge/overlay程度

  • 自分で作りたい!
  • dockercon hackerthon で vlan driver をつくってみた
    • ほとんどbridge driverだからbridge driver拡張にしよう

docker networkまとめ

  • libnetwork中心に発展
  • weave, remote driver として取り込まれる予定
  • ほかにどんなNWがあればよい?
    • 今ほとんどWebアプリでしか使われていないけどそれ以外のユースケースで使われる日が来るかなあ

コンテナのネットワーク → コンテナをネットワークに

whitebox switch

  • linux
  • アプリのデプロイをコンテナでやれると楽じゃない?

docker on cumulus linux

  • cumulus: debian7ベース。ハード4GBくらいしかない。ちょっと厳しい
  • すで使うといろいろ制約
    • RunC

RunC

  • open container proj に準拠したコンテナ管理ツール
  • libcontainer
  • スイッチ上で動くんじゃない?

runcでコンテナ動かす。docker imageが使える。

  • docker export で container image を tarball にする
  • rootfs ディレクトリを作って展開
  • spec file
  • runc動かす…おまじないが必要。メモリ関係のファイルが美味く生成されないので主導で書いてやると動く。
    • cumulus 上で動く
  • rootfs を別にものに書き換えてやればよい

制限は多いけど、スイッチ上でコンテナベースのアプリをデプロイするって言うのがやれそう

スイッチ上でアプリを動かすモチベーション

  • よく言われるのはNFV
  • 複数のNICつけるのはできる、片方はVXLAN,片方は別なドライバ、もできる。

サービスのattach/detouchとかもできる。が、バグがある。


すみません LT 系はほぼメモ取ってません。

おわりに

初心者向け基礎学習*2 から最近のツールとの関連、プロトコルやコントローラ実装、変態向けチャレンジまで、バラエティに富んだ形でいろんなネタが入って良かったんじゃないでしょうか。あんまり Trema そのものへのフォーカスしているわけじゃないけど、そんなに気にしないで、この辺の技術を実際に触っている・作っている人たちがしゃべる集まりってことでやっていけるといいんじゃないかと。

個人ベースでやってるとどうしても、特定のツール単品に寄りがちで「ネットワークとしての規模」というのが出しにくいので、そういう "サイズ" のあるユースケースとかで実際やってみたよって話がもうちょっと出てくると面白いかなあ、という気はしました。企業のやる取り組みとは別に、思い切って変態方向に走ってみるとか、個人でどこまでできるのかを追いかけてみるとか、そういうのがもっとやれるといいなあ。

あと hibi さんテストツール作ったら教えてください。というかあの発表資料がほしいです… 資料公開されました。ありがとう!

*1:手元にあったと思うんだけど本棚が魔窟化していて見当たらない

*2:初心者向け…といってやった割にはあまり会場に対象となる初心者的な人がいなかった感じだけどね…。