SDN Tutorial

Intro

SDN을 실제 구현하는 것은 굉장히 어려운 일이다. 따라서, Mininet을 활용하여 가상의 Topology를 통해서 먼저 테스팅을 한 후에 실제로 적용하는 것이 일반적이라고 할 수 있다.

따라서, 해당 Posting에서는 Mininet, OpenFlow, Open VSwitch, ONOS를 이용하여 간단한 Tutorial을 수행해볼 것이다. 이 Posting을 통해서 남기고자 하는 것은 SDN을 테스팅하는 절차를 익히는 것이다.

0. Tools

먼저 작성자의 실행환경은 MAC OS X로 대부분의 설정은 모두 동일하지만 XTerminal은 Window/MAC이 다르기 때문에 Window 전용을 설치해야 한다.

  • Host Machine
    • Virtual Box : 🔗 Download 🔗 공식사이트
      • VM을 실행시키기 위한 도구, OpenSource이며 무료이기 때문에 많이 사용된다.(v6.1)
    • Vagrant : 🔗 Download 🔗 공식사이트
      • Virtual Environment 구축을 자동화하는 도구(v2.2.19)
    • XQuartz : 🔗 Download 🔗 공식사이트
      • XTerminal 시스템으로 원격으로 Graphic 시스템을 호스팅하는 도구이다. 즉, ssh로 접속한 시스템에서 추가적으로 terminal을 생성하거나 GUI를 요구하는 application을 실행시킬 때 이를 host machine에서 실행할 수 있도록 돕는다.(v2.8.1)
  • Virtual Machine
    • Mininet : 🔗 Download 🔗 공식사이트
      • Network Topology를 가상으로 구성할 뿐만 아니라 추가적인 configuration / testing이 가능한 Virtual Environment Emulator(v2.3.0)
    • OpenVSwitch : 🔗 Download 🔗 공식사이트
      • Virtual Switch를 실행시킬 수 있는 tool이다. 이를 통해서, Virtual Machine 내부에서 Virtual Switch를 가동시킬 수 있다.OpenFlow Protocol에 기반한 다양한 API를 내재하고 있기 때문에 이를 통해서 Virtual Switch의 Configuration 등과 같은 작업을 수행할 수도 있다.(v2.9.8)
    • ONOS : 🔗 Download 🔗 공식사이트
      • Open Network Operation System으로 SDN의 Controller 역할을 수행할 수 있다. 뿐만 아니라 WEB Interface도 제공하며, 다양한 API를 추가적으로 제공하기 때문에 유용하다.(v2.5.7)

1. Setup

위에 제시한 Tool을 모두 Virtual Machine 내부에 설치해야하지만, 자동으로 해당 tool을 설치하는 Vagrantfile을 만들어놓았기 때문에 사용해도 좋을 것이다. 해당 VagrantFile로 build하면 시간이 굉장히 소요될 수 있다. (인터넷 상태에 따라 천차만별이지만, 대략 20분?)

1$ git clone https://github.com/euidong/virtual-sdn-boilerplate 2$ cd virtual-sdn-boilerplate 3$ vagrant up 4# 접속 5$ vagrant ssh

Run ONOS

1# In Virtual Machine 2$ cd $ONOS_ROOT 3$ bazel run onos-local

2. Scenario를 작성

우선 어떤 상황을 emulation할 것인지에 대한 구체적인 계획이 필요하다. 따라서, 이를 먼저 구상해보자. 아래 예시는 단순히 내가 생각한 예시이므로 정확성이런 것은 생각하기 보다는 흐름만을 익혀보자.

1💡 Base Scenario 2 31. 후지산 인근에서 계속해서 화산활동이 감지되고 있다. 또한, 후지산은 100년 단위로 폭발을 해왔는데 최근 170여 년 동안 폭발이 존재하지 않고 있다. 이로 미루어보았을 때 후지산의 화산폭발은 얼마 남지 않았을 것이라고 추측할 수 있다. 42. 후지산에서 폭발이 발생하는지를 파악하기 위해서 곳곳에 관측기가 필요하며, 이를 분석할 센터가 안전을 위해 후지산 아래에 존재하며 백업 서버를 별도로 다른 공간에 두고 있다. 53. 각 관측소에서 서로 간 데이터 공유도 계속해서 발생하는 경우가 빈번하다. => Horizontal traffic이 많다 -> datacenter와 유사한 형태의 Network -> Spine-Leaf 구조가 적절.

3. Topology 구성 with Mininet

먼저, topology를 작성해야한다. 이를 위해서 Mininet을 활용한다. 이에 대한 개념 정리는 🔗 Mininet애 해두었다. Base Scenario의 3번 사항에서 알 수 있듯이 우리의 Topology는 Spine-Leaf 구조를 갖는 것이 적절하다. 따라서, 이를 먼저 표현해보도록 하겠다.

