Network/Switch

[Switch] STP - 루프가 생기면 네트워크는 왜 마비되는가?

넷곰 2026. 3. 20. 15:51
Chapter 4 — STP (Spanning Tree Protocol)

개요

스위치 3대를 삼각형으로 연결하면 루프가 생기고, 브로드캐스트 프레임이 영원히 순환하면서 네트워크가 마비된다. STP(Spanning Tree Protocol)는 이 루프를 논리적으로 끊기 위해 포트 하나를 선택적으로 차단하는 프로토콜이다. 이번 챕터에서는 EVE-NG 삼각형 토폴로지에서 STP 동작을 직접 확인하고, Root Bridge 조작, PortFast/BPDU Guard, Root Guard/Loop Guard까지 실습했다.

WHY — 루프가 없으면 STP도 필요 없다

스위치 간 이중화를 위해 링크를 2개 이상 연결하면 물리적으로 루프가 생긴다. 브로드캐스트 프레임은 TTL이 없기 때문에, 루프 토폴로지에서 한 번 발생하면 스위치들 사이를 영원히 순환한다.

브로드캐스트 프레임 1개 발생
→ 복제되면서 삼각형을 순환
→ 1개 → 2개 → 4개 → 8개 ... (기하급수적 증가)
→ 스위치 CPU 100%
→ 모든 정상 트래픽 처리 불가
→ 네트워크 마비 (재부팅해도 루프가 살아있으면 반복)

이것이 브로드캐스트 스톰(Broadcast Storm)이다. STP는 루프 토폴로지에서 포트 하나를 논리적으로 차단해서 이 문제를 원천 차단한다.

이중화(링크 2개)와 루프 방지(STP)는 동전의 양면이다. 이중화를 포기하면 STP가 필요 없고, 이중화를 원하면 STP가 필수다.

HOW — STP 동작 메커니즘

STP는 루프 토폴로지에서 어느 포트를 차단할지를 3단계로 결정한다.

1단계 — Root Bridge 선출

가장 낮은 Bridge ID를 가진 스위치가 Root Bridge가 된다. Bridge ID는 Priority(2바이트) + MAC 주소(6바이트)로 구성된다. Priority 기본값은 32768이며, 동점일 경우 MAC 주소가 낮은 스위치가 선출된다.

Bridge ID = Priority (2byte, 기본값 32768) + MAC Address (6byte)
→ Bridge ID가 가장 낮은 스위치 = Root Bridge
Priority를 설정하지 않으면 MAC 주소가 낮은 스위치가 Root가 된다. 이는 가장 오래된 장비가 Root가 될 수 있다는 뜻이다. 반드시 관리자가 직접 지정해야 한다.

2단계 — Root Port 선출

Root Bridge가 아닌 스위치(Non-Root)에서, Root Bridge까지 가장 낮은 Cost 경로를 가진 포트가 Root Port가 된다. 각 스위치마다 1개씩 존재한다. 1Gbps 링크의 Cost는 4, 100Mbps는 19, IOL L2 환경에서는 100으로 표시된다.

3단계 — Designated Port / Blocking 결정

각 세그먼트(링크)마다 트래픽을 담당할 포트 1개가 Designated Port로 선정된다. Root Bridge의 모든 포트는 Designated다. 나머지 포트가 Blocking(Alternate) 상태로 차단되어 루프를 끊는다.

포트 역할상태설명
Root PortForwardingRoot Bridge까지 최선 경로 포트 (Non-Root 스위치마다 1개)
Designated PortForwarding각 세그먼트에서 트래픽 담당 포트
Alternate PortBlocking루프 방지를 위해 차단된 포트

STP vs RSTP 수렴 시간

STP(802.1D)는 포트 상태 전이 시 타이머를 기다린다. Listening 15초 + Learning 15초 = 최소 30초가 소요된다. RSTP(802.1w)는 타이머 대신 이웃 스위치와 Proposal/Agreement 협상으로 대체해 1~2초 안에 수렴한다.

STP 포트 상태 (5단계):
Disabled → Blocking → Listening(15초) → Learning(15초) → Forwarding
→ 총 30초 대기

RSTP 포트 상태 (3단계):
Discarding → Learning → Forwarding
→ Proposal/Agreement 협상으로 즉시 전환 (1~2초)

