Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

설치

설치 환경은 다음과 같다.
# tail -1 /etc/lsb-release 
DISTRIB_DESCRIPTION="Ubuntu 14.10"

# uname -ri
3.16.0-34-generic x86_64

# kvm --version
QEMU emulator version 2.1.0 (Debian 2.1+dfsg-4ubuntu6.4)

OVS를 설치한다.
# apt-get install openvswitch-switch

제대로 설치됐는지 확인한다. ovs-vsctl은 ovs-vswitchd를 설정하기 위한 CLI 유틸리티다.
# ovs-vsctl show
41683821-59d5-4443-8cc5-c95dae7deaae
    ovs_version: "2.3.1"
yundream@yundream:~$ ps -ea | grep ovs 
 1096 ?        00:00:00 ovsdb-server
 1218 ?        00:00:00 ovs-vswitchd

OVS 브릿지 생성

ovs 브릿지를 만든다.
# ovs-vsctl add-br br-int 
# ovs-vsctl list-br 
br-int

현재 eth0의 네트워크를 삭제한다.
# ifconfig eth0 0.0.0.0
# ifconfig eth0 
eth0      Link encap:Ethernet  HWaddr e0:3f:49:45:49:ec  
          inet6 addr: fe80::e23f:49ff:fe45:49ec/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:297594 errors:0 dropped:0 overruns:0 frame:0
          TX packets:212790 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:380124109 (380.1 MB)  TX bytes:20937802 (20.9 MB)

br-int에 포트를 추가하고 여기에 eth0을 링크한다.
# ovs-vsctl add-port br-int eth0
# ovs-vsctl list-ports br-int 
eth0

네트워크 설정을 한다.
# cat /etc/network/interfaces 
iface br-int inet dhcp
# ifup br-int 
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/br-int/e0:3f:49:45:49:ec
Sending on   LPF/br-int/e0:3f:49:45:49:ec
Sending on   Socket/fallback
DHCPDISCOVER on br-int to 255.255.255.255 port 67 interval 3 (xid=0x4fe98d6c)
DHCPREQUEST of 192.168.219.176 on br-int to 255.255.255.255 port 67 (xid=0x4fe98
d6c)
DHCPOFFER of 192.168.219.176 from 192.168.219.1
DHCPACK of 192.168.219.176 from 192.168.219.1
bound to 192.168.219.176 -- renewal in 38277 seconds.

네트워크 설정을 확인.
# ifconfig br-int 
br-int    Link encap:Ethernet  HWaddr e0:3f:49:45:49:ec  
          inet addr:192.168.219.176  Bcast:192.168.219.255  Mask:255.255.255.0
          inet6 addr: fe80::e23f:49ff:fe45:49ec/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:25516 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17174 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:34891466 (34.8 MB)  TX bytes:1351063 (1.3 MB)

# route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.219.1   0.0.0.0         UG    0      0        0 br-int
0.0.0.0         192.168.219.1   0.0.0.0         UG    1024   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 br-int
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.219.0   0.0.0.0         255.255.255.0   U     0      0        0 br-int
192.168.219.1   0.0.0.0         255.255.255.255 UH    1024   0        0 eth0
br-int의 네트워크 설정이 끝났다. 이제 0.0.0.0/0으로 향하는 트래픽은 br-int로 흐르고 eth0을 경유해서 인터넷으로 나간다.

OVS 스위치를 제어하기 위해서 floodlight OpenFlow network controller를 설치했다.
# apt-get install floodlight  
# /etc/init.d/floodlight start

floodlight 로그파일을 보면, 기본 컨트롤러 포트인 6633이 올라오는 걸 확인할 수 있다.
# tail -f /var/log/floodlight/floodlight.log
INFO [net.floodlightcontroller.core.internal.Controller:main] Controller role set to null
INFO [net.floodlightcontroller.core.internal.Controller:main] Listening for switch connections on 0.0.0.0/0.0.0.0:6633

앞서 만든 br-intconfigured controller에 연결한다.
# ovs-vsctl set-controller br-int tcp:127.0.0.1:6633 

floodlight로그로 br-int가 연결된 것을 확인할 수 있다.
INFO [net.floodlightcontroller.core.internal.Controller:New I/O server worker #1-1] New switch connection from /127.0.0.1:57686

ovs 정보를 살펴보자
# ovs-vsctl show 
41683821-59d5-4443-8cc5-c95dae7deaae
    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        Port br-int
            Interface br-int
                type: internal
        Port "eth0"
            Interface "eth0"
    ovs_version: "2.3.1"

Flat 네트워크 구성

KVM을 이용해서 가상 네트워크를 구성해 보기로 했다. 구성할 네트워크의 구성은 아래와 같다.

가상 머신이 사용할 tap 네트워크 인터페이스 설정을 위해서 두 개의 스크립트를 준비했다.
# cat /etc/ovs-ifup
#!/bin/sh
switch='br-int'
/sbin/ifconfig $1 0.0.0.0 up
ovs-vsctl add-port ${switch} $1

# cat /etc/ovs-ifdown
#!/bin/sh
switch='br-int'
/sbin/ifconfig $1 0.0.0.0 down
ovs-vsctl del-port ${switch} $1
스트립트 파일은 실행권한(chmod +x)을 줘야 한다.
  • VM1
    # kvm -m 512 -net nic,macaddr=00:00:00:00:10:01 -net tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown vdisk1.img
  • VM2
    # kvm -m 512 -net nic,macaddr=00:00:00:00:10:02 -net tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown vdisk2.img
브릿지 상태를 확인해 보자.
# ovs-vsctl show 
41683821-59d5-4443-8cc5-c95dae7deaae
    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        Port "tap1"
            Interface "tap1"
        Port br-int
            Interface br-int
                type: internal
        Port "eth0"
            Interface "eth0"
        Port "tap0"
            Interface "tap0"
    ovs_version: "2.3.1"

tap0과 tap1 인터페이스를 확인할 수 있다.