02. 클라우드 보안 공부/실습로그

✅ [실습로그] STP 완전 정복: 네트워크 루프 방지부터 VLAN 로드밸런싱까지! 🌳

taegi- 2025. 6. 25. 12:46

스위치 네트워크의 필수 생존 기술, STP의 모든 것을 파헤쳐 보자! 🧐

[들어가며: 스위치는 어떻게 일하고, 왜 루프가 생길까? 🤔]

먼저 스위치(브리지)가 어떻게 일하는지 5가지 기본 기능을 빠르게 짚어보자.

  1. Learning (학습): 스위치로 들어오는 프레임의 출발지 MAC 주소를 학습해서 MAC 주소 테이블에 저장해. ("Fa0/1 포트에는 00-00-0C-11-11-11 이 연결되어 있군!")
  2. Flooding (플러딩): 목적지 MAC 주소가 테이블에 없거나, 브로드캐스트/멀티캐스트 프레임일 경우, 들어온 포트를 제외한 모든 포트로 뿌려버려.
  3. Forwarding (전달): 목적지 MAC 주소가 테이블에 있으면, 해당 포트로만 프레임을 콕 집어 전달해.
  4. Filtering (필터링): Forwarding 할 때, 목적지 포트 외 다른 포트로는 프레임이 나가지 못하게 막아.
  5. Aging (노화): MAC 주소 테이블의 정보를 영원히 저장하는 게 아니라, 일정 시간(기본 300초)이 지나면 삭제해서 테이블을 최신 상태로 유지해.

여기서 문제가 발생할 수 있는 지점이 바로 ②번 Flooding이야. 안정성을 위해 스위치 간에 이중화(두 개 이상의 경로)를 해두면, 한쪽에서 시작된 브로드캐스트 프레임이 다른 경로를 통해 되돌아와서 무한히 맴도는 루핑(Looping) 현상이 발생할 수 있어. 이걸 **'브로드캐스트 스톰(Broadcast Storm)'**이라고 하는데, 네트워크 전체를 마비시키는 끔찍한 재앙이지. 😱

그래서 우리에겐 STP가 필요해! (We need STP!) STP는 이중화된 경로 중에서 딱 하나의 활성 경로만 남기고, 나머지 경로들은 예비용으로 차단해서 루프를 원천적으로 막아주는 아주 고마운 프로토콜이야. 그러다가 원래 쓰던 경로에 문제가 생기면, 막아뒀던 예비 경로를 자동으로 활성화시켜서 통신이 끊기지 않게 해주지.


Part 1: STP의 핵심 개념 이해하기 🧐

STP가 똑똑하게 일하려면 몇 가지 기준이 필요해.

  • BPDU (Bridge Protocol Data Unit): STP가 동작하는 스위치들은 서로 BPDU라는 특별한 프레임을 주고받으면서 정보를 교환해. 이 BPDU 안에는 누가 대장(루트 브리지)이 될지, 어떤 경로가 가장 빠른지 등의 중요한 정보가 담겨 있어.
  • Bridge ID (BID): 스위치들이 서로를 식별하기 위한 번호야. 값이 낮을수록 우선순위가 높아!
    • 구성: 8바이트 = 2바이트 Bridge Priority + 6바이트 MAC 주소
    • Bridge Priority: 기본값은 32768 (2^15). 관리자가 0 ~ 65535 사이의 값으로 조정할 수 있어. (spanning-tree vlan 1 priority 0 처럼)
  • Path Cost (경로 비용): 루트 브리지까지 가는 데 드는 비용이야. 값이 작을수록 더 빠른 경로라는 뜻!
    • 대역폭별 Cost: 10Mbps → 100, 100Mbps → 19, 1Gbps → 4, 10Gbps → 2


Part 2: STP는 어떻게 동작할까? (동작 과정) ⚙️

STP는 아래 4단계 과정을 거쳐 루프 없는 나무 모양(Tree)의 경로를 만들어.