STP 보호 기능 비교

기능트리거상태복구적용 위치
BPDU GuardBPDU 수신err-disabled수동PortFast 포트 (PC 연결)
Root GuardSuperior BPDU 수신root-inconsistent자동Designated 포트
Loop GuardBPDU 수신 중단loop-inconsistent자동Blocking 포트

실습 토폴로지

           [SW1]  Priority 8192
           /     \
        e0/1     e0/2
        /               \
     [SW2]----e0/3----[SW3]  Priority 32768
     e0/0              e0/0
      |                  |
    [VPC4]            [VPC5]

     SW2: Priority 4096 (Root Bridge)
장비이미지연결 포트비고
SW1IOL L2e0/1(SW2), e0/2(SW3)Priority 8192 (Backup Root)
SW2IOL L2e0/1(SW1), e0/3(SW3), e0/0(VPC4)Priority 4096 (Root Bridge)
SW3IOL L2e0/2(SW1), e0/3(SW2), e0/0(VPC5)Priority 32768 (기본값)
VPC4VPCSSW2 e0/0-
VPC5VPCSSW3 e0/0-

확인 명령어 및 결과

Root Bridge 확인 — 초기 상태 (Priority 미설정)

아무 설정 없이 토폴로지를 올리면 MAC 주소가 가장 낮은 SW1이 Root Bridge로 선출된다.

SW1# show spanning-tree vlan 1

VLAN0001
  Spanning tree enabled protocol rstp
  Root ID   Priority    32769
            Address     aabb.cc00.1000
            This bridge is the root   ← SW1이 Root

  Interface   Role  Sts  Cost    Prio.Nbr  Type
  Et0/0       Desg  FWD  100     128.1     Shr
  Et0/1       Desg  FWD  100     128.2     Shr
  Et0/2       Desg  FWD  100     128.3     Shr

Root Bridge 강제 이동 — Priority 조작

SW2를 Root Bridge로, SW1을 Backup Root로 설정한다. Priority는 4096의 배수만 허용된다.

SW2(config)# spanning-tree vlan 1 priority 4096
SW1(config)# spanning-tree vlan 1 priority 8192

-- 결과 --
SW2# show spanning-tree vlan 1

  Root ID   Priority    4097
            Address     aabb.cc00.2000
            This bridge is the root   ← SW2로 이동

SW3:
  Et0/3     Root  FWD  100    ← SW2 직접 연결, Cost 100
  Et0/2     Altn  BLK  100    ← SW1 경유, Cost 200 → Blocking

PortFast + BPDU Guard 설정 및 트리거

PC 연결 포트에 PortFast를 적용해 STP 수렴 대기를 제거하고, BPDU Guard로 스위치 연결 시 즉시 차단한다.

SW2(config-if)# spanning-tree portfast
SW2(config-if)# spanning-tree bpduguard enable

-- BPDU Guard 발동 시 로그 --
%SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port Et0/0
with BPDU Guard enabling. Disabling port.

-- 포트 상태 --
SW2# show interfaces e0/0 status
Port    Status
Et0/0   err-disabled   ← 즉시 차단

Root Guard 설정 및 트리거

SW1 e0/2에 Root Guard를 설정 후, SW3 Priority를 0으로 낮춰 Superior BPDU를 발생시켰다.

SW1(config-if)# spanning-tree guard root

-- SW3 Priority 0 설정 후 --
SW1# show spanning-tree vlan 1
  Et0/2   BKN*100   *ROOT_Inc   ← root-inconsistent 차단

%SPANTREE-2-ROOTGUARD_BLOCK: Root guard blocking port Ethernet0/2 on VLAN0001.

-- SW3 Priority 원복 후 자동 복구 --
%SPANTREE-2-ROOTGUARD_UNBLOCK: Root guard unblocking port Ethernet0/2 on VLAN0001.

Loop Guard 설정 및 트리거

SW3 e0/2(Blocking 포트)에 Loop Guard 설정 후, SW1에서 BPDU Filter로 BPDU 전송을 차단해 트리거했다.

SW3(config-if)# spanning-tree guard loop

-- SW1 e0/2에 BPDU Filter 적용 후 --
SW3# show spanning-tree vlan 1
  Et0/2   BKN*100   *LOOP_Inc   ← loop-inconsistent 차단

