주뇽's 저장소

미니넷(Mininet) 소개 및 사용법 본문

GNN

미니넷(Mininet) 소개 및 사용법

뎁쭌 2024. 5. 29. 21:33
728x90
반응형

미니넷(Mininet) 소개 및 사용법

미니넷(Mininet)은 네트워크 연구와 실험을 위해 널리 사용되는 가상 네트워크 시뮬레이션 도구이다. 이 글에서는 미니넷의 설치부터 기본적인 네트워크 토폴로지 구성 및 패킷 캡처 방법까지 상세히 설명한다.

 

1. 미니넷 설치

미니넷을 사용하려면 Ubuntu 등 리눅스 환경이 필요하다. 설치 과정은 다음과 같다.

 

1. 패키지 목록 업데이트

sudo apt-get update

2. 미니넷 설치

sudo apt-get install mininet
sudo apt-get install openvswitch-testcontroller

설치가 완료되면 미니넷을 사용할 준비가 된다.

2. 미니넷 기본 사용법

기본적인 사용법을 통해 간단한 네트워크를 구축해본다.

2.1. 간단한 네트워크 토폴로지 생성 및 실행

다음 코드는 하나의 스위치와 두 개의 호스트가 있는 간단한 네트워크를 생성한다.

from mininet.net import Mininet
from mininet.topo import Topo
from mininet.node import OVSController
from mininet.log import setLogLevel

# 네트워크 토폴로지를 정의하는 클래스
class SimpleTopo(Topo):
    def build(self):
        # 스위치 추가
        switch = self.addSwitch('s1')

        # 호스트 추가
        host1 = self.addHost('h1')
        host2 = self.addHost('h2')

        # 링크 추가 (호스트-스위치)
        self.addLink(host1, switch)
        self.addLink(host2, switch)

# 네트워크 시작 함수
def run():
    topo = SimpleTopo()
    net = Mininet(topo=topo, controller=OVSController)

    # 네트워크 시작
    net.start()

    # 네트워크 상태 출력
    print("Network hosts:", net.hosts)

    # 호스트 간의 핑 테스트
    net.pingAll()

    # 네트워크 종료
    net.stop()

# 로그 레벨 설정
setLogLevel('info')

# 네트워크 실행
run()
코드 설명
  • 라이브러리 임포트: 미니넷의 주요 구성 요소들을 가져온다.
from mininet.net import Mininet
from mininet.topo import Topo
from mininet.node import OVSController
from mininet.log import setLogLevel
  • 네트워크 토폴로지 클래스 정의:  SimpleTopo 클래스를 정의하여 네트워크의 구조를 설정한다. build() 메서드에서 네트워크 요소들을 추가한다.
class SimpleTopo(Topo):
    def build(self):
        switch = self.addSwitch('s1')
        host1 = self.addHost('h1')
        host2 = self.addHost('h2')
        self.addLink(host1, switch)
        self.addLink(host2, switch)
  • 네트워크 시작 함수: run() 함수에서 미니넷 객체를 생성하고 네트워크를 시작한다.
def run():
    topo = SimpleTopo()
    net = Mininet(topo=topo, controller=OVSController)
    net.start()
    print("Network hosts:", net.hosts)
    net.pingAll()
    net.stop()
  • 로그 레벨 설정 및 네트워크 실행: setLogLevel('info')로 로그 레벨을 설정하고 run() 함수를 호출하여 네트워크를 실행한다.
setLogLevel('info')
run()

2.2. 네트워크 상에서 패킷 캡처

패킷 캡처를 위해 tcpdump를 사용할 수 있다. 다음은 패킷 캡처 예제이다:

from mininet.net import Mininet
from mininet.topo import Topo
from mininet.node import OVSController
from mininet.log import setLogLevel

class SimpleTopo(Topo):
    def build(self):
        switch = self.addSwitch('s1')
        host1 = self.addHost('h1')
        host2 = self.addHost('h2')
        self.addLink(host1, switch)
        self.addLink(host2, switch)

def run():
    topo = SimpleTopo()
    net = Mininet(topo=topo, controller=OVSController)
    net.start()

    h1, h2 = net.get('h1', 'h2')

    # h1에서 tcpdump를 실행하여 패킷 캡처
    h1.cmd('tcpdump -i h1-eth0 -w h1_capture.pcap &')

    # h2에서 h1으로 핑 명령어 실행
    h2.cmd('ping -c 4 10.0.0.1')

    # 캡처 종료
    h1.cmd('kill %tcpdump')

    net.stop()

setLogLevel('info')
run()
코드 설명
  • 패킷 캡처: h1에서 tcpdump를 실행하여 패킷을 캡처한다.
h1.cmd('tcpdump -i h1-eth0 -w h1_capture.pcap &')
  • 핑 테스트: h2에서 h1으로 핑을 보낸다.
h2.cmd('ping -c 4 10.0.0.1')
  • 캡처 종료: tcpdump 프로세스를 종료한다.
h1.cmd('kill %tcpdump')

 

이러한 방식으로 미니넷을 활용하여 다양한 네트워크 실험을 수행할 수 있다. 

 

미니넷을 활용한 GNN 연구

미니넷을 사용하여 네트워크 데이터를 수집하고, 이를 그래프 신경망(GNN) 학습에 활용할 수 있다. 예를 들어, 네트워크 토폴로지를 생성하고 패킷 전송 로그를 수집한 후, 이를 그래프로 변환하여 GNN 모델에 입력할 수 있다.

데이터 수집 및 전처리

네트워크 실험에서 생성된 데이터를 수집하고, GNN 입력에 맞게 전처리하는 과정은 다음과 같다:

 

1. 패킷 캡처 파일을 CSV로 변환:

tshark -r h1_capture.pcap -T fields -e frame.number -e ip.src -e ip.dst -e frame.len -E header=y -E separator=, > packets.csv

 

 

2. CSV 파일을 그래프로 변환: Python의 NetworkX 라이브러리를 사용하여 그래프를 생성한다.

import pandas as pd
import networkx as nx

# CSV 파일 로드
df = pd.read_csv('packets.csv')

# 그래프 생성
G = nx.from_pandas_edgelist(df, 'ip.src', 'ip.dst', ['frame.len'])

 

GNN 모델 학습

수집된 네트워크 데이터를 이용하여 GNN 모델을 학습한다. PyTorch Geometric을 사용하여 GNN 모델을 구현할 수 있다.

import torch
import torch_geometric
from torch_geometric.data import Data

# 그래프 데이터를 PyTorch Geometric 형식으로 변환
edge_index = torch.tensor([list(G.edges)], dtype=torch.long)
x = torch.tensor([list(G.nodes)], dtype=torch.float)

data = Data(x=x, edge_index=edge_index)

# GNN 모델 정의
class GNN(torch.nn.Module):
    def __init__(self):
        super(GNN, self).__init__()
        self.conv1 = torch_geometric.nn.GCNConv(dataset.num_node_features, 16)
        self.conv2 = torch_geometric.nn.GCNConv(16, dataset.num_classes)

    def forward(self, data):
        x, edge_index = data.x, data.edge_index
        x = self.conv1(x, edge_index)
        x = torch.relu(x)
        x = self.conv2(x, edge_index)
        return torch.nn.functional.log_softmax(x, dim=1)

model = GNN()

이와 같이 미니넷을 활용하여 네트워크 실험 데이터를 수집하고 GNN 모델을 학습할 수 있다. 이를 통해 네트워크 분석, 이상 탐지, 트래픽 예측 등의 다양한 연구를 수행할 수 있다.