1단계: 루트 브리지(Root Bridge) 선발 네트워크 전체에서 딱 하나의 대장 스위치를 뽑는 과정이야. 모든 트래픽이 루트 브리지를 중심으로 흐르게 돼.

  • 선출 기준: 가장 낮은 **Bridge ID(BID)**를 가진 스위치가 당선!
    1. 먼저 Bridge Priority 값이 가장 낮은 스위치를 찾고,
    2. 만약 Priority 값이 같다면, MAC 주소가 가장 낮은 스위치가 최종적으로 선출돼.

2단계: 포트 역할(Role) 결정 루트 브리지가 정해지면, 나머지 스위치들은 각자의 포트에 역할을 부여해.

  • 루트 포트 (Root Port - RP): 루트 브리지가 아닌 스위치(Non-Root Bridge)에서 루트 브리지로 가는 **가장 빠른 길(포트)**이야. 스위치당 딱 하나만 가질 수 있어.
  • 지정 포트 (Designated Port - DP): 각 네트워크 세그먼트(케이블 구간)마다 딱 하나씩 존재하는 포트로, 해당 세그먼트로 트래픽을 전달(Forwarding)하는 역할을 해.
  • 비지정/차단 포트 (Non-Designated/Alternate Port - NDP/AP): 루트 포트도, 지정 포트도 아닌 나머지 포트들이야. 루프를 막기 위해 차단(Blocking) 상태가 돼.
  • 포트 역할 선출 순서 (더 좋은 조건을 가진 쪽이 이긴다!):
    1. 가장 낮은 Root Path Cost: 내 스위치에서 루트 브리지까지 가는 데 드는 총 비용이 가장 낮은 포트.
    2. 가장 낮은 송신 Bridge ID: Path Cost가 같다면, 더 낮은 BID를 가진 스위치와 연결된 포트.
    3. 가장 낮은 송신 Port ID: 위 두 조건도 같다면, 상대방 스위치의 Port ID가 더 낮은 포트. (Port ID = Port Priority(기본 128) + Port Number)

Part 3: STP 성능 개선하기 (UplinkFast, BackboneFast, PortFast) 🚀

표준 STP는 경로에 문제가 생겼을 때 새로운 경로를 활성화하기까지 30~50초라는 긴 시간이 걸릴 수 있어. 이 전환 시간을 단축시켜주는 고마운 기능들이 있어.

  • UplinkFast: 스위치의 루트 포트가 직접 연결된 링크에 장애가 발생했을 때, 예비 경로로 매우 빠르게(1~2초 내에) 전환해주는 기능이야.
    • 설정 전: 30초 소요 → 설정 후: 1~2초 소요!
    • Switch(config)#spanning-tree uplinkfast
  • BackboneFast: 내 스위치에 직접 연결되지 않은, 즉 간접적인 경로에 장애가 발생했을 때 복구 시간을 단축시켜줘. Max Age 타이머(20초)를 기다리지 않게 해서 전체 복구 시간을 50초에서 30초로 줄여줘.
    • STP가 동작하는 모든 스위치에서 설정해야 효과가 있어!
    • Switch(config)#spanning-tree backbonefast
  • PortFast: PC, 서버, 라우터처럼 **스위치가 아닌 단말 장비(End-Device)**가 연결된 포트에 설정해. STP의 Listening, Learning 상태를 건너뛰고 포트가 켜지자마자 바로 Forwarding 상태로 만들어줘서 부팅 시 인터넷이 바로 되게 해줘.
    • Switch(config-if)#spanning-tree portfast edge
  • BPDU Guard: PortFast가 설정된 포트는 스위치가 연결될 일이 없다고 가정하지? 그런데 만약 누군가 실수로 이 포트에 스위치를 연결하면 루프가 생길 수 있어. BPDU Guard는 PortFast 포트에서 BPDU가 수신되면, 즉시 해당 포트를 자동으로 셧다운(err-disable 상태) 시켜서 네트워크를 보호하는 아주 중요한 기능이야. PortFast와 함께 설정하기에 완벽한 짝꿍!
    • Switch(config-if)#spanning-tree bpduguard enable
    • 다운된 포트를 다시 살리려면? 수동으로 shutdown -> no shutdown 해줘야 해.
  • BPDU Filter: 해당 포트에서는 BPDU를 아예 보내지도, 받지도 않겠다는 설정이야. STP의 영향에서 완전히 벗어나게 하는 거라, 잘못 사용하면 루프를 유발할 수 있으니 아주 신중하게 사용해야 해!
    • Switch(config-if)#spanning-tree bpdufilter enable

