lagopus as open flow hybrid switch 実践編
TRANSCRIPT
Lagopus as OpenFlow Hybrid Switch 実践編
Sep 20, 2016Masaru OKI @masaru0714
前回までのあらすじ
● Hybrid SwitchはOpenFlowと既存のスイッチ/ルーティングとの組み合わせ
● tapインタフェースを作成しLinuxカーネルの機能と組み合わせる実装をしてみた
● 自前のスイッチング/ルーティングが実装されつつあり、近日公開(Dec 2015)
のあと、音沙汰がないまま半年以上がたちました……(すみません)
ので、近況をお知らせします!
summary: recent releases of Lagopus● 0.2.5 Apr 6, 2016
○ GTP-U tunnel support, some bug fixes
● 0.2.6 May 2, 2016○ performance improvement, but DPDK ixgbe vector enabled, much slow
● 0.2.7 May 18, 2016○ DPDK vector disabled again
● 0.2.8 July 12, 2016○ build and tests on Ubuntu 16.04LTS○ deprecated -p parameter
■ ignored if specified○ it works as L2 and/or L3 Hybrid switch
OpenFlow Hybrid Switch (おさらい)● L2スイッチあるいはL3ルーティングとOpenFlowスイッチの合体
● Lagopusでの現時点での実装は、外部から見てOpenFlowスイッチが前段にある
● OFPP_NORMALに向かってoutputすると、内蔵のL2/L3エンジンに処理が移る
● tapインタフェースが生えていて、Linuxのipコマンド等で操作できる○ IPアドレスを付けるなどすると netlink socketを使ってLagopusが情報を読み内蔵エンジンに反映
ビルド方法
./configure --enable-hybridmake
コンフィグの記述方法(conf形式) - L2bridgebridgeの定義に
l2-bridge true;mactable-ageing-time 300;mactable-max-entries 8192;
を加える。
DPDK使用時のみでなく、rawsocketでも動作する。
fail-mode standalone; を書いておくと、コントローラ未接続時L2bridge動作となる。
数字は例。いずれも省略可。ageing-timeの単位は秒max-entriesはエントリ数
デフォルト false
DSLでの記述(例)1行で記述する。長いので \ 折り返ししているが許してほしい。
bridge BR01 create …. \-l2-bridge true \-mactable-ageing-time 300 \-mactable-max-entires 8192
L3は?● hybridのlagopusを起動するとinterface設定の名前と同じtap i/fが生える。
● tap i/fにipコマンドなどでIPアドレスをつけると自動的にL3処理対象になる。○ bridgeごとにnamespaceがあるわけではなく、Lagopus全体で一つのL3
● routing daemonはtap i/fに向かってパケット送受信するよう設定。
● 外部とのインタフェースはDPDKあるいはrawsocket。
動かしてみよう(L2編)● rawsocketで試すのが簡単 (./configure --disable-dpdkつきでビルドしてください)● vethペアを作り、ip netnsで片方を分離させる
● というのを2本生やして、もう片方どうしをLagopus L2bridgeでつなぐ
● 両端に同一ネットワークのIPアドレスを付与し、pingする
NET1 NET2(default)
LagopusL2Bridgeveth0veth1 veth3veth2
172.21.0.1/24 172.21.0.2/24
vethの準備
sudo ip link add veth0 type veth peer name veth1sudo ip link add veth2 type veth peer name veth3sudo ip netns add NET1sudo ip netns add NET2sudo ip link set veth1 netns NET1sudo ip link set veth3 netns NET2sudo ip netns exec NET1 ip addr add 172.21.0.1/24 dev veth1sudo ip netns exec NET2 ip addr add 172.21.0.2/24 dev veth3sudo ip link set veth0 upsudo ip netns exec NET1 ip link set veth1 upsudo ip link set veth2 upsudo ip netns exec NET2 ip link set veth3 up
DSLの準備
l2bridge.dsl
interface if0 create -type ethernet-rawsock -device veth0interface if2 create -type ethernet-rawsock -device veth2port p1 create -interface if0port p2 create -interface if2bridge br01 create -l2-bridge true -port p1 1 -port p2 2 -fail-mode standalonebridge br01 enable
pingしてみる
sudo lagopus -d -C ./l2bridge.dsl
一方他の端末で
sudo ip netns exec NET1 ping 172.21.0.2PING 172.21.0.2 (172.21.0.2) 56(84) bytes of data.64 bytes from 172.21.0.2: icmp_seq=166 ttl=64 time=1.79 ms64 bytes from 172.21.0.2: icmp_seq=167 ttl=64 time=0.886 ms64 bytes from 172.21.0.2: icmp_seq=168 ttl=64 time=0.878 ms64 bytes from 172.21.0.2: icmp_seq=169 ttl=64 time=0.888 ms64 bytes from 172.21.0.2: icmp_seq=170 ttl=64 time=1.06 ms64 bytes from 172.21.0.2: icmp_seq=171 ttl=64 time=0.885 ms64 bytes from 172.21.0.2: icmp_seq=172 ttl=64 time=0.921 ms
OK!
動かしてみよう(L3編)● rawsocketで試すのが簡単 (./configure --disable-dpdkつきでビルドしてください)● veth0-veth1とveth2-veth3の2つのネットワークを作る。
● NET1のdefault routeを10.0.0.2、NET2のdefault routeを10.1.1.1に設定する。
● NET1からping 10.1.1.2する。
NET1 NET2(default)
LagopusL3Engineveth0veth1 veth3veth2
10.0.0.1/24 10.1.1.2/2410.0.0.2/24 10.1.1.1/24
vethの準備(まっさらな前提で)sudo ip link add veth0 type veth peer name veth1sudo ip link add veth2 type veth peer name veth3sudo ip netns add NET1sudo ip netns add NET2sudo ip link set veth1 netns NET1sudo ip link set veth3 netns NET2sudo ip netns exec NET1 ip addr add 10.0.0.1/24 dev veth1sudo ip netns exec NET2 ip addr add 10.1.1..2/24 dev veth3sudo ip link set veth0 upsudo ip netns exec NET1 ip link set veth1 upsudo ip link set veth2 upsudo ip netns exec NET2 ip link set veth3 upsudo ip netns exec NET1 route add default gw 10.0.0.2sudo ip netns exec NET2 route add default gw 10.1.1.1
lagopusを起動してからIPアドレス付与
sudo lagopus -d -C ./l2bridge.dsl
一方別の端末から
sudo ip addr add 10.0.0.2/24 dev veth0sudo ip addr add 10.1.1.1/24 dev veth2sudo ip netns exec NET1 ping 10.1.1.2PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.64 bytes from 10.1.1.2: icmp_seq=1 ttl=63 time=0.117 ms64 bytes from 10.1.1.2: icmp_seq=1 ttl=63 time=1.59 ms (DUP!)64 bytes from 10.1.1.2: icmp_seq=2 ttl=63 time=0.020 ms64 bytes from 10.1.1.2: icmp_seq=2 ttl=63 time=0.673 ms (DUP!)64 bytes from 10.1.1.2: icmp_seq=3 ttl=63 time=0.024 ms64 bytes from 10.1.1.2: icmp_seq=3 ttl=63 time=0.690 ms (DUP!)
あれ?
設定対象の誤りでした。
● veth0やveth2にIPアドレスを振ってはいけない。
● LagopusとLinuxのネットワークスタックが同時に動いていた。
● veth0→if0、veth2→if2に訂正して、再度試す。
$ sudo ip netns exec NET1 ping 10.1.1.2PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.64 bytes from 10.1.1.2: icmp_seq=1 ttl=63 time=1.43 ms64 bytes from 10.1.1.2: icmp_seq=2 ttl=63 time=0.957 ms64 bytes from 10.1.1.2: icmp_seq=3 ttl=63 time=1.73 ms64 bytes from 10.1.1.2: icmp_seq=4 ttl=63 time=1.02 ms64 bytes from 10.1.1.2: icmp_seq=5 ttl=63 time=1.41 ms
OK!
tapにIPアドレスつけるって解説しておいてこれでしたorz
動かしてみよう(L3編)正しい図はこちら
● veth0やveth2は、DPDK PMDで動かしているときには、見えない。
● 1:1で対応するtapインタフェースがLagopus起動時に作成される。
● confやDSLに書かれたinterfaceの名前がそれ。
● tapインタフェースに対してIPアドレスを付与する。
NET1 NET2(default)
LagopusL3Engineveth0veth1 veth3veth2
10.0.0.1/24 10.1.1.2/24
10.0.0.2/24 10.1.1.1/24
if0 if2
最後に、バグのお知らせorz● (./configure --disable-dpdkつきでビルドしてください)● DPDKありでビルドして試すと、rawsocket only modeで動くはずである。
● rawsocket only modeとは○ DPDKありでビルドして rawsocketしか使わない起動コマンドラインで Lagopusを起動する
○ すると、DPDKの機能を使わず、 --disable-dpdkでビルドしたのと同じように動作する
● のはずが、なぜか0.2.8ではDPDK前提のコードに突入して、落ちました。orz● 調査して修正しますので、しばらくお待ちください……