Source Code

  • /vagrant/example/mt-fuji/topo.py
1from mininet.topo import Topo 2 3class SpineLeaf(Topo): 4 def build(self): 5 s_num = 2 6 l_num = 5 7 h_num = 2 8 spines = [] 9 leaves = [] 10 hosts = [] 11 12 for i in range(s_num): 13 spines.append(self.addSwitch('s%s%s' % (1, i+1))) 14 for i in range(l_num): 15 leaves.append(self.addSwitch('l%s%s' % (2, i+1))) 16 for j in range(s_num): 17 self.addLink(spines[j], leaves[i]) 18 for j in range(h_num): 19 hosts.append(self.addHost('h%s%s' % (i+1, j+1))) 20 self.addLink(leaves[i], hosts[i * h_num + j]) 21 22topos = { 'spineleaf': (lambda: SpineLeaf()) }
  • 실행
1$ sudo mn --mac --controller remote --switch ovs --custom /vagrant/example/mt-fuji/topo.py --topo=spineleaf
  • 실행 결과
    • 빨간색 : Spine Switch
    • 청록색 : Leaf Switch

Spine-Leaf Topology

4. Test 환경구축

주로 사용되는 Test 환경용 도구는 다음과 같다.

  1. ping : 특정 machine 간의 연결 상태를 확인하기 위해서 많이 사용되어진다.
  2. trace : ping과 유사하지만 지나쳐간 hop을 모두 조회 가능하여 좀 더 세부적인 경로를 확인할 때 유용하다.
  3. iperf : client와 server 구조로 이루어지며, tcp, udp packet을 전송할 수 있다. 특정 machine에서는 server로 실행시키고, 다른 machine에서 해당 server로 data를 보내도록 할 수 있다. ping보다 주기적으로, 대용량의 데이터를 보내고 관측할 수 있다.
  4. wireshark : 실젤 traffic의 이동을 GUI로 볼 수 있도록 돕는 도구이다.
  5. ONOS WEB GUI : ONOS에서는 Web을 통해서 Network 상태와 Traffic을 관측하는 것이 가능하다.

여기서는 iperf를 통해서 데이터를 전송하고, ONOS WEB GUI를 통해서 traffic을 관측할 것이다.

아래 command를 통해서 h51가 위에서 언급한 후지산 아래의 서버가 되고, h52가 백업 서버가 되는 상황을 가정하기 위해서 해당 두 위치를 iperf server로 지정한다. 그리고 모든 관측소(h11, h12, ..., h41, h42)에서 iperf client가 되어 traffic을 주기적으로 보내도록 설정한다.

1mininet> h51 iperf -s -u & 2mininet> h52 iperf -s -u & 3 4# xterm 명령어는 host에 위에서 설명한 XQuartz가 정상적으로 설치되어있어야 작동한다. 5mininet> xterm h11 h12 h21 h22 h31 h32 h41 h42 6 7# 각 client에서 다음과 같은 요청을 전송한다. 8$ iperf -u -c 10.0.0.9 -i1 -t100000000000

ONOS에서 확인한 모습

5. Flow Control

기본적으로 Flow를 제어할 수 있는 방식은 해당 Setting을 수행핼 때, 3가지 방법이 있다.

  1. Open vSwitch CLI : OpenFlow Protocol에 기반한 여러 CLI 명령어를 지원한다. 이를 통해서, Flow Table을 직접 작성하는 것이 가능하다.
  2. ONOS REST API : ONOS REST API를 통해서 제어가 가능하다. 이때에는 ONOS가 high level로 추상화한 flow control 방식을 활용해야 한다.(ex. intent) 이는 ONOS를 실행하고 있다면, 다음 url에서 확인이 가능하다. http://localhost:8181/onos/v1/docs/
  3. ONOS CLI : ONOS CLI 명령어를 통해서 제어가 가능하다.

이제부터 해당 세가지 방식을 적절히 활용하여 설정하여 각 Simulation 별로 수행을 해보도록 하겠다.

Scenario 1

중간에 link가 끊어진 경우 with ONOS CLI

sdn-tuto-scenario-1

먼저 모든 host에서 server로 traffic을 중계해줄 수 있도록 다음과 같이 intent를 설정해줄 수 있다. 특정 host간의 intent를 설정하면 자동으로 경로를 찾아서 routing을 수행해준다. 또한, 특정 연결이 중간에 사라져도 자동으로 경로를 재설정한다.

1onos> add-host-intent 00:00:00:00:00:01/None 00:00:00:00:00:09/None 2onos> add-host-intent 00:00:00:00:00:02/None 00:00:00:00:00:09/None 3onos> add-host-intent 00:00:00:00:00:03/None 00:00:00:00:00:09/None 4onos> add-host-intent 00:00:00:00:00:04/None 00:00:00:00:00:09/None 5onos> add-host-intent 00:00:00:00:00:05/None 00:00:00:00:00:09/None 6onos> add-host-intent 00:00:00:00:00:06/None 00:00:00:00:00:09/None 7onos> add-host-intent 00:00:00:00:00:07/None 00:00:00:00:00:09/None 8onos> add-host-intent 00:00:00:00:00:08/None 00:00:00:00:00:09/None

