개요
스위치 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는 루프 토폴로지에서 포트 하나를 논리적으로 차단해서 이 문제를 원천 차단한다.
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
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 Port | Forwarding | Root Bridge까지 최선 경로 포트 (Non-Root 스위치마다 1개) |
| Designated Port | Forwarding | 각 세그먼트에서 트래픽 담당 포트 |
| Alternate Port | Blocking | 루프 방지를 위해 차단된 포트 |
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 Guard | BPDU 수신 | err-disabled | 수동 | PortFast 포트 (PC 연결) |
| Root Guard | Superior BPDU 수신 | root-inconsistent | 자동 | Designated 포트 |
| Loop Guard | BPDU 수신 중단 | 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)
| 장비 | 이미지 | 연결 포트 | 비고 |
|---|---|---|---|
| SW1 | IOL L2 | e0/1(SW2), e0/2(SW3) | Priority 8192 (Backup Root) |
| SW2 | IOL L2 | e0/1(SW1), e0/3(SW3), e0/0(VPC4) | Priority 4096 (Root Bridge) |
| SW3 | IOL L2 | e0/2(SW1), e0/3(SW2), e0/0(VPC5) | Priority 32768 (기본값) |
| VPC4 | VPCS | SW2 e0/0 | - |
| VPC5 | VPCS | SW3 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로 했다
삽질 2 — err-disabled 복구 시 원인 제거 없이 포트만 올렸다
면접 포인트
'Network > Switch' 카테고리의 다른 글
| [Switch] Trunk / 802.1Q - VLAN 100개에 케이블 100개가 필요한가? (0) | 2026.03.20 |
|---|---|
| [Switch] VLAN 설계 - 케이블 없이 네트워크를 분리할 수 있는가? (0) | 2026.03.20 |
| [Switch] 스위치는 어떻게 프레임을 전달하는가? - MAC 테이블의 모든 것 (0) | 2026.03.20 |