Mininet on OpenBSD Using rdomains for Interactive SDN Testing and - - PowerPoint PPT Presentation

mininet on openbsd
SMART_READER_LITE
LIVE PREVIEW

Mininet on OpenBSD Using rdomains for Interactive SDN Testing and - - PowerPoint PPT Presentation

Mininet on OpenBSD Using rdomains for Interactive SDN Testing and Development Ayaka Koshibe akoshibe@openbsd.org AsiaBSDCon 2018 SDN? Network split into programmable nodes that handle traffic and entities that program them


slide-1
SLIDE 1

Mininet on OpenBSD

Using rdomains for Interactive SDN Testing and Development Ayaka Koshibe

akoshibe@openbsd.org

AsiaBSDCon 2018

slide-2
SLIDE 2

”SDN”?

◮ Network split into programmable nodes that handle traffic and

entities that program them applications northbound API control plane controller(s) control channel datapath(s) data plane

slide-3
SLIDE 3

OpenFlow

A control channel protocol standardized by the ONF

◮ datapath follows flow rules installed on one or more flow tables

◮ flow/match: traffic class defined by packet header pattern ◮ action: output to port/group, rewrite field, search another table...

◮ controller discovers datapath features from initial handshake, state

from requests

slide-4
SLIDE 4

OpenBSD and SDN

OpenBSD has its own OpenFlow 1.3 SDN stack since 6.1

◮ switch(4): datapath

◮ switchN has /dev/switchN as its control channel

◮ switchd(8): controller

◮ implements flow forwarding logic ◮ can forward control messages to other controllers

◮ switchctl(8): control application for switchd(8)

slide-5
SLIDE 5

Scenario

You are an SDN developer. How do you test your work?

◮ hardware testbeds? ◮ personal dev environment?

slide-6
SLIDE 6

Mininet

An ’Emulator for rapid prototyping of Software Defined Networks’

◮ mn command to launch networks and run tests ◮ a set of APIs for scripting topologies and test scenarios ◮ CLI for topologies ◮ topology creation GUI (MiniEdit)

slide-7
SLIDE 7

Basic Usage: mn command

Quick testing with built-in tests (ping, iperf)

◮ ping among hosts across a chain of three switches: # mn − −topo=l i n e a r ,3 − −t e s t=p i n g a l l ∗∗∗ C r e a t i n g network ∗∗∗ Adding c o n t r o l l e r ( . . . s t a r t u p

  • utput )

∗∗∗ Ping : t e s t i n g ping r e a c h a b i l i t y h1 − > h2 h3 h2 − > h1 h3 h3 − > h1 h2 ∗∗∗ R e s u l t s : 0% dropped (6/6 r e c e i v e d ) ( . . . teardown

  • utput )

completed i n 0.383 seconds

slide-8
SLIDE 8

Basic Usage: CLI

Launch a CLI to manipulate topology

◮ break links, run commands in nodes... # mn − −topo=l i n e a r ,3 − −v e r b o s i t y=output mininet> l i n k s1 s2 down mininet> p i n g a l l ∗∗∗ Ping : t e s t i n g ping r e a c h a b i l i t y h1 − > X X h2 − > X h3 h3 − > X h2 ∗∗∗ R e s u l t s : 66% dropped (2/6 r e c e i v e d ) mininet> l i n k s1 s2 up mininet> mininet> h1 ping −c 1 h2 PING 1 0 . 0 . 0 . 2 ( 1 0 . 0 . 0 . 2 ) 56(84) bytes

  • f

data . 64 bytes from 1 0 . 0 . 0 . 2 : icmp seq=1 t t l =64 time =3.97 ms − − − 1 0 . 0 . 0 . 2 ping s t a t i s t i c s − − − 1 packets transmitted , 1 r e c e i v e d , 0% packet l o s s , time 0ms r t t min/avg/max/mdev = 3.976/3.976/3.976/0.000 ms mininet>

slide-9
SLIDE 9

Basic Usage: Python API

Create a custom topology:

$ cat t e s t . py #!/ usr / bin / env python # example u s in g ” high−l e v e l ” API from mininet . topo import Topo from mininet . net import Mininet from mininet . c l i import CLI c l a s s MinimalTopo ( Topo ) : def b u i l d ( s e l f ) : h1 = s e l f . addHost ( ’ h1 ’ ) h2 = s e l f . addHost ( ’ h2 ’ ) s1 = s e l f . addSwitch ( ’ s1 ’ ) s e l f . addLink ( h1 , s1 ) s e l f . addLink ( h2 , s1 ) net = Mininet ( topo=MinimalTopo ( ) ) net . s t a r t () CLI ( net ) net . stop ( ) # . / t e s t . py mininet> nodes a v a i l a b l e nodes are : c0 h1 h2 s1 mininet> l i n k s h1−eth0< − >s1−eth1 (OK OK) h2−eth0< − >s1−eth2 (OK OK) mininet>