이 후에 mininet에서 특정 link를 비활성화시킨다.

1mininet> link s11 l25 down

sdn-tuto-scenario-1-result

Scenario 2

Load Balancing을 통해서 측정 데이터 고르게 분배 with Open Vswitch CLI

sdn-tuto-scenario-2

이전 Scenario의 intent를 유지한 상태에서 OpenFlow의 Group Table의 select type을 활용하면, Load Balancing이 가능하다. 먼저, ONOS CLI에서 외부 flowRule도 받아들이도록 설정한 후

1$ onos localhost 2onos> cfg set org.onosproject.net.flow.impl.FlowRuleManager allowExtraneousRules True

다음과 같이 group entry 생성 및 flow추가로 구현이 가능하다.

1$ sudo ovs-ofctl add-group l21 \ 2 "group_id=1,type=select,bucket=output:1,bucket=output:2" -O OpenFlow11 3$ sudo ovs-ofctl add-flow l21 in_port=3,actions=group:1 -O OpenFlow11 4$ sudo ovs-ofctl add-flow l21 in_port=4,actions=group:1 -O OpenFlow11 5 6$ sudo ovs-ofctl add-group l22 \ 7 "group_id=1,type=select,bucket=output:1,bucket=output:2" -O OpenFlow11 8$ sudo ovs-ofctl add-flow l22 in_port=3,actions=group:1 -O OpenFlow11 9$ sudo ovs-ofctl add-flow l22 in_port=4,actions=group:1 -O OpenFlow11 10 11$ sudo ovs-ofctl add-group l23 \ 12 "group_id=1,type=select,bucket=output:1,bucket=output:2" -O OpenFlow11 13$ sudo ovs-ofctl add-flow l23 in_port=3,actions=group:1 -O OpenFlow11 14$ sudo ovs-ofctl add-flow l23 in_port=4,actions=group:1 -O OpenFlow11 15 16$ sudo ovs-ofctl add-group l24 \ 17 "group_id=1,type=select,bucket=output:1,bucket=output:2" -O OpenFlow11 18$ sudo ovs-ofctl add-flow l24 in_port=3,actions=group:1 -O OpenFlow11 19$ sudo ovs-ofctl add-flow l24 in_port=4,actions=group:1 -O OpenFlow11

sdn-tuto-scenario-2-result

Scenario 3

h51이 down되어 h52로 traffic redirection with Open Vswitch CLI

sdn-tuto-scenario-3

server로 가는 Leaf Switch에서 packet의 IP, MAC 주소를 변경하여 Redirection이 가능하다.

1$ sudo ovs-ofctl add-flow l25 \ 2 "in_port=1, dl_dst=00:00:00:00:00:09, 3 actions=mod_dl_dst:00:00:00:00:00:10,mod_nw_dst:10.0.0.10,output:4" 4$ sudo ovs-ofctl ad-flow l25 \ 5 "in_port=4, dl_src=00:00:00:00:00:10, 6 actions=mod_dl_src:00:00:00:00:00:09,mod_nw_dst:10.0.0.9,output:1"

sdn-tuto-scenario-3-result

Scenario 4

Meter를 이용해서 관측소로 가는 과도한 traffic 차단 with ONOS REST API

sdn-tuto-scenario-4

특정 Switch에서 특정 port로 나가는 traffic의 최대값을 500KB/s로 제한하는 예시이다.

  • Meter를 생성하기 위한 REST API
    /meters/of:000000000000000c로 POST 요청
1{ 2 "deviceId": "of:000000000000000c", 3 "unit": "KB_PER_SEC", 4 "burst": true, 5 "bands": [ 6 { 7 "type": "DROP", 8 "rate": 500, 9 "burstSize": 0, 10 "prec": 0 11 } 12 ] 13}
  • Meter를 특정 Switch에 적용하기 위한 REST API
    /flows/of:000000000000000c?appId=meter로 POST 요청
1{ 2 "priority": 40000, 3 "isPermanent": true, 4 "deviceId": "of:000000000000000c", 5 "treatment": { 6 "instructions": [ 7 { 8 "type": "METER", 9 "meterId": "1" 10 }, 11 { 12 "type": "OUTPUT", 13 "port": "2" 14 } 15 ] 16 }, 17 "selector": { 18 "criteria": [ 19 { 20 "type": "ETH_TYPE", 21 "ethType": "0x0800" 22 } 23 ] 24 } 25}

sdn-tuto-scenario-4-result

Reference

Comments