%SPANTREE-2-LOOPGUARD_BLOCK: Loop guard blocking port Ethernet0/2 on VLAN0001.

-- BPDU Filter 제거 후 자동 복구 --
%SPANTREE-2-LOOPGUARD_UNBLOCK: Loop guard unblocking port Ethernet0/2 on VLAN0001.

RSTP 수렴 시간 확인

SW1-SW2 링크를 shutdown 후 no shutdown으로 복구했을 때 약 2초 안에 수렴 완료됐다.

06:44:51 → 링크 UP
06:44:52 → Line protocol UP
06:44:53 → Root Guard UNBLOCK (수렴 완료)
→ 총 2초 이내 수렴 (STP였다면 30초)

삽질 기록

삽질 1 — BPDU Guard 테스트를 PC로 했다

상황 PortFast + BPDU Guard 설정 후, VPC가 연결된 포트에서 err-disabled 발생을 확인하려 했다.
실제 아무 반응 없음. BPDU Guard가 동작하지 않았다.
원인 BPDU Guard는 BPDU를 수신할 때 발동한다. VPC(PC)는 BPDU를 보내지 않는다. 스위치를 연결해야 BPDU가 발생한다.
교훈 BPDU Guard 테스트는 반드시 스위치를 연결해야 한다. 처음 토폴로지 설계 단계에서 테스트 장비까지 고려해야 한다.

삽질 2 — err-disabled 복구 시 원인 제거 없이 포트만 올렸다

상황 BPDU Guard로 err-disabled된 포트를 shutdown → no shutdown으로 복구 시도했다.
실제 포트를 올리자마자 다시 err-disabled로 떨어졌다.
원인 SW4(스위치)가 여전히 연결된 상태에서 BPDU를 계속 보내고 있었다. 원인이 살아있는 채로 포트만 올린 것이다.
교훈 err-disabled 복구 전 반드시 원인을 먼저 제거해야 한다. 운영 환경에서도 동일하다. 원인 확인 없이 포트만 올리면 같은 상황이 반복된다.

면접 포인트

Q. Root Bridge 선출 과정을 설명하고, Priority를 설정하지 않으면 어떤 문제가 생기나?
Bridge ID(Priority + MAC)가 가장 낮은 스위치가 Root Bridge로 선출됩니다. Priority 기본값이 32768로 동일하면 MAC 주소가 낮은 스위치가 선출됩니다. 문제는 MAC 주소는 제조 순서에 따라 결정되기 때문에, 관리자가 의도하지 않은 장비가 Root가 될 수 있습니다. Core 스위치가 아닌 Access 스위치가 Root가 되면 트래픽 경로가 비효율적으로 우회되고, 네트워크 성능이 저하됩니다. Root Bridge는 반드시 Core 스위치에 Priority를 낮게 설정해 고정해야 합니다.
Q. RSTP가 STP보다 빠른 이유는?
STP는 포트 상태 전이 시 Listening(15초), Learning(15초) 타이머를 반드시 기다려야 해서 최소 30초가 소요됩니다. RSTP는 타이머 대신 이웃 스위치와 Proposal/Agreement 협상으로 대체합니다. "나 Root야, 너 포트 올려도 돼?"라는 협상이 완료되면 즉시 Forwarding으로 전환하기 때문에 1~2초 안에 수렴됩니다. 또한 포트 상태를 Discarding/Learning/Forwarding 3단계로 단순화했습니다.
Q. Root Guard와 Loop Guard의 차이는? 각각 어디에 적용하나?
Root Guard는 설계상 Root Bridge가 나타나면 안 되는 포트(Designated 포트)에 적용합니다. Superior BPDU가 수신되면 root-inconsistent 상태로 차단하고, BPDU가 사라지면 자동 복구됩니다. 외부 스위치가 연결되어 Root를 탈취하는 상황을 막습니다. Loop Guard는 Blocking 포트에 적용합니다. Blocking 포트는 BPDU를 받고 있기 때문에 차단 상태를 유지하는데, 단방향 링크 장애로 BPDU가 갑자기 안 오면 Forwarding으로 올라가 루프가 생깁니다. Loop Guard는 이 상황에서 Forwarding 대신 loop-inconsistent로 차단하고, BPDU가 다시 오면 자동 복구됩니다.