Part 4: 실전! STP를 활용한 VLAN 로드밸런싱 ⚖️

L3 네트워크에서는 라우팅 프로토콜로 부하를 분산하지만, L2 네트워크에서는 VLAN 기반으로 STP를 활용해서 부하 분산을 할 수 있어. 특정 VLAN은 A 경로를, 다른 VLAN은 B 경로를 사용하게 만들어서 놀고 있는 예비 링크를 활용하는 똑똑한 방법이지!

1단계: 트렁크(Trunk) 설정 모든 스위치 사이의 링크는 여러 VLAN 트래픽이 지나다닐 수 있도록 트렁크로 설정해야 해.

Cisco CLI
 
Switch(config-if)#switchport trunk encapsulation dot1q // 캡슐화 방식 지정 (요즘엔 거의 기본)
Switch(config-if)#switchport trunk allowed vlan 10,20  // 허용할 VLAN 지정
Switch(config-if)#switchport trunk native vlan 999     // Native VLAN 지정 (보안상 1이 아닌 다른 번호로)
Switch(config-if)#switchport mode trunk              // 트렁크 모드로 설정
Switch(config-if)#switchport nonegotiate             // DTP(자동 트렁크 협상) 기능 끄기 (보안상 권장)

2단계: VTP 설정 (VLAN 전파) VLAN 정보를 모든 스위치에 일일이 만들지 않고, 서버 스위치에서 한 번만 만들면 클라이언트 스위치들로 자동 전파되게 설정하자.

  • SW1 (Server):
  • Cisco CLI
     
    SW1(config)#vtp mode server
    SW1(config)#vtp domain cisco
    SW1(config)#vlan 10
    SW1(config-vlan)#name ENG
    SW1(config-vlan)#vlan 20
    SW1(config-vlan)#name SALES
    
  • SW2, SW3 (Clients):
  • Cisco CLI
     
    Switch(config)#vtp mode client
    Switch(config)#vtp domain cisco
    

3단계: End Host 포트 설정 모든 스위치에서 PC 등 단말 장비가 연결된 포트에는 앞서 배운 PortFast, BPDU Guard 등을 적용해서 성능과 안정성을 높여주자.

Cisco CLI
 
Switch(config)#interface g0/1  // PC가 연결된 포트
Switch(config-if)#spanning-tree portfast edge
Switch(config-if)#spanning-tree bpdufilter enable // BPDU 필터는 상황에 맞게 신중히!
Switch(config-if)#spanning-tree bpduguard enable

4단계: 루트 브리지 조정으로 부하 분산 자, 이제 핵심! VLAN마다 루트 브리지를 다르게 지정해서 트래픽 경로를 분산시키는 거야.

  • 명령어: spanning-tree vlan <VLAN_ID> root <primary | secondary>
    • primary: Priority를 24576으로 대폭 낮춰서 해당 VLAN의 대장(루트 브리지)이 되게 함.
    • secondary: Priority를 28672로 낮춰서 primary가 장애나면 다음 대장이 될 예비 후보가 됨.
  • 설정 예시:
    • SW1: VLAN 10의 대장, VLAN 20의 부대장 역할!
    • Cisco CLI
       
      SW1(config)#spanning-tree vlan 10 root primary
      SW1(config)#spanning-tree vlan 20 root secondary
      
    • SW2: VLAN 20의 대장, VLAN 10의 부대장 역할!
    • Cisco CLI
       
      SW2(config)#spanning-tree vlan 20 root primary
      SW2(config)#spanning-tree vlan 10 root secondary
      

