블로거 워누입니다!

오늘도 어김없이 SDN 프로젝트를 진행해야 합니다! 11월이 약 20일 정도 남았으니 그 안에 끝내려면 서둘러야 되거든요ㅎㅎ 그럼 바로 본론으로 갑시다!

.

이번 포스팅에서는 Mininet으로 Virtual OpenFlow Network를 구성해보고자 합니다. Mininet은 Stanford Univ.에서 배포하였으며 개인 PC나 노트북에서 쉽고 빠르게 Virtual OpenFlow Network를 구성하여 테스트할 수 있는 OpenSource 프로젝트입니다. 

Mininet은 지난 포스팅에서 설치해보고 가볍게 사용해 보았으니 어느 정도 감은 잡으셨으리라 생각합니다! 그럼 바로 SSH 접속을 하신 후 터미널에서 'sudo mn'을 입력하여 미니넷을 실행해봅시다!

.

$ sudo mn

.

.

위 사진과 같이 되셨다면 mininet을 실행시키는 데 성공하신겁니다!

이번엔 mininet에서 제공하는 유용한 CLI들을 몇개 익혀볼까요? mininet CLI는 Mininet console에서 입력합니다.

.

1) 사용 가능한 명령어 리스트

Mininet> help

 

2) node 정보 출력

Mininet> nodes

 

3) link 정보 출력

Mininet> net

 

4) 모든 node 정보 출력

Mininet> dump

 

5) virtual host의 인터페이스 확인

Mininet> h2 ifconfig

 

6) xterm 띄우기

Mininet> xterm h2

 

7) mininet 종료 및 초기화

Mininet> exit

[또는 Ctrl + D]

 

.

저는 하나하나 입력해서 어떤 결과가 나오는지 보여드릴게요!

(1) help

 

(2-4) nodes, net, dump

 

(5) h1 ifconfig, h2 ifconfig

 

6) xterm h2(당연히 xming 실행시키시고 명령어를 입력하셔야 합니다!)

 

7) exit

.

mininet CLI를 가볍게 체험해보았습니다. 약간은 흥미가 생기셨나요? 저는 아직 잘 모르겠네요 ㅎㅎ 여기까지 되셨으면 이제 sudo mn -c 명령어로 초기화 해줍시다.

.

mininet이 종료되었습니다! 다시 처음의 상태로 되돌아온 것입니다.

CLI도 익혔겠다, 이제 Network Topology를 꾸며볼까요?

자유롭게 Topology를 변경하는 방법에는 두 가지가 있습니다.

.

1) Mininet의 코드를 직접 수정 및 구현하는 방법

2) Mininet에서 제공하는 tool 사용하여 구현하는 방법

.

책에서는 둘 다 쉽다고 하는데 과연 그럴지 한 번 해봐야 겠습니다!

mininet에서 제공하는 Sample코드가 있습니다. ~/mininet/custom 디렉토리 밑에

topo-2sw-2host.py를 살펴 보도록 하죠!

.

.

topo-2sw-2host.py는 2개의 host와 2개의 Switch를 구성하는 파이썬 코드입니다

"# Add hosts and switches" 부분을 잠깐 보시면 self.addHost()라는 함수와 self.addSwitch()라는 함수가 보이시죠? mininet 2.0부터 self.add_node() 함수를 self.addHost(), self.addSwitch() 두 개로 분리하여 Host와 Switch를 구성할 수 있도록 API가 변경되었다고 합니다. 덕분에 우리는 어렵지 않게 코드를 해석할 수 있게 되었네요ㅎㅎ 코드를 기반으로 구성도는 아래와 같습니다.

.

<topo-2sw-2host 구성도>

.

이 Topology를 실행해 볼까요? 아래 명령문을 실행해주세요!

$ sudo mn --custom ~/mininet/custom/topo-2sw-2host.py --topo mytopo

.

[코드 설명]

--custom ~/mininet/custom/topo-2sw-2host.py : topology를 정의한 위치를 지정합니다.

--topo mytopo : 사용자의 topology를 인식합니다.

.

.

실행화면으로 넘어왔습니다. 일단 h2에 대하여 ifconfig를 준 후 아래 두개의 과정을 거쳐서 MAC 주소가 어떻게 바뀌는지 확인해 봅시다!

.

<첫 번째 h2 ifconfig>

 

<sudo mn 후 , h2 ifconfig>

<* 중간에 h2 if config는 실수입니다ㅜㅜ *>

