주뇽's 저장소
미니넷(Mininet) 소개 및 사용법 본문
미니넷(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 모델을 학습할 수 있다. 이를 통해 네트워크 분석, 이상 탐지, 트래픽 예측 등의 다양한 연구를 수행할 수 있다.