본문 바로가기
IT적응기

SDN(소프트웨어 정의 네트워크)하드웨어 없이 네트워크를 바꾸는 기술

by IT적응기 2026. 4. 16.

SDN(소프트웨어 정의 네트워크) 쉽게 이해하기 참고이미지
SDN(소프트웨어 정의 네트워크) 쉽게 이해하기

스위치 콘솔에 시리얼 케이블을 꽂고 IOS 명령어를 외워서 VLAN을 설정하던 시절이 있었다. 장비 한 대의 설정을 바꾸려면 SSH로 접속해서 명령어를 치고, 다음 장비로 가서 또 치고, 전체 30대면 하루 종일 걸리는 작업이었다. SDN이라는 개념을 처음 접했을 때 "소프트웨어로 네트워크를 제어한다"는 말이 반갑기도 했고 반신반의하기도 했다. 지금은 현장에서 SDN을 직접 써보고 나서, 이게 단순한 유행어가 아니라는 걸 확실히 알게 됐다. 네 가지 핵심 개념으로 나눠서 경험한 이야기를 풀어본다.

핵심 개념 1. 제어 평면과 데이터 평면의 분리 – 사령부와 전투병의 분업

전통적인 네트워크 장비는 생각하는 것(제어 평면)과 패킷을 전달하는 것(데이터 평면)이 한 장비 안에 묶여 있다. 예를 들어 학교 선생님이 수업 계획도 직접 짜고, 교단에 서서 강의도 하고, 숙제 채점까지 혼자 다 하는 것과 비슷하다. 물론 가능하긴 한데, 학생 수가 수백 명으로 늘어나면 감당이 안 된다. 선생님(제어 평면)과 보조 강사(데이터 평면)를 역할별로 분리하는 게 SDN의 핵심 아이디어다.

사령부(SDN 컨트롤러)는 전체 네트워크 지도를 들고 최적 경로를 결정하고, 전투병(스위치, 라우터)은 사령부의 명령만 받아서 패킷을 빠르게 처리한다. 덕분에 특정 링크에 트래픽이 몰릴 것 같으면 컨트롤러가 미리 다른 경로로 트래픽을 돌려버릴 수 있다. 장비 혼자서는 절대 할 수 없는 일이다.

# OpenFlow 기반 SDN에서 플로우 규칙 추가 예시 (OVS - Open vSwitch)
# 특정 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"
✅ 장점
컨트롤러 하나에서 수백 대 장비의 정책을 동시에 바꿀 수 있다. 예전처럼 장비 한 대씩 접속하는 작업이 없어진다. 정책 변경을 소프트웨어 배포처럼 관리하니 버전 관리와 롤백도 가능하다. 네트워크에 CI/CD 개념이 적용되는 셈이다.
⚠️ 단점
컨트롤러가 단일 장애점이 된다. 컨트롤러가 죽으면 전체 네트워크 제어가 마비될 수 있다. 클러스터링으로 이중화하지만 그 설계 자체가 또 복잡해진다. 컨트롤러와 통신이 끊기면 장비가 예전 플로우 규칙으로만 동작하거나 아예 멈추는 상황도 생긴다.
처음으로 SDN 파일럿 환경을 꾸렸을 때의 일이다. 컨트롤러 서버가 메모리 부족으로 OOM에 걸려 죽어버렸고, 연결된 스위치 20여 대가 일제히 기존 플로우 규칙으로만 동작하기 시작했다. 일부 트래픽은 잘 흘렀지만, 새로 추가된 서버들은 아무것도 못 받는 상태가 됐다. 결국 컨트롤러를 살리고 나서 플로우 규칙을 다시 푸시하는 데 30분 가까이 걸렸다. 단일 장애점 문제가 말만 무서운 게 아니라는 걸 몸으로 배운 날이었다. 그 이후로는 컨트롤러 클러스터링을 반드시 먼저 설계하고 나서 도입을 진행한다. 제어와 데이터를 분리하는 아이디어는 탁월하지만, 컨트롤러 자체의 안정성을 먼저 챙기지 않으면 분리의 장점이 오히려 취약점이 된다.

핵심 개념 2. SDN 컨트롤러 – 오케스트라 지휘자의 역할

SDN 컨트롤러는 전체 네트워크의 두뇌다. 오케스트라 비유가 딱 맞는다. 바이올린, 첼로, 트럼펫 연주자들이 각자 악보를 보며 연주하면 소리는 나지만 화음이 맞지 않는다. 지휘자가 있어야 박자와 화음이 맞아 아름다운 음악이 된다. SDN 컨트롤러는 각 스위치와 라우터가 제때 제대로 패킷을 처리하도록 지시하고 조율하는 지휘자다.