<sudo mn --mac 후, h2 ifconfig>

" 이후에 IP와 MAC주소가 비슷해지지 않았나요?

뭔가 바뀐게 눈에 띄시나요? "sudo mn" 이후의 MAC주소가 바뀌었고

"sudo mn --mac" 이후에 IP와 MAC주소가 비슷해지지 않았나요?

설명을 해드리자면, Mininet에서 Host와 Switch의 MAC 주소는 랜덤으로 설정되고 Mininet이 생성될 때마다(sudo mn) MAC 주소가 변경되어 특정 트래픽을 제어하고자 할 때 불편합니다. 이때 --mac(즉, sudo mn --mac) 옵션을 사용하면 ID,IP,MAC 주소를 같게 설정할 수 있습니다.

예를 들면 방금 한 Host 2번은 IP 10.0.0.2 , MAC 주소는 00:00:00:00:00:02로 설정되는 것이죠!

.

첫번째 방법이 끝났습니다. 조금 길고 지루합니다. 문자만 보여서 그런지 졸리기까지 한 방법인거 같네요..ㅎ 그래도 익숙해지면 나빠보이진 않을 것입니다.

.

두번째 방법, Mininet에서 제공하는 Network Editor Tool, Miniedit를 사용해 봅시다.

Miniedit로 4host-3Switch Topology를 구성해보겠습니다.

.

일단, miniedit를 실행해야겠죠? 명령어는 아래와 같습니다.

(물론 Xming은 실행시켜주셔야 합니다!)

.

$ cd ~/mininet/examples

$ sudo ./miniedit.py

.

.

miniedit 창이 열렸네요! 책에서 소개된 mininet 1.0에서 지원해주는 애들보다 조금 더 많은 버튼을 지원해줍니다! 좋아보입니다!

.

왼쪽 목록을 소개시켜드려야 겠네요. 아래 사진으로 설명해 드리겠습니다!

.

.

이제 Switch 3개와 Host 4개를 이용해 네트워크를 꾸며줍시다. (전 LegacySwitch가 좋아보이니 LegacySwitch로 진행해볼게요!) 아래 사진처럼 네트워크가 구성되었다면, 왼쪽 하단의 run 버튼을 클릭하여 가상 네트워크를 동작시켜줍시다!

.

 

.

각 호스트(h1-h4)중 하나를 골라 마우스 오른쪽 버튼을 길게 클릭해봅시다!

그럼 옆으로 [host option], [Terminal] 두개의 목록이 나타나는데 [Terminal]을 클릭하면 호스트에 연결된 터미널로 접속이 가능합니다.

Host 1에서 Host 4로, 그리고 Host 4에서 Host 1로 Ping 테스트를 해보겠습니다.

.

* ip주소는 아시다시피 'ifconfig -a'로 확인 가능합니다.

  저 같은 경우는,

   host 1 : 10.0.0.1

   host 4 : 10.0.0.4

  였습니다! 여러분도 각 host의 터미널에서 'ifconfig -a'로 확인해보시기 바랍니다.

 

.

 

.

여기는 핑이 잘되네요! Ctrl+z로 빠져 나올수 있습니다! 이제 MiniEdit를 종료하겠습니다. 왼쪽 하단 붉은 색의 [Stop]버튼을 클릭하시거나 상단 메뉴의 [Run]->[Stop] 버튼을 클릭하시면 됩니다! 그 후 오른쪽 상단 창의 X버튼을 눌러서 종료해주세요!

.

이제 mininet으로 3개의 가상 호스트와 1개의 스위치로 구성된 topology를 구성하고, host 2와 host 3이 통신이 가능하도록 'dpctl' utility로  flow를 추가해보겠습니다.

.

 

<"3 Virtual hosts and 1 Switch" topology 구성도 [mininet 1.0 ver] >

 

 

<"3 Virtual hosts and 1 Switch" topology 구성도 [mininet 2.0 ver] >

.

1) 3host-1Swtich topology를 구성합니다. 명령어는 아래와 같습니다.

.

$ sudo mn --topo single,3 --mac --switch ovsk --controller remote

.

[코드 설명]

--topo single,3 : 1개의 Switch, 3개의 host를 구성합니다.

--mac : Datapath ID와 일치하는 MAC 주소를 설정합니다.

--switch  : 실행되어야 할 OpenFlow Switch를 선택합니다.

