MiniEdit와 mininet 웹 기반 컨트롤러

해담·2024년 11월 27일

스위치 네트워크 성능 테스트

OVS (Open Virtual Switch)

wireless(10Mbps)보다 wired(58Gbps)가 네트워크 성능이 높다.

  • wired 네트워크 성능 테스트: sudo mn --test iperf -> 58Gbps

  • wireless 네트워크 성능 테스트: sudo mn --wifi --test iperf -> 10Mbps

User Switch

마찬가지로 wireless(10.5Mbps)보다 wired(1.2Gbps)가 네트워크 성능이 높다.

  • wired 네트워크 성능 테스트: sudo mn --switch=user --test iperf -> 1.2Gbps

  • wireless 네트워크 성능 테스트: sudo mn --wifi --switch=user --test iperf -> 10.5Mbps

OVS와 User Switch

OVS의 성능이 User Switch의 성능보다 훨씬 높다.

wired wireless
OVS 58Gbps 10Mbps
User Switch 1.2Gbps 10.5Mbps

Basic Open-Flow Software Switch (BOFUS) 설치

sudo util/install.sh -3f

MiniEdit, GUI

설치 방법

  1. sudo python examples/miniedit.py
    ModuleNotFoundError: No module named 'packaging' 에러를 만났을 때 sudo apt install python3-packaging (python도 가능) 실행
  2. sudo apt install python-packaging
  3. sudo python examples/monoedit.py: GUI 열림

MidiEdit GUI를 이용한 무선 네트워크 만들기

구성

  • host (유선 단말), station (무선 단말) -> Python Import: from mn_wifi.node import Station
  • switch (스위치)
  • AP (Access Point) 공유기 -> Python Import: from mn_wifi.node import OVSKernelAP
  • Legacy Switch (전통적 스위치)
  • Legacy Router (전통적 라우터)
  • NetLink (실선: 유선, 점선: 무선)
  • Controller (컨트롤러) -> Python Import: from mininet.node import Controller, OVSKernelSwitch, Node

네트워크 토폴로지 디자인

MidiEdit GUI를 사용해 네트워크 구성도를 설계하며, AP, Station, Switch, Controller 등의 배치를 설정합니다.

wireless1.mn 파일명으로 저장할 수 있습니다. 또한 wireless.py로 저장하고 파이썬 타입을 선택하면 파이썬 파일로 변환도 가능합니다.

실행은 run 버튼을 이용하여 실행하거나, cli 명령어인 sudo python3 examples/miniedit.py로 실행 가능합니다.

  • ap2 -> sta4 link up(활성화): sta1 ping sta3 명령어로 sta1과 sta3 사이의 연결을 확인할 수 있습니다.

  • ap2 -> sta4 link down(비활성화): sta1 ping sta3 명령어로 sta1과 sta3 사이의 연결을 확인할 수 있습니다.

파이썬 파일