대표적인 오픈소스 컨트롤러로는 OpenDaylight, ONOS, Ryu가 있고, 상용으로는 VMware NSX가 가장 많이 쓰인다. 컨트롤러는 위로는 Northbound API로 응용 프로그램과 통신하고, 아래로는 Southbound API(OpenFlow 등)로 실제 장비를 제어한다. 덕분에 애플리케이션 개발자는 네트워크 내부 구조를 몰라도 API 호출 몇 줄로 네트워크 정책을 바꿀 수 있다.

# Ryu SDN 컨트롤러 설치
pip install ryu

# L2 스위칭 기본 앱 실행
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
from ryu.controller.handler import 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)
✅ 장점
Northbound API 덕분에 네트워크 정책을 코드로 짤 수 있다. 새 서버가 올라오면 자동으로 네트워크 정책이 적용되도록 자동화할 수 있다. 쿠버네티스 파드가 수십 개씩 올라갔다 내려가는 환경에서 특히 위력적이다.
⚠️ 단점
컨트롤러 운영 자체가 또 하나의 시스템 관리다. 업그레이드, 백업, 모니터링을 별도로 챙겨야 한다. 오픈소스 컨트롤러는 러닝커브가 상당해서 팀 전체가 숙지하기 전까지는 혼란이 더 클 수도 있다.
팀에 Ryu 컨트롤러를 도입했을 때 가장 힘들었던 게 유지보수 담당자를 정하는 문제였다. 컨트롤러를 구성한 나는 동작 원리를 알겠는데, 다른 팀원들은 파이썬 코드를 보면서 당황하는 상황이 반복됐다. 결국 팀 내 스터디를 두 달 동안 진행하고 나서야 팀 전체가 기본 운영 정도는 할 수 있게 됐다. 도입 초기에 컨트롤러가 업그레이드 후 설정이 날아간 적이 있었는데, 그때 백업을 안 해뒀다가 전날 작업한 플로우 규칙을 전부 다시 넣어야 했다. 컨트롤러 자체의 백업과 버전 관리가 일반 서버 못지않게 중요하다는 걸 그때 배웠다. 기술의 편의성을 누리려면 운영 체계도 함께 갖춰야 한다.

핵심 개념 3. OpenFlow 프로토콜 – 컨트롤러와 장비가 말하는 공통 언어

SDN 컨트롤러가 지휘자라면, OpenFlow는 악보다. 아무리 훌륭한 지휘자라도 악보 없이는 연주자들이 따를 수가 없다. OpenFlow는 컨트롤러와 네트워크 장비 사이에서 플로우 규칙을 주고받는 표준 프로토콜이다. 장비를 만든 회사가 달라도 OpenFlow를 지원하면 같은 컨트롤러로 제어할 수 있다는 게 핵심이다.

플로우 테이블은 쉽게 말해 "이 조건의 패킷이 오면 이 행동을 해라"는 규칙 목록이다. 조건은 출발 IP, 목적지 IP, 포트 번호, MAC 주소 등을 자유롭게 조합할 수 있고, 행동은 특정 포트로 보내기, 버리기, 패킷 내용 수정, 컨트롤러로 전송 등이 있다. 마치 빠른 배달 정렬 센터처럼, 패킷이 들어오면 규칙표를 보고 즉시 어디로 보낼지 결정한다.

# Open vSwitch 설치 (Ubuntu)
apt-get install openvswitch-switch

# OVS 브리지 생성 및 포트 추가
ovs-vsctl add-br br-sdn
ovs-vsctl add-port br-sdn eth0
ovs-vsctl add-port br-sdn eth1

# OpenFlow 컨트롤러 연결 설정
ovs-vsctl set-controller br-sdn tcp:192.168.1.100:6633

