SDN
Software-Defined Networking
Control Plane과 Data Plane을 분리하여 소프트웨어로 네트워크를 중앙 집중식 제어하는 아키텍처. OpenFlow 프로토콜과 VMware NSX가 대표적.
Software-Defined Networking
Control Plane과 Data Plane을 분리하여 소프트웨어로 네트워크를 중앙 집중식 제어하는 아키텍처. OpenFlow 프로토콜과 VMware NSX가 대표적.
SDN(Software-Defined Networking)은 네트워크 장비의 Control Plane(제어 평면)과 Data Plane(데이터 평면)을 분리하여 소프트웨어로 네트워크를 중앙 집중식으로 제어하는 아키텍처입니다. 기존 네트워크에서는 각 스위치와 라우터가 자체적으로 패킷 전달 경로를 결정했지만, SDN에서는 중앙의 SDN 컨트롤러가 전체 네트워크의 라우팅을 결정합니다.
SDN의 핵심은 3계층 구조입니다. Application Layer(네트워크 애플리케이션), Control Layer(SDN 컨트롤러), Infrastructure Layer(스위치/라우터)로 나뉩니다. 컨트롤러와 네트워크 장비 간 통신에는 OpenFlow 프로토콜이 표준으로 사용됩니다. OpenFlow는 2008년 Stanford 대학에서 개발되었으며, SDN의 시초가 된 프로토콜입니다.
대표적인 SDN 솔루션으로는 VMware NSX가 있습니다. NSX는 데이터센터의 가상화된 네트워크를 제공하며, 마이크로세그멘테이션, 분산 방화벽, 로드 밸런싱 등을 소프트웨어로 구현합니다. 클라우드 환경에서는 AWS VPC, Google Cloud VPC, Azure Virtual Network가 SDN 개념을 기반으로 구축되었습니다.
SDN의 장점은 네트워크 자동화, 프로그래밍 가능성, 중앙 집중식 관리입니다. API를 통해 네트워크 설정을 코드로 관리할 수 있어 DevOps 환경에 적합합니다. 대규모 데이터센터에서 수천 대의 서버 네트워크를 자동으로 프로비저닝하고, 트래픽 패턴에 따라 동적으로 경로를 최적화할 수 있습니다.
# Ryu SDN 컨트롤러 - 간단한 L2 스위치 구현
# pip install ryu
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER, set_ev_cls
from ryu.ofproto import ofproto_v1_3
from ryu.lib.packet import packet, ethernet
class SimpleSwitch(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
def __init__(self, *args, **kwargs):
super(SimpleSwitch, self).__init__(*args, **kwargs)
self.mac_to_port = {} # MAC 주소 학습 테이블
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
msg = ev.msg
datapath = msg.datapath
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
in_port = msg.match['in_port']
pkt = packet.Packet(msg.data)
eth = pkt.get_protocol(ethernet.ethernet)
dst = eth.dst
src = eth.src
dpid = datapath.id
# MAC 주소 학습
self.mac_to_port.setdefault(dpid, {})
self.mac_to_port[dpid][src] = in_port
# 목적지 MAC이 학습되어 있으면 해당 포트로, 아니면 Flood
if dst in self.mac_to_port[dpid]:
out_port = self.mac_to_port[dpid][dst]
else:
out_port = ofproto.OFPP_FLOOD
actions = [parser.OFPActionOutput(out_port)]
# Flow Entry 추가 (MAC 학습된 경우)
if out_port != ofproto.OFPP_FLOOD:
match = parser.OFPMatch(in_port=in_port, eth_dst=dst)
self.add_flow(datapath, 1, match, actions)
# 패킷 전달
out = parser.OFPPacketOut(
datapath=datapath, buffer_id=msg.buffer_id,
in_port=in_port, actions=actions, data=msg.data)
datapath.send_msg(out)
def add_flow(self, datapath, priority, match, actions):
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
inst = [parser.OFPInstructionActions(
ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(
datapath=datapath, priority=priority,
match=match, instructions=inst)
datapath.send_msg(mod)
# 실행: ryu-manager simple_switch.py
# Kubernetes Calico CNI 설정 (SDN 기반 네트워크 정책)
# Network Policy - 특정 Pod 간 통신만 허용
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: production
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 5432
---
# Cilium eBPF 기반 L7 정책 (HTTP 경로별 제어)
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: api-policy
spec:
endpointSelector:
matchLabels:
app: api-server
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "80"
protocol: TCP
rules:
http:
- method: GET
path: "/api/v1/.*"
- method: POST
path: "/api/v1/users"
# Open vSwitch (OVS) CLI 명령어
# OVS는 대표적인 소프트웨어 스위치로 SDN 환경에서 널리 사용
# 브리지 생성
ovs-vsctl add-br br0
# 포트 추가
ovs-vsctl add-port br0 eth0
ovs-vsctl add-port br0 eth1
# OpenFlow 컨트롤러 연결
ovs-vsctl set-controller br0 tcp:192.168.1.100:6653
# Flow 테이블 확인
ovs-ofctl dump-flows br0
# 수동 Flow 추가 (특정 IP로 가는 트래픽을 포트 2로 전달)
ovs-ofctl add-flow br0 "priority=100,ip,nw_dst=10.0.0.50,actions=output:2"
# VLAN 태깅 Flow
ovs-ofctl add-flow br0 "priority=100,in_port=1,actions=mod_vlan_vid:100,output:2"
# Flow 통계 확인
ovs-ofctl dump-flows br0 --with-stats
# 포트 미러링 설정 (트래픽 모니터링용)
ovs-vsctl -- set Bridge br0 mirrors=@m \
-- --id=@eth0 get Port eth0 \
-- --id=@eth2 get Port eth2 \
-- --id=@m create Mirror name=mirror0 select-dst-port=@eth0 output-port=@eth2
# 브리지 상태 확인
ovs-vsctl show
# OpenFlow 버전 설정
ovs-vsctl set bridge br0 protocols=OpenFlow13
"데이터센터를 SDN 기반으로 전환하면 네트워크 프로비저닝 시간을 며칠에서 몇 분으로 단축할 수 있습니다. NSX를 도입하면 VM 단위로 마이크로세그멘테이션이 가능해서 East-West 트래픽 보안도 강화됩니다."
"SDN은 Control Plane과 Data Plane을 분리하는 것이 핵심입니다. 기존 네트워크에서는 각 스위치가 자체 라우팅 테이블을 관리하지만, SDN에서는 중앙 컨트롤러가 OpenFlow 프로토콜로 모든 스위치의 Flow Table을 제어합니다. 이를 통해 네트워크를 코드로 관리하는 Network as Code가 가능해집니다."
"Calico나 Cilium 같은 CNI 플러그인이 SDN 원리를 적용한 거예요. Cilium은 eBPF 기반이라 커널 레벨에서 패킷 필터링이 되니까 Network Policy 성능이 훨씬 좋습니다. 대규모 클러스터에서는 Cilium 추천드립니다."
SDN 컨트롤러가 다운되면 전체 네트워크가 마비될 수 있습니다. 반드시 컨트롤러 클러스터링(HA)을 구성하고, 스위치의 Fail-safe 모드를 설정하세요. OpenDaylight, ONOS 같은 엔터프라이즈 컨트롤러는 클러스터링을 지원합니다.
하드웨어 스위치의 TCAM 용량은 제한적입니다(보통 수천~수만 개 Flow). Flow 규칙이 너무 많으면 성능 저하나 Flow 손실이 발생합니다. Wildcard 매칭을 활용하고, Flow 집계(Aggregation)를 적용하세요.
기존 네트워크 장비가 OpenFlow를 지원하지 않을 수 있습니다. 전면 교체보다는 SDN 오버레이(VXLAN, GRE)를 활용한 점진적 마이그레이션이 현실적입니다.
파일럿 환경에서 충분히 테스트 후 단계적으로 확대하세요. 컨트롤러 HA 구성은 필수이며, 기존 네트워크와 SDN 영역 간 경계를 명확히 정의하세요. 모니터링 도구로 컨트롤러-스위치 간 통신 지연을 상시 체크하세요.