이렇게 설정하면, VLAN 10 트래픽은 SW1을 중심으로, VLAN 20 트래픽은 SW2를 중심으로 흐르게 되어 스위치 간의 모든 링크를 효율적으로 사용할 수 있게 돼!


Part 5: VLAN 간 통신과 인터넷 연결 설정 🌐 (Inter-VLAN Routing)

VLAN끼리는 서로 통신이 안 된다고 했지? 이들 사이에 다리를 놔주려면 L3 장비가 필요해. L3 스위치나 라우터를 이용해서 VLAN 간 통신(Inter-VLAN Routing)과 외부 인터넷 연결을 설정해보자.

1단계: SVI (Interface VLAN) 설정 L3 스위치(여기서는 SW1)에 각 VLAN의 게이트웨이 역할을 할 가상의 인터페이스를 만들어.

Cisco CLI
 
SW1(config)#interface vlan 10
SW1(config-if)#ip address 10.1.1.6 255.255.255.248 // VLAN 10의 게이트웨이 IP
SW1(config-if)#no shutdown

SW1(config)#interface vlan 20
SW1(config-if)#ip address 10.1.1.14 255.255.255.248 // VLAN 20의 게이트웨이 IP
SW1(config-if)#no shutdown

2단계: 라우터 연동 및 라우팅 설정 (OSPF, NAT) 외부 인터넷과 연결된 라우터와 통신할 경로를 만들고, 내부 사설 IP가 외부로 나갈 수 있도록 NAT 설정을 해줘. OSPF 같은 라우팅 프로토콜로 서로의 경로를 자동으로 학습하게 만들자.

  • SW1 (L3 스위치):
  • Cisco CLI
     
    SW1(config)#interface g0/3 // 라우터와 연결된 포트
    SW1(config-if)#no switchport // L2 포트를 L3 포트로 전환!
    SW1(config-if)#ip address 10.1.1.18 255.255.255.252
    
    SW1(config)#router ospf 1
    SW1(config-router)#network 10.1.1.0 0.0.0.7 area 0   // VLAN 10 네트워크 알림
    SW1(config-router)#network 10.1.1.8 0.0.0.7 area 0   // VLAN 20 네트워크 알림
    SW1(config-router)#network 10.1.1.16 0.0.0.3 area 0 // 라우터 연결 구간 알림
    
  • Router (외부 라우터):
  • Cisco CLI
     
    Router(config)#interface g0/0 // 외부 인터넷 방향
    Router(config-if)#ip nat outside
    Router(config-if)#ip address dhcp // ISP로부터 IP 받아오기 (예시)
    
    Router(config)#interface g0/3 // 내부(SW1) 방향
    Router(config-if)#ip nat inside
    
    Router(config)#access-list 1 permit any // NAT 적용할 내부 IP 대역 정의
    Router(config)#ip nat inside source list 1 interface g0/0 overload // NAT 설정
    
    Router(config)#router ospf 1
    Router(config-router)#network 10.1.1.16 0.0.0.3 area 0
    Router(config-router)#default-information originate // 인터넷으로 가는 기본 경로를 SW1에게 알려줌
    

3단계: 최종 확인 이제 각 VLAN에 속한 PC에서 외부 인터넷(예: ping 8.8.8.8)으로 통신이 잘 되는지 확인하면 끝!


[마무리하며 ✨]

오늘은 스위치 네트워크의 안정성을 책임지는 STP에 대해 정말 깊이 있게 알아봤어. 루프를 막는 기본 원리부터, 성능을 개선하는 다양한 기능들, 그리고 STP를 활용한 VLAN 로드밸런싱과 Inter-VLAN 라우팅까지! 처음엔 복잡해 보일 수 있지만, 오늘 정리한 내용들을 차근차근 따라 해 보면 어느새 네트워크가 한눈에 보이고 자신감이 붙을 거야! 수고 많았어, 태기야! 😊