slide-10
SLIDE 10

Basic Usage: Python API

Run commands for experiments:

◮ cmd(): run commands on a node ◮ quietRun(): run commands against the network # b u i l d network

  • f

two h o s t s : h1− −h2 (” mid−l e v e l ” API example ) net = Mininet ( ) h1 = net . addHost ( ’ h1 ’ ) h2 = net . addHost ( ’ h2 ’ ) net . addLink ( h1 , h2 ) net . s t a r t () # s t a r t s im ple s e r v e r i n h2 and f e t c h page from h1 h2 . cmd ( ’ python − m SimpleHTTPServer 80 & ’) s l e e p (2) p r i n t ( h1 . cmd ( ’ c u r l ’ , h2 . IP ( ) ) ) # p r i n t i n t e r f a c e s

  • n

the host and e x i t p r i n t ( quietRun ( ’ i p l i n k ’ ) ) net . stop ( )

slide-11
SLIDE 11

Development Workflow

I have a... controller/application:

◮ use a topology pointed at a running instance

◮ mn --controller=remote,ip=x.x.x.x,port=y ◮ net.addController(controller=RemoteController)

◮ add a custom controller node (--controller=myctl)

switch:

◮ add a custom vswitch node (--switch=myswitch) ◮ use a topology with a physical port wired to a switch

slide-12
SLIDE 12

Internals: Mininet objects

◮ Mininet : coordinates the emulation process ◮ Topo : graph of nodes, ports(intfs), and links

◮ Node : bash running interactively in network namespace ◮ Intf : virtual ethernet (veth) interfaces ◮ Link : pairs of Intfs created/configured with iproute2

◮ Switch : nodes running vswitches

◮ OpenvSwitch(default), ofsoftswitch13, Linux bridge...

◮ Controller : nodes running controller applications

◮ Stanford reference controller(default), Ryu, Nox...

slide-13
SLIDE 13

Internals: Topology creation

∗∗∗ C r e a t i n g network ∗∗∗ Adding c o n t r o l l e r ∗∗∗ Adding h o s t s : ∗∗∗ Adding s w i t c h e s : mnexec bash − −norc −i s ’ mininet : c0 ’ ( r e p e a t f o r h1 , h2 , s1 ) ∗∗∗ Adding l i n k s : i p l i n k add name s1−eth1 type veth peer name h1−eth0 i p l i n k s e t s1−eth1 netns <s1> i p l i n k s e t h1−eth0 netns <h1> i f c o n f i g s1−eth1 up i f c o n f i g h1−eth0 up ( r e p e a t f o r s1−eth2 < − > h2−eth0 ) ∗∗∗ C o n f i g u r i n g h o s t s i f c o n f i g h1−eth0 1 0 . 0 . 0 . 1 / 8 up ( r e p e a t f o r h2−eth0 at 1 0 . 0 . 0 . 2 ) ∗∗∗ S t a r t i n g c o n t r o l l e r ( i n c0 ) c o n t r o l l e r −v ptcp :6653 1>/tmp/c0 . log 2>/tmp/c0 . log & ∗∗∗ S t a r t i n g 1 s w i t c h e s ( i n s1 )

  • vs−v s c t l

c r e a t e C o n t r o l l e r t a r g e t=”tcp : 1 2 7 . 0 . 0 . 1 : 6 6 5 3 ” . . . ∗∗∗ S t a r t i n g CLI : mininet>

slide-14
SLIDE 14

Initial goals

◮ recreate core features (”base” Mininet)

◮ topology emulation, CLI, remote controller ◮ switchd(8) and switch(4) incorporated as nodes

◮ aim to eventually get it upstreamed

◮ preserve Linux support (for github fork)

slide-15
SLIDE 15

Minimum requirements

◮ network virtualization (separate address space), L2 and up ◮ vswitches and controllers for nodes ◮ applications for baseline tests

slide-16
SLIDE 16

rdomain(4) and pair(4)

◮ a routing domain

◮ provides separate network address spaces ◮ recieves traffic via interfaces attached to them ◮ can restrict a process and descendants to its address space

◮ a pair(4) interface

◮ pairs with another to form endpoints of a virtual Ethernet link ◮ can be attached to an rdomain

slide-17
SLIDE 17

Implementation: Mininet objects

◮ Node: ksh running in a routing domain ◮ Switch: node dedicated to a switch(4) instance

◮ switchd in forwarding mode for RemoteController case

◮ Controller: node running switchd(8)

◮ uses Mininet-specific switchd.conf(5)