#!/usr/bin/python
from mininet.node import Controller, OVSKernelSwitch, Node
from mininet.log import setLogLevel, info
from mn
_
wifi.net import Mininet
wifi
_
from mn
_
wifi.node import Station, OVSKernelAP
from mn
_
wifi.cli import CLI
from mn
_
wifi.link import wmediumd
from mn
_
wifi.wmediumdConnector import interference
from subprocess import call
def myNetwork():
net = Mininet
_
wifi(topo=None,
build=False,
link=wmediumd,
wmediumd
mode=interference,
_
ipBase='10.0.0.0/8')
info( '*** Adding controller\n' )
c0 = net.addController(name='c0'
,
controller=Controller,
protocol='tcp'
,
port=6653)
info( '*** Add switches/APs\n')
ap1 = net.addAccessPoint('ap1'
, cls=OVSKernelAP, ssid='ap1'
,
channel='1'
, mode='g'
, position='249.0,305.0,0')
ap2 = net.addAccessPoint('ap2'
, cls=OVSKernelAP, ssid='ap2'
,
channel='1'
, mode='g'
, position='559.0,318.0,0')
r2 = net.addHost('r2'
, cls=Node, ip='0.0.0.0')
r2.cmd('sysctl -w net.ipv4.ip_
forward=1')
s3 = net.addSwitch('s3'
, cls=OVSKernelSwitch)
info( '*** Add hosts/stations\n')
sta1 = net.addStation('sta1'
, ip='10.0.0.1'
,
position='126.0,448.0,0')
sta2 = net.addStation('sta2'
, ip='10.0.0.2'
,
position='267.0,448.0,0')
sta3 = net.addStation('sta3'
, ip='10.0.0.3'
,
position='504.0,443.0,0')
sta4 = net.addStation('sta4'
, ip='10.0.0.4'
,
position='623.0,436.0,0')
info("*** Configuring Propagation Model\n")
net.setPropagationModel(model="logDistance"
, exp=3)
info("*** Configuring wifi nodes\n")
net.configureWifiNodes()
info( '*** Add links\n')
net.addLink(s3, ap1)
net.addLink(s3, ap2)
net.addLink(ap1, sta1)
net.addLink(ap1, sta2)
net.addLink(ap2, sta3)
net.addLink(ap2, sta4)
net.plotGraph(max
x=1000, max
_
_y=1000)
info( '*** Starting network\n')
net.build()
info( '*** Starting controllers\n')
for controller in net.controllers:
controller.start()
info( '*** Starting switches/APs\n')
net.get('ap1').start([])
net.get('ap2').start([])
net.get('s3').start([c0])
info( '*** Post configure nodes\n')
CLI(net)
net.stop()
if
name
== '
main
__
__
__
__
setLogLevel( 'info' )
myNetwork()
  • 네트워크 초기화

    • Mininet_wifi 객체 생성: 무선 네트워크 구성.
    • ipBase='10.0.0.0/8': 네트워크 IP 범위 설정.
    • wmediumd: 무선 링크 제어 모델 사용.
    • interference: 간섭 모델.
  • 컨트롤러 및 네트워크 장치 추가

    • 컨트롤러 추가: c0 컨트롤러 생성.
    • AP 추가:
      • ap1: ssid='ap1', 채널 1, 모드 g.
      • ap2: ssid='ap2', 채널 1, 모드 g.
    • 라우터 추가:
      • r2: IP 포워딩 활성화.
    • 스위치 추가:
      • s3: 일반 스위치.
  • 호스트 및 스테이션 추가

    • 스테이션 sta1, sta2, sta3, sta4 추가. 각 스테이션은 위치(Position)과 IP 주소를 갖춤.
  • 무선 네트워크 설정

    • 전파 모델: logDistance, 감쇠 지수 3 설정.
    • 무선 노드 구성: configureWifiNodes.
  • 링크 추가

    • 스위치(s3) ↔ AP(ap1, ap2) 연결.
    • AP ↔ 스테이션 연결.
  • 네트워크 시뮬레이션 실행

    • 그래프 시각화: plotGraph.
    • 네트워크 시작: net.build() 및 각 장치 시작.



웹 기반 서버 SDN Floodlight 제어기 (Controller) 사용하기: Floodlight SDN Controller Installation and Running

Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 쉽게 생각하면 Vmware나 VirtualBox에서 사용하는 것처럼 하나 OS에 다른 OS를 올려서 사용하게 해주는 것을 의미합니다.

Docket는 기존의 가상화 툴보다 더 가볍고 빠릅니다. 그 이유는 도커는 기존의 가상화 툴 처럼 추가적인 OS를 설치해서 가상화 하지 않고 프로세스를 격리하는 방식으로 동작하기 때문입니다.

도커의 가장 중요한 개념은 Image와 Container입니다.

  • Image: 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 파일
  • Container: Build 과정을 거쳐서 메모리에 올리고 Run을 통해 동작하는 프로세스
  • 간단하게 Image는 실행파일, Container는 프로세스로 이해하면 됩니다.

도커 설치 명령어

  • sudo apt install docker.io: Docker 설치
  • sudo docker search floodlight: Floodlight 이미지 검색
  • sudo docker pull pierrecdn/floodlight: 이미지 다운로드
  • sudo docker images: 이미지 목록 확인
  • sudo docker run -d -p 6653:6653 -p 8080 --name=floodlight: 컨테이너 실행
  • sudo docker ps -a: 컨테이너 확인
  • 브라우저에 localhost:32768/ui/index.html 입력: 웹 UI 접속
  • sudo docker rm floodlight: floodlight 제거

도커 컨테이너 관리 명령어

  • sudo docker stop <컨테이너ID>: 컨테이너 중지

  • sudo docker rm <컨테이너이름>: 컨테이너 삭제

  • sudo docker search floodlight: floodlight라는 이름으로 검색했을 때, pierrecdn/floodlight라는 이미지가 나옴 -> 이 이미지가 Floodlight SDN OpenFlow Controller라는 소프트웨어를 실행하는 데 사용된다는 걸 확인

  • sudo docker pull: pierrecdn/floodlight 명령어로 pierrecdn/floodlight 도커 이미지 갖고 오기 (docker hub에 있는 이미지를 받아서 build까지 수행) -> Floodlight SDN OpenFlow Controller 소프트웨어를 쉽게 실행하기 위함

  • sudo docker images: 현재 내 컴퓨터에 어떤 이미지들이 있는지 확인 -> Image는 build 후 메모리에 올라가고 run 명령어를 통해 컨테이너로 동작

  • sudo docker run-d -p 6653:6653 -p 8080 --name=floodlight pierrecdn/floodlight

    • sudo docker run: 현재는 이미지가 빌드되어 있는 상태고 컨테이너로로 만들어 실행을 시키는 명령어. image는 run 명령어를 통해 컨테이너로 동작
  • sudo docker ps -a: 컨테이너 확인 (현재 실행되고 있는 컨테이너는 sudo docker ps 명령어)
    브라우저(파이어폭스)에 http://localhost:32768/ui/index.html를 입력하면 웹 서버 사이트 기반 SDN Floodlight 제어기 (Controller) 가 컨테이너로 실행됨

  • 웹 서버 기반 SDN Floodlight 제어기 (Controller)만 있음

  • sudo mn --controller=remote,ip=127.0.0.1,port=6653 --switch ovsk,protocols=OpenFlow13: sudo mn 명령어로 기본 네트워크 토폴로지 만들기 (하나의 제어기와 두 개의 호스트) -> 웹 기반 네트워크 토폴로지 제어기 (Controller)는 한 개 Switches (1)와 두 개 호스트 Host(2)로 구성됨

    • 정보 1. Switches IP Address : 172.17.0.1:45628
    • 정보 2. Switches DPID 00:00:00:00:00:00:00:01
      • 제조사(Vendor): Nicira, Inc.
      • Nicira는 소프트웨어 정의 네트워킹(SDN)과 네트워크 가상화에 중점을 둔 회사임.
      • Nicira는 OpenFlow, Open vSwitch, OpenStack 네트워킹 프로젝트의 자체 독점 버전을 만듦
      • Nicira는 CTO를 역임한 Martin Casado, Nick McKeown, Scott Shenker가 2007년에 공동 창립함.
      • 2012년 7월 23일 VMware는 Nicira를 12억 6천만 달러에 인수할 계획이라고 발표했고 이 거래는 다음 달에 마무리됨. Nicira 기술은 VMware의 vSwitch에 합병되었고 NSX라는 이름으로 마케팅됨
  • Floodlight Controller Status를 Dashboard 정보로 보여 줌

  • 스위치 세부 정보

    • Link 상황: TX Bytes, RX Bytes, TX Pkts, RX Pkts, Dropped
    • 한 개의 Switch 가 총 254개 Flow 제어
  • 두 개 호스트 Mac 주소

    • 96:dc:98:49:7a:8b MAC 주소를 가진 호스트
    • d6:c4:87:67:66:30 MAC 주소를 가진 호스트: IP Address 0.0.0.0
      • 0.0.0.0 d6:c4:87:67:66:30
  • Topology

    • 두 개 호스트
      • 96:dc:98:49:7a:8b
      • 0.0.0.0 d6:c4:87:67:66:30
    • 하나 스위치
      • Switches DPID 00:00:00:00:00:00:00:01

웹 서버 기반 SDN Floodlight 제어기 활용

  • ping 명령어 사용으로 스위치 Tx Bytes (15362), Rx Bytes(4996), Tx Packets(175), Rx Packets(56) 사용량 확인
  • h1 ping h2
  • 다시 h1 ping h2 사용으로 스위치의 Tx Bytes (15362 → 17338), Rx Bytes(4996 → 6452), Tx Packets(175 → 199), Rx Packets(56 → 72) 사용량 증가 확인
    • h1 ping h2
    • 스위치의Tx Bytes (15362 → 17338), Rx Bytes(4996 → 6452), Tx Packets(175 → 199), Rx Packets(56 → 72) 사용량 증가 확인

위의 docker 예제와 miniedit 예제는 동시에 127.0.0.1 local loop를 사용하기 때문에 miniedit 예제 사용시는 docker와 container를 중지하고 miniedit 사용함

  • container 중지 명령어
    • sudo docker stop b7845e82009ffa66449261165dcacfc141dce1c29d97d2693e4f35f2d30
      0d7ec
  • sudo docker stop 컨테이너ID 하게 되면 http://localhost:32768/ui/index.html에서 연결 불가능
  • 컨테이너 ID가 운영되고 있으면 아래 miniedit run이 되지 않아서 sudo docker stop 컨테이너 ID로 컨테이너 ID를 중지함
  • miniedit run이 운영됨
  • sudo docker rm floodlight 시 먼저 container를 stop 하라고 함
    • sudo docker stop aef98a6d91eafc6cb6888f3b767b0f919f0757a445ebe29ed9ff95121e4
      1605a
    • 그리고 docker를 지움: sudo docker rm floodlight
    • sudo python examples/miniedit.py은 실행 가능



Quiz

1. OVS(Open Virtual Switch)와 UserSwitch의 네트워크 성능 비교로 올바른 것은 무엇인가요?
OVS는 유선 및 무선 성능에서 모두 UserSwitch보다 우수하다.

2. MiniEdit 실행 중 ModuleNotFoundError: No module named 'packaging' 에러가 발생할 경우 해결 방법은 무엇인가요?
sudo apt install python3-packaging 실행

3. MiniEdit GUI를 사용하여 무선 네트워크를 구성할 때 필요한 주요 구성 요소 3가지를 기술하시오.

  • station(무선 단말): 무선 연결을 사용하는 노드.
  • Access Point (AP): 무선 네트워크의 중심 역할을 하는 공유기.
  • NetLink: 유선(실선)과 무선(점선) 연결을 나타냄.

4. MiniEdit에서 생성된 네트워크 토폴로지를 Python 파일로 변환하려면 어떤 파일로 저장해야 하나요? 또한 변환된 Python 파일의 기본 구조를 설명하시오.

  • .mn 파일 (ex. wirelsess1.mn)
  • Python 파일 구조:
    • Mininet_wifi 라이브러리 사용.
    • Station, AP, Controller, Link 등의 노드 추가 및 연결.
    • 네트워크 빌드와 CLI 실행 포함.

5. Floodlight SDN Controller의 역할과 Docker를 이용한 설치 방법을 설명하시오.

  • 역할: 네트워크를 중앙에서 관리하고 제어하는 소프트웨어 기반 컨트롤러. OpenFlow 프로토콜을 통해 네트워크 장치를 제어.
  • 설치 방법
    1. Docker 설치: sudo apt install docker.io
    2. Floodlight 이미지 다운로드: sudo docker pull pierrecdn/floodlight
    3. 컨테이너 실행: sudo docker run -d -p 6653:6653 -p 8080 --name=floodlight pierrecdn/floodlight
    4. 실행 상태 확인: sudo docker ps -a

6. Floodlight 컨트롤러를 실행한 뒤, 브라우저에서 컨트롤러 UI를 확인하려면 어떤 URL을 입력해야 하나요?
http://localhost:32768/ui/index.html -> Floodlight 컨트롤러는 Docker 컨테이너에서 실행되며, 로컬 호스트에서 웹 UI를 제공합니다.

7. Floodlight SDN 컨트롤러를 중지하려면 어떤 명령어를 사용해야 하나요? 컨테이너를 제거하려면 어떤 명령어를 사용해야 하나요?

  • 컨테이너 중지: sudo docker stop <컨테이너ID>
  • 컨테이너 제거: sudo docker rm floodlight -> 컨테이너 stop 후 진행

8. MiniEdit를 사용하여 AP(ap1)와 Station(sta1)을 연결하려면 어떤 명령어를 사용해야 하나요?
net.addLink(ap1, sta1)

9. Docker를 사용한 가상화의 주요 장점과 Floodlight 컨트롤러에 Docker를 사용하는 이유를 설명하시오.

  • Docker 장점:
    • 기존 가상화보다 경량화되어 빠르고 효율적임.
    • 이미지 및 컨테이너 기반으로 손쉬운 배포 가능.
  • Floodlight 컨트롤러에서 Docker 사용 이유:
    • 다양한 환경에서 동일한 컨트롤러 설정을 재현 가능.
    • 네트워크 테스트와 프로토타이핑에 적합함.

10. MiniEdit에서 AP(ap1)와 Station(sta1) 간 무선 링크를 활성화한 뒤, ping 명령어로 연결 상태를 확인하는 명령어를 작성하시오.
sta1 ping sta3 -> ping 명령어는 두 노드 간 연결 상태를 테스트하는 데 사용됩니다. MiniEdit에서 링크 업/다운 상태를 확인할 때 유용합니다.

profile
해담이를먹여살리기위한..

0개의 댓글