# OpenFlow 버전 설정 (1.3 권장)
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"
✅ 장점
벤더 종속성에서 벗어날 수 있다. 예전에는 A사 스위치를 쓰면 A사 관리 솔루션까지 묶음으로 써야 했는데, OpenFlow 지원 장비라면 컨트롤러를 자유롭게 선택할 수 있다. 멀티벤더 환경에서 일관된 정책 관리가 가능해진다.
⚠️ 단점
OpenFlow 지원 범위가 장비마다 다르다. 스펙상 지원이라고 해도 실제로 써보면 특정 매칭 조건이 동작하지 않거나 성능이 기대에 못 미치는 경우가 있다. 도입 전에 실제 장비에서 충분히 검증해야 한다.
OpenFlow 도입을 위해 A사 스위치를 테스트하던 중, 스펙 문서에는 "레이어 4 매칭 지원"이라고 적혀 있었는데 실제로는 TCP 포트 매칭이 CPU 처리로 동작해서 성능이 형편없었다. 하드웨어 ASIC에서 처리될 거라 기대했는데 전혀 달랐다. 그 스위치를 믿고 전면 도입했다면 서비스 장애로 이어졌을 것이다. 검증 단계에서 발견한 게 다행이었다. 그 이후로 새 장비는 반드시 파일럿 환경에서 실제 트래픽을 흘려보면서 성능을 직접 측정한다. 문서는 참고용일 뿐이고, 현장 검증이 전부다.

핵심 개념 4. 네트워크 프로그래밍과 자동화 – 인프라도 이제 코드로 쓴다

SDN의 최종 목표는 네트워크를 코드처럼 다루는 것이다. 요리 레시피에 비유하면 딱 맞다. 요리사가 매번 즉흥적으로 요리하면 맛이 달라지지만, 레시피(코드)가 있으면 누가 만들어도 같은 맛이 난다. 네트워크도 마찬가지다. 사람이 CLI에서 직접 명령어를 치는 대신 코드로 정의해두면 환경을 몇 번이든 동일하게 재현할 수 있다. 실수도 줄고, 기록도 남는다.

Ansible, Terraform, 파이썬 스크립트 등 다양한 도구가 SDN 자동화에 쓰인다. 특히 Ansible의 네트워크 모듈은 Cisco, Juniper, Arista 등 주요 장비를 지원해서 현장에서 가장 많이 선택된다.

# 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 - VLAN 설정 자동화
- 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"},
    {"host": "192.168.1.12", "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"})
    connection = ConnectHandler(**device)
    output = connection.send_config_set(commands)
    print(f"{device['host']}: {output}")
    connection.disconnect()
✅ 장점
수십 대 장비에 동일한 정책을 적용하는 데 수 분이면 충분하다. 오타로 인한 장애를 예방할 수 있고, 변경 이력을 Git으로 관리할 수 있다. 신규 서버 온보딩이 자동화되면 운영팀 업무가 눈에 띄게 줄어든다.
⚠️ 단점
자동화 스크립트를 잘못 짜면 피해도 자동화된다. 잘못된 설정이 수십 대 장비에 동시에 적용되는 참사가 벌어질 수 있다. 스테이징 환경에서 충분히 테스트하고 롤백 플랜을 항상 준비해야 한다.
자동화 도입 초기에 Ansible 플레이북에 VLAN ID를 하드코딩한 채로 실수로 전체 장비를 대상으로 실행한 적이 있다. 스테이징 장비가 아닌 운영 장비 15대에 잘못된 VLAN 설정이 동시에 들어가면서 해당 VLAN을 쓰던 서비스가 일제히 다운됐다. 다행히 롤백 플레이북을 미리 만들어뒀기 때문에 7분 만에 복구했지만, 식은땀이 났다. 그 이후로 플레이북 실행 전에 반드시 --check 옵션으로 드라이런을 먼저 돌리는 걸 팀 규칙으로 정했다. 자동화는 실수를 줄이는 도구지만, 자동화 자체가 새로운 실수의 통로가 될 수 있다. 절차 하나를 더 넣는 게 귀찮아 보여도, 그게 장애를 막는 안전장치가 된다.

마치며 – SDN은 기술이 아니라 사고방식의 변화다

SDN을 도입하면서 가장 크게 느낀 건 기술 자체보다 일하는 방식이 바뀐다는 거다. 네트워크 엔지니어가 장비 앞에서 명령어를 치는 사람에서 코드를 짜는 사람으로 역할이 바뀐다. 처음엔 어색하고 저항감이 생기는 게 자연스럽다. 오래 해온 방식을 버리는 건 쉽지 않다.

그런데 직접 써보고 나면, 새벽에 긴급 네트워크 변경 요청이 와도 SSH 30번 붙어다닐 필요가 없어진다. 스크립트 하나 돌리면 된다. 그 전환점을 넘기는 게 SDN 도입에서 가장 어려운 부분이고, 동시에 가장 보람 있는 순간이다.


소개 및 문의 · 개인정보처리방침 · 면책조항

© 2026 깜짝,황금이 아빠 IT적응기

서치어드바이저