◮ Link: two patched pair(4)s

slide-18
SLIDE 18

Implementation: A comparison

Linux OpenBSD Hosts bash ksh setns(mnexec) route Links veth pair iproute2(ip link) ifconfig Switches OVS switch

  • vs-vsctl/ovs-ofctl

switchctl, ifconfig Controllers controller switchd + switchctl Bridges Linux bridge bridge brctl ifconfig

slide-19
SLIDE 19

Topology creation revisited

∗∗∗ C r e a t i n g network ∗∗∗ Adding c o n t r o l l e r ∗∗∗ Adding h o s t s : ∗∗∗ Adding s w i t c h e s : route −T <rdomain> exec / bin / ksh −i s ’ mininet : c0 ’ ( r e p e a t f o r h1 , h2 , s1 ) ∗∗∗ Adding l i n k s : i f c o n f i g p a i r 1 c r e a t e rdomain <s1> up i f c o n f i g p a i r 2 c r e a t e rdomain <h1> patch p a i r 1 up i f c o n f i g p a i r 1 d e s c r i p t i o n ’ s1−eth1 ’ i f c o n f i g p a i r 2 d e s c r i p t i o n ’ h1−eth0 ’ ( r e p e a t f o r p a i r 3 /s1−eth2 < − > p a i r 4 /h2−eth0 ) ∗∗∗ C o n f i g u r i n g h o s t s i f c o n f i g p a i r 2 1 0 . 0 . 0 . 1 / 8 up ( r e p e a t f o r p a i r 4 at 1 0 . 0 . 0 . 2 ) ∗∗∗ S t a r t i n g c o n t r o l l e r switchd −f / etc / switchd . mininet . conf −D c t l i p =127.0.0.1 −D port =6653 ∗∗∗ S t a r t i n g 1 s w i t c h e s i f c o n f i g switch0 c r e a t e d e s c r i p t i o n ’ s1 ’ up i f c o n f i g switch0 add p a i r 1 add p a i r 3 s w i t c h c t l connect / dev / switch0 ∗∗∗ S t a r t i n g CLI : mininet>

slide-20
SLIDE 20

Implementation: Multiple platform support

Nodes and Intfs per OS - ”API” for OS-specific commands

◮ BaseNode

◮ getShell : start host shell for a node ◮ popen : run commands tied to a node

◮ BaseIntf

◮ makeIntfPair : create virtual link endpoints ◮ moveIntfPair : attach endpoints to nodes ◮ rename : rename interfaces for book-keeping in topology

slide-21
SLIDE 21

Implementation: Multiple platform support

Mid/high-level APIs largely untouched

◮ CLI, topology construction (Topo, Mininet) kept as-is ◮ mn untouched other than addition of new node types $ doas . / t e s t . py mininet> nodes a v a i l a b l e nodes are : c0 h1 h2 s1 mininet> l i n k s h1−eth0< − >s1−eth1 (OK OK) h2−eth0< − >s1−eth2 (OK OK) mininet> mininet> dump <Host h1 : h1−eth0 : 1 0 . 0 . 0 . 1 pid =79277> <Host h2 : h2−eth0 : 1 0 . 0 . 0 . 2 pid =58592> <I f S w i t c h s1 : lo0 : 1 2 7 . 0 . 0 . 1 , s1−eth1 : None , s1−eth2 : None pid =56473> <Switchd c0 : 1 2 7 . 0 . 0 . 1 : 6 6 5 3 pid =92044> mininet>

slide-22
SLIDE 22

Implementation: Some weirdness

◮ the ksh prompt for root and cmd() ◮ visibility assumptions of a ’namespace’ ◮ renaming interfaces ◮ topology startup order

slide-23
SLIDE 23

Current status

Core features are done (barring bugs) A longer list of to-dos...

◮ untested/unported:

◮ MiniEdit ◮ resource-limited links and nodes (cgroups, tc, iptables) ◮ tons of example scripts ◮ other controllers/vswitches?

◮ don’t always run as root ◮ upstreaming...

slide-24
SLIDE 24

Availability

◮ net/mininet, available since Aug 2017 ◮ github fork (also with FreeBSD, Linux support):

https://github.com/akoshibe/mininet

slide-25
SLIDE 25

Acknowlegements

Special thanks to:

◮ Bob Lantz, Mininet developer

for insight into Mininet and interest in having it ported,

◮ Reyk Fl¨

  • ter (reyk@)

for introductions to switch and switchd and pointers to rdomains,

◮ Kazuya Goda (goda@)

for insight into switchd’s forwarding features,

◮ Peter Hessler (phessler@)

for the crash course on port creation, mentorship, and suggesting this paper topic.

slide-26
SLIDE 26

Questions?