
스위치 콘솔에 시리얼 케이블을 꽂고 IOS 명령어를 외워서 VLAN을 설정하던 시절이 있었다. 장비 30대를 바꾸려면 하루 종일이 걸렸다. SDN이라는 개념을 처음 접했을 때 반갑기도 하고 반신반의하기도 했다. 지금은 현장에서 직접 써보고 나서, 이게 단순한 유행어가 아니라는 걸 확실히 알게 됐다.
핵심 개념 1. 제어 평면과 데이터 평면의 분리 – 사령부와 전투병의 분업
전통적인 네트워크 장비는 생각하는 기능(제어 평면)과 패킷을 전달하는 기능(데이터 평면)이 한 몸에 들어 있다. 마치 한 병사가 작전 계획도 짜고 직접 전투도 하는 것과 같다. SDN은 이 둘을 분리해서, 사령부(컨트롤러)는 전체 그림을 보면서 경로를 결정하고 전투병(스위치·라우터)은 명령만 받아 패킷을 처리한다. 어린 학생에게 비유하자면, 선생님(컨트롤러)이 수업 계획을 짜고 학생(장비)들은 그 계획대로만 움직이는 구조다.
이렇게 분리하면 컨트롤러가 전체 네트워크 지도를 보고 있어서 특정 경로에 트래픽이 몰리기 전에 미리 다른 길로 돌릴 수 있다. 기존 장비는 자기 주변밖에 모르지만, 컨트롤러는 전체를 본다는 게 가장 큰 차이다.
# 특정 IP에서 오는 트래픽을 포트 2로 보내는 규칙
ovs-ofctl add-flow br0 \
"priority=100,ip,nw_src=10.0.0.1,actions=output:2"
# 특정 MAC에서 오는 트래픽을 플러딩
ovs-ofctl add-flow br0 \
"priority=50,dl_src=00:11:22:33:44:55,actions=flood"
# 플로우 규칙 확인
ovs-ofctl dump-flows br0
# 특정 플로우 삭제
ovs-ofctl del-flows br0 "ip,nw_src=10.0.0.1"
핵심 개념 2. SDN 컨트롤러 – 오케스트라 지휘자의 역할
SDN 컨트롤러는 전체 네트워크의 두뇌다. 오케스트라 연주자들이 각자 열심히 연주해도 지휘자가 없으면 박자가 맞지 않는 것처럼, 스위치들도 컨트롤러 없이는 서로 따로 논다. 컨트롤러는 위쪽으로는 Northbound API를 통해 응용 프로그램과 대화하고, 아래쪽으로는 OpenFlow 같은 Southbound API를 통해 장비들에게 지시를 내린다.
오픈소스로는 OpenDaylight, ONOS, Ryu가 있고, 상용으로는 VMware NSX가 대표적이다. 개발자 입장에서는 네트워크를 API로만 다룰 수 있어서 네트워크 내부 동작을 몰라도 정책을 만들 수 있다는 점이 매력이다.
# Ryu 설치 및 기본 앱 실행
pip install ryu
ryu-manager ryu.app.simple_switch_13
# Ryu 커스텀 컨트롤러 (Python)
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import CONFIG_DISPATCHER, set_ev_cls
from ryu.ofproto import ofproto_v1_3
class SimpleSwitch13(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
def __init__(self, *args, **kwargs):
super(SimpleSwitch13, self).__init__(*args, **kwargs)
self.mac_to_port = {}
@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def switch_features_handler(self, ev):
datapath = ev.msg.datapath
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
match = parser.OFPMatch()
actions = [parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,
ofproto.OFPCML_NO_BUFFER)]
self.add_flow(datapath, 0, match, actions)
핵심 개념 3. OpenFlow 프로토콜 – 컨트롤러와 장비가 말하는 공통 언어
컨트롤러가 지휘자라면 OpenFlow는 악보다. 악보가 없으면 아무리 훌륭한 지휘자도 연주자들에게 정확한 지시를 내릴 수 없다. OpenFlow는 컨트롤러와 장비 사이에서 "이 조건의 패킷이 오면 이렇게 처리해라"는 규칙을 주고받는 표준 언어다. 제조사가 달라도 OpenFlow를 지원하면 같은 컨트롤러로 제어할 수 있다는 게 핵심이다.
플로우 테이블은 출발 IP, 목적지 IP, 포트, MAC 주소 등 다양한 조건을 조합해서 만들 수 있고, 행동은 포워딩, 드롭, 수정, 컨트롤러 전송 등이 있다. 마치 도서관 사서가 책 분류 규칙에 따라 책을 배치하는 것과 비슷하다.
# OVS 설치 및 브리지 구성
apt-get install openvswitch-switch
ovs-vsctl add-br br-sdn
ovs-vsctl add-port br-sdn eth0
ovs-vsctl add-port br-sdn eth1
# 컨트롤러 연결 및 OpenFlow 1.3 설정
ovs-vsctl set-controller br-sdn tcp:192.168.1.100:6633
ovs-vsctl set bridge br-sdn protocols=OpenFlow13
# 플로우 테이블 확인
ovs-ofctl -O OpenFlow13 dump-flows br-sdn
# VLAN 10 트래픽 → 포트 3 포워딩
ovs-ofctl -O OpenFlow13 add-flow br-sdn \
"priority=200,dl_vlan=10,actions=output:3"
# 특정 포트 패킷 드롭
ovs-ofctl -O OpenFlow13 add-flow br-sdn \
"priority=300,in_port=2,actions=drop"
핵심 개념 4. 네트워크 프로그래밍과 자동화 – 인프라도 이제 코드로 쓴다
SDN의 최종 목표는 네트워크를 코드처럼 다루는 것이다. 요리 레시피에 비유하면 이해가 쉽다. 레시피(코드)가 있으면 누가 만들어도 같은 결과가 나오고, 이력이 남고, 실수가 줄어든다. Ansible, Terraform, Netmiko 같은 도구들이 그 레시피를 작성하는 도구들이다.
특히 VXLAN(RFC 7348)처럼 가상 오버레이 네트워크 기술이나 BGP(RFC 4271) 기반 라우팅 정책도 코드로 선언하고 자동화하는 방향으로 발전하고 있다. OSPF(RFC 2328) 같은 전통 프로토콜도 자동화 도구 안에서 설정된다.
# Ansible VLAN 자동화 - inventory.yaml
all:
hosts:
switch1:
ansible_host: 192.168.1.10
ansible_network_os: ios
ansible_user: admin
ansible_password: password123
ansible_connection: network_cli
# playbook.yaml
- name: VLAN 설정
hosts: switch1
gather_facts: no
tasks:
- name: VLAN 100 생성
ios_vlan:
vlan_id: 100
name: PROD_SERVERS
state: present
- name: 인터페이스에 VLAN 할당
ios_l2_interface:
name: GigabitEthernet0/1
mode: access
access_vlan: 100
state: present
ansible-playbook -i inventory.yaml playbook.yaml
# Netmiko로 장비 대량 설정
from netmiko import ConnectHandler
devices = [
{"host": "192.168.1.10", "device_type": "cisco_ios"},
{"host": "192.168.1.11", "device_type": "cisco_ios"},
]
commands = [
"interface GigabitEthernet0/1",
"description PROD_SERVER",
"switchport mode access",
"switchport access vlan 100",
"no shutdown"
]
for device in devices:
device.update({"username": "admin", "password": "password123"})
conn = ConnectHandler(**device)
output = conn.send_config_set(commands)
print(f"{device['host']}: {output}")
conn.disconnect()
마치며 – SDN은 기술이 아니라 사고방식의 변화다
SDN 도입에서 가장 크게 느낀 건 기술이 아니라 일하는 방식이 바뀐다는 거다. 명령어 치는 엔지니어에서 코드 짜는 엔지니어로의 전환. 처음엔 어색했고 저항감도 있었다. 하지만 새벽 긴급 변경 요청이 와도 스크립트 하나로 해결되는 순간, 옛날 방식으로 돌아가고 싶지 않아진다. 그 전환점을 넘기는 게 SDN 도입에서 가장 어려운 부분이다.
'IT적응기' 카테고리의 다른 글
| MTU 최적화 4단계– 현장 엔지니어의 패킷 크기 조정 가이드 (0) | 2026.04.18 |
|---|---|
| 컨테이너 네트워크 5가지 핵심 통신 방법– 현장 엔지니어의 실전 기록 (0) | 2026.04.17 |
| SDN(소프트웨어 정의 네트워크)하드웨어 없이 네트워크를 바꾸는 기술 (0) | 2026.04.16 |
| VPC(Virtual Private Cloud)클라우드 안에 네트워크 만드는 법! (0) | 2026.04.16 |
| 기초 보안의 ACL(Access Control List)로 특정 IP 차단 설정법 (0) | 2026.04.16 |