--controller : 네트워크를 제어 할 수 있는 Controller를 선택합니다.

.

.

2) h1에서 h3로 ping test를 합니다.

$ h1 ping -c5 h3

.

.

100% packet less가 발생했습니다. 그 이유는 Switch에 Flow테이블이 없기 때문입니다. Switch와 연결된 Controller가 없기 때문에, Switch는 유입된 Packet에 대한 정책이 없습니다.

.

dpctl을 이용해서 flow를 dump해서 확인해 봅시다. SSH terminal을 하나 더 띄워서 실행합니다!

.

$ dpctl dump-flows tcp:127.0.0.1:6634

(6633 실수에요! 무시하세요ㅜㅜ)

.

.

( * 주의 : 일부러 창 2개 보이게 했습니다! Putty 한번 더 실행하셔서 들어오시는 거에요! 창 하나가지고 진행하는 것이 아닙니다!!)

Flow Table entry가 없는게 확인이 되었습니다. dpctl의 다양한 옵션을 확인하시려면

"dpctl help" 명령어를 검색하시면 됩니다! (따로 보여드리지는 않을게요!)

.

3) Host의 인터페이스 정보를 확인합니다. h1과 h3 사이가 통신이 되게 하려면, flow entry를 추가해야 합니다. Host와 Switch의 연결 정보를 확인합니다.

.

Mininet> net

Mininet> nodes

Mininet> dump

.

"로 port 정보를 확인합니다.

(다른 창이란 것을 강조하기 위해 창 두개 띄워놨습니다! 혼동 없으시길 바랍니다!)

+ "dpctl show SWITCH"로 port 정보를 확인합니다.

.

 

4) Flow를 추가합니다. h1과 h3 사이에 통신이 가능할 수 있도록 아래의 2개의 flow를 추가하고 다시, dpctl dump-flows로 entry가 추가되었는지 확인합니다.

.

책에는

$ dpctl add-flow tcp:127.0.0.1:6634 in_port=1, nw_dst=10.0.0.3, actions=output:3

$ dpctl add-flow tcp:127.0.0.1:6634 in_port=3, nw_dst=10.0.0.1, actions=output:1

$ dpctl dumps-flows tcp:127.0.0.1:6634

로 되어있으나.. 아래 사진처럼 dpctl은 인자를 최대 두개 받는다고 하여 조사를 한 결과, "nw_dst=10.0.0.1"을 안적는다는 것을 찾아 냈습니다.

(책이랑 좀 다르네요..ㅜㅜ)

즉, 저는 이렇게 적어서 다시 해보았습니다!

.

$ dpctl add-flow tcp:127.0.0.1:6634 in_port=1, actions=output:3

$ dpctl add-flow tcp:127.0.0.1:6634 in_port=3, actions=output:1

$ dpctl dumps-flows tcp:127.0.0.1:6634

.

)

(보이시나요? 맨 위에 수차례 안 되는데 계속 명령어만 들이박은 흔적들입니다ㅜㅜ)

쨌든 조사 후 아래 명령어를 입력하니 오류는 없습니다!

이제 마지막입니다.

.

5) ping test를 합니다.(h1 -> h3)

.

.

잘 됩니다! 무사히 성공하였네요! 3차 위기를 이겨내고 ping test를 성공한 시간은 오전 2:20...허허... 금방 끝날줄 알았던 공부가 생각보다 오래걸렸습니다. 포스팅하면서 한다고 하더라도 이렇게 오래걸릴 줄이야..ㅜㅜ

.

혹시 flow를 삭제하고 싶으시다면

"dpctl del-flows"로 entry를 삭제할 수 있습니다.

ex) $ dpctl del-flows tcp:127.0.0.1:6634 in_port=1

.

오늘 포스팅을 통해서 mininet을 이용하여 가상 네트워크를 구성하고, OpenFlow API의 flow mod를 사용하여 flow entry를 추가 및 삭제하는 방법을 공부해봤습니다.

쉽게 따라 할 수 있다고 책에는 나오지만 책과는 다른 것들이 몇 개 있어서 저는 힘들었네요..ㅜ 어쨋든 실제 Openflow enable된 스위치를 제어하기 전에 Mininet으로 그 기능을 익혀둔다면 도움이 될 것이라고 생각합니다.

.

.

자야겠네요...  이 긴 글을 봐주신 여러분께 감사드리며 이만 포스팅을 마치겠습니다!

+ Recent posts