이 글은 2021년 7월 기준 기록입니다.
STP는 루프를 막아 주지만 그 대가로 시간을 씁니다. 포트 하나가 살아나기까지 청취 15초, 학습 15초를 기다리게 만드는 프로토콜입니다. 그래서 STP를 실제 망에 올릴 때는 두 가지 작업이 따라붙습니다. 이 시간을 줄이는 조정과, 잘못된 연결이 루프를 만들지 못하게 하는 보호입니다.
컨버전스 시간은 토폴로지 변화가 일어났을 때 이를 반영하여 네트워크가 재구성될 때까지 소요되는 시간입니다. 이를 줄이는 수단으로 포트 패스트, 업링크 패스트, 백본 패스트, 그리고 스패닝 트리 타이머 조정이 있습니다. 보호 쪽으로는 BPDU 가드, BPDU 필터링, 루프 가드, UDLD, 루트 가드가 있습니다.
종단 장치가 붙은 포트는 기다릴 이유가 없다
포트 패스트(portfast) 는 포트가 활성화되면 청취·학습을 건너뛰고 바로 전송 상태가 되게 합니다. PC나 서버 같은 종단 장치와 연결된 포트에 많이 설정합니다. 종단 장치는 BPDU를 보내지 않으므로 루프를 만들 가능성이 없기 때문입니다.
먼저 스위치를 STP 모드로 작동시킵니다.
// 스위치의 모든 액세스 포트에 포트 패스트 설정
// 스위치를 STP 모드로 작동
SW1(config)#spanning-tree mode pvst
SW2(config)#spanning-tree mode pvst
SW3(config)#spanning-tree mode pvst
상태 전이를 눈으로 보기 위해 이벤트 디버깅을 켭니다.
// SW3에서 STP 관련 이벤트를 디버깅
SW3#debug spanning-tree events
Spanning Tree event debugging is on
포트 패스트를 걸기 전의 동작을 먼저 확인합니다. 인터페이스를 내렸다 올리면 로그에 상태 전이가 그대로 찍힙니다.
// 라우터와 연결된 인터페이스를 셧다운 후 활성화
SW3(config)#int e1/0
SW3(config-if)#sh
SW3(config-if)#no sh
Jan 20 06:09:12.587: STP: VLAN0001 Et1/0 -> listening
*Jan 20 06:09:27.590: STP: VLAN0001 Et1/0 -> learning
*Jan 20 06:09:42.597: STP: VLAN0001 Et1/0 -> forwarding
06:09:12에 청취, 15초 뒤 학습, 다시 15초 뒤 전송입니다. 포트 패스트가 없애는 것이 바로 이 30초입니다.
// 포트패스트 설정
SW3(config)#spanning-tree portfast default
// 포트패스트 확인
SW3(config)#int e1/0
SW3(config-if)#sh
SW3(config-if)#no sh
Jan 20 06:14:26.217: STP: VLAN0001 Et1/0 ->jump to forwarding from blocking
중간 단계 없이 곧바로 전송 상태로 뜁니다.
다만 전역 설정으로 거는 방식은 주의가 필요합니다. 최근에는 스위치 간 링크에도 가능하면 액세스 포트를 많이 사용하므로, 전체 설정 모드에서 포트 패스트를 설정하는 방식은 가능하면 사용하지 않는 것이 좋습니다. 스위치가 붙은 포트에까지 포트 패스트가 걸리면 루프를 만들 수 있기 때문입니다.
특정 포트에만 거는 편이 안전합니다.
// 특정 액세스 포트에 포트 패스트 설정
SW3(config)#no spanning-tree portfast default
SW3(config)#int e1/0
SW3(config-if)#spanning-tree portfast
기본적으로 포트 패스트는 액세스 포트에서만 작동합니다. 트렁크 모드에서 쓰려면 명시해야 합니다.
// 트렁크 모드에서 포트 패스트 설정
SW3(config-if)#spanning-tree portfast trunk
직접 연결된 링크가 끊기면 업링크 패스트가 받는다
업링크 패스트(uplinkfast) 는 직접 연결된 링크가 다운되었을 때 차단 상태의 포트를 즉시 전송 상태로 변경해 30초를 아낍니다. 차단된 포트가 있는 종단 스위치에서 설정해야 합니다.
// 업링크 패스트 설정
SW3(config)#spanning-tree uplinkfast
*Jan 20 06:43:48.921: setting bridge id (which=1) prio 49153 prio cfg 49152 sysid 1 (on) id C001.aabb.cc00.0300
로그에서 보이듯 업링크 패스트를 설정하면 해당 스위치를 종단 스위치로 만들기 위해 우선순위를 49152로 변경합니다. 이 부작용이 중요합니다. spanning-tree vlan root 또는 spanning-tree vlan priority를 사용하여 조정하지 않은 루트 스위치에서 업링크 패스트를 설정하면 그 스위치가 종단 스위치로 바뀌어 버리므로 주의해야 합니다.
동작 확인은 링크를 내려 보면 됩니다.
// 업링크 패스트 확인
SW3(config)#int e0/0
SW3(config-if)#sh
*Jan 20 06:46:57.255: %SPANTREE_FAST-7-PORT_FWD_UPLINK: VLAN0001 Ethernet0/1 moved to Forwarding (UplinkFast).
e0/0을 내리자 차단 상태였던 e0/1이 곧바로 전송 상태로 올라옵니다.
멀리서 끊긴 링크는 백본 패스트가 처리한다
업링크 패스트가 못 잡는 경우가 있습니다. 다운된 링크가 자신에게 직접 붙어 있지 않은 경우입니다. 백본 패스트(backbone fast) 는 직접 연결되지 않은 간접 링크가 다운되었을 때, 차단 상태의 포트에서 맥스 에이지를 생략하고 청취 상태로 변경해 20초를 아낍니다.
설정 전 상태를 먼저 봅니다. SW2의 포트를 내립니다.
// 백본 패스트 설정 전 확인
SW2(config)#int e0/0
SW2(config-if)#sh
SW3#
*Jan 20 06:54:05.295: STP: VLAN0001 heard root 4097-...
*Jan 20 06:54:07.078: STP: VLAN0001 heard root 4097-...
*Jan 20 06:54:09.084: STP: VLAN0001 heard root 4097-...
*Jan 20 06:54:11.090: STP: VLAN0001 heard root 4097-...
*Jan 20 06:54:13.090: STP: VLAN0001 heard root 4097-...
*Jan 20 06:54:15.099: STP: VLAN0001 heard root 4097-...
*Jan 20 06:54:17.107: STP: VLAN0001 heard root 4097-...
*Jan 20 06:54:19.111: STP: VLAN0001 heard root 4097-...
*Jan 20 06:54:21.114: STP: VLAN0001 heard root 4097-...
*Jan 20 06:54:23.121: STP: VLAN0001 heard root 4097-...
*Jan 20 06:54:23.291: STP: VLAN0001 Et0/1 -> listening
06:54:05부터 06:54:23까지 후순위 BPDU를 계속 받기만 하다가 마지막에야 청취 상태로 넘어갑니다. 이 기다림이 맥스 에이지입니다.
백본 패스트는 모든 스위치에서 설정해야 합니다. 한 대라도 빠지면 동작하지 않습니다.
// 백본 패스트 설정
SW1(config)#spanning-tree backbonefast
SW2(config)#spanning-tree backbonefast
SW3(config)#spanning-tree backbonefast
같은 상황을 다시 만들어 봅니다.
// 백본 패스트 테스트
SW2(config)#int e0/0
SW2(config-if)#sh
SW2(config-if)#
*Jan 20 06:59:15.767: %LINK-5-CHANGED: Interface Ethernet0/0, changed state to administratively down
SW3(config)#
*Jan 20 06:59:14.532: STP: VLAN0001 heard root 4097-...
*Jan 20 06:59:14.538: STP: VLAN0001 Et0/1 -> listening
후순위 BPDU를 한 번 듣고 6밀리초 만에 청취 상태로 넘어갑니다. 20초가 사라졌습니다.
세 가지 패스트 기술을 정리하면 다음과 같습니다.
| 모드 | 설정 위치 | 명령어 | 효과 |
|---|---|---|---|
| 포트패스트 | 인터페이스 | spanning-tree portfast |
즉시 전송상태, 30초 |
| 업링크패스트 | 액세스 스위치 | spanning-tree uplinkfast |
즉시 전송상태, 30초 |
| 백본패스트 | 모든 스위치 | spanning-tree backbonefast |
맥스에이지 생략 |
타이머는 손대기 쉽지만 손대면 위험하다
헬로 시간, 맥스 에이지, 전송 지연시간을 직접 조정하는 방법도 있습니다. 다만 마음대로 조정할 경우 레이어2 루프가 발생할 가능성이 큽니다.
기본값은 다이아미터가 7인 경우를 가정한 것으로 헬로 2초, 맥스 에이지 20초, 전송 지연시간 15초입니다. 여기서 네트워크 다이아미터(diameter) 는 스위치 네트워크에서 가장 멀리 떨어진 스위치의 수량을 말하며, 이 값에 따라 자동으로 헬로 시간, 맥스 에이지, 전송 지연시간이 결정됩니다.
타이머 값은 루트 스위치에서 지정된 값이 사용되므로 반드시 루트 스위치에서 조정해야 합니다. 다른 스위치에서 아무리 바꿔도 반영되지 않습니다.
// 헬로 타이머 조정
SW1(config)#spanning-tree vlan 1 hello-time 1
// 맥스 에이지 조정
SW1(config)#spanning-tree vlan 1 max-age 15
// 전송 지연시간 조정
SW1(config)#spanning-tree vlan 1 forward-time 10
// 스패닝 트리 타이머 확인
SW1#sh spanning-tree vlan 1
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 1
Address aabb.cc00.0100
This bridge is the root
Hello Time 1 sec Max Age 15 sec Forward Delay 10 sec
BPDU 가드는 오지 말아야 할 곳에 온 BPDU를 막는다
여기서부터는 보호 기술입니다.
BPDU 가드(bpdu guard) 는 포트를 통해 BPDU를 수신했을 때 해당 포트를 자동으로 다운시킵니다. 다시 활성화하려면 관리자가 해당 포트에서 sh 후 no sh를 해야 합니다.
종단 장치와 연결된 포트에 주로 사용합니다. 종단 장치에서 BPDU를 수신한다는 것은 무단으로 스위치를 연결했거나 공격 시도가 있음을 의미하기 때문입니다.
전체 설정 모드에서 걸면 포트 패스트가 적용된 포트에만 작동합니다.
// 전체 설정모드에서, 포트 패스트 적용된 포트만 작동
spanning-tree portfast bpduguard default
// 특정 포트에서,
spanning-tree bpduguard enable
BPDU를 내보내기만 하는 포트에 걸면 아무 일도 일어나지 않습니다.
// SW2에서 BPDU를 내보내는 포트에 설정해보기
SW2(config)#int e0/0
SW2(config-if)#spanning-tree bpduguard enable
SW2(config-if)#no spanning-tree bpduguard
BPDU를 수신하는 포트에 걸면 즉시 포트가 내려갑니다.
// SW3에서 BPDU를 수신하는 대체포트에 설정해보기
SW3(config)#int e0/1
SW3(config-if)#spanning-tree bpduguard enable
SW3(config-if)#
// BPDU를 수신해서 포트가 비활성되는 내용
*Jan 21 01:07:31.673: %SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port Et0/1 with BPDU Guard enabled. Disabling port.
SW3(config-if)#
*Jan 21 01:07:31.673: %PM-4-ERR_DISABLE: bpduguard error detected on Et0/1, putting Et0/1 in err-disable state
SW3(config-if)#
*Jan 21 01:07:32.681: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/1, changed state to down
SW3(config-if)#
*Jan 21 01:07:33.673: %LINK-3-UPDOWN: Interface Ethernet0/1, changed state to down
포트의 상태는 err-disabled로 남습니다.
// 인터페이스 상태에서 err-disabled를 확인할 수 있음
SW3#sh int e0/1
Ethernet0/1 is down, line protocol is down (err-disabled)
Hardware is AmdP2, address is aabb.cc00.0110 (bia aabb.cc00.0110)
원인까지 함께 보려면 목록으로 확인합니다.
// err-disabled 된 인터페이스 목록
SW3# sh int status err-disabled
Port Name Status Reason Err-disabled Vlans
Et0/1 err-disabled bpduguard
복구는 설정을 풀고 포트를 내렸다 올립니다.
// SW3에서 bpduguard 해제하고 다시 활성화
SW3(config)#int e0/1
SW3(config-if)#no spanning-tree bpduguard
SW3(config-if)#sh
SW3(config-if)#no sh
매번 손으로 살리는 대신 자동 복구를 걸어 둘 수도 있습니다.
// bpduguard에 의해서 발생한 err-disable 상태를 복구(300초)
SW3(config)#errdisable recovery cause bpduguard
// err-disable 복구 시간 조정
SW3(config)#errdisable recovery interval ?
<30-86400> timer-interval(sec)
BPDU 필터링은 편하지만 루프를 열어 둘 수 있다
BPDU 필터링(bpdu filtering) 은 특정 포트로 BPDU를 내보내거나 받지 않게 하는 기능입니다. BPDU를 송신하지 않음으로써 접속된 종단 장치에 불필요한 부하가 걸리는 것을 방지합니다.
거는 위치에 따라 성격이 크게 달라집니다.
// 전체 설정에서, 포트 패스트 적용된 포트에만 설정
spanning-tree portfast bpdufilter default
전체 설정 모드에서 설정하면 해당 포트로 BPDU를 수신할 경우 설정이 해제됩니다. 즉 스위치가 붙으면 알아서 필터링을 포기하므로 비교적 안전합니다.
// 특정 포트에서,
spanning-tree bpdufilter enable
반면 특정 포트에 설정하면 BPDU 송수신을 모두 하지 않으므로 레이어2 루프가 발생할 수 있습니다. 차단 포트에 걸어 보면 무슨 일이 벌어지는지 보입니다.
// SW3의 차단 포트에 BPDU 필터링 설정해보기
SW3(config)#int e0/1
SW3(config-if)#spanning-tree bpdufilter enable
SW3(config-if)#
BPDU가 끊긴 차단 포트는 맥스 에이지가 지나면 "상대가 없다"고 판단하고 열리기 시작합니다.
// 맥스 에이지가 지난 후 청취 상태로 변경
*Jan 21 01:30:29.847: STP: VLAN0001 Et0/1 -> listening
SW3(config-if)#
*Jan 21 01:30:44.852: STP: VLAN0001 Et0/1 -> learning
SW3(config-if)#
*Jan 21 01:30:59.857: STP[1]: Generating TC trap for port Ethernet0/1
*Jan 21 01:30:59.857: STP: VLAN0001 sent Topology Change Notice on Et0/0
*Jan 21 01:30:59.857: STP: VLAN0001 Et0/1 -> forwarding
결과적으로 막혀 있어야 할 포트가 전송 상태가 됩니다.
// 스패닝 트리 상태 확인
SW3(config-if)#do sh span vlan 1
...
Interface Role Sts Cost Prio.Nbr Type
Et0/0 Root FWD 3100 128.1 Shr
Et0/1 Desg FWD 3100 128.2 Shr
Et1/0 Desg FWD 3100 128.5 Shr Edge
확인이 끝났으면 되돌립니다.
// BPDU 필터링 해제
SW3(config)#int e0/1
SW3(config-if)#no span bpduf
루프 가드는 BPDU가 끊긴 차단 포트를 그대로 잡아 둔다
바로 위에서 본 상황 — 차단 포트가 BPDU를 못 받아 스스로 열리는 것 — 을 막는 기능이 루프 가드(loop guard) 입니다.
차단 상태에 있는 포트가 BPDU를 수신하지 못하면 청취 상태로 변경되는 것을 방지합니다. 이 경우 해당 포트는 비일관 상태로 변경되고, 다시 BPDU를 수신하면 차단 상태로 돌아갑니다. 후순위 BPDU를 수신하는 경우에는 정상적으로 청취 상태로 변경됩니다. 즉 "상대가 말을 안 한다"와 "상대가 다른 말을 한다"를 구분해서 처리합니다.
// 특정 포트에서, 차단상태의 포트에 대해 적용
spanning-tree guard loop
설정은 포트별로 하지만 작동은 VLAN별로 합니다. 각 VLAN마다 차단된 포트가 다를 수 있으므로 전체 포트에 대해서 적용하는 것이 편합니다.
// 전체 설정모드에서,
spanning-tree loopguard default
// 차단 포트가 있는 SW3에 루프 가드 설정
SW3(config)#spanning-tree loopguard default
// 특정 포트에서,
spanning-tree guard loop
// SW3에 루프 가드 설정
SW3(config-if)#spanning-tree guard loop
동작을 확인하려면 상대 스위치에서 BPDU를 끊어 봅니다.
// SW2에서 BPDU 필터 설정해서 SW3으로 BPDU 전송 안되게 함
SW2(config)#int e0/0
SW2(config-if)#spanning-tree bpdufilter enable
// SW3에서 루프 가드 작동
SW3(config)#
*Jan 21 03:08:01.943: %SPANTREE-2-LOOPGUARD_BLOCK: Loop guard blocking port Ethernet0/1 on VLAN0001.
앞선 실습에서는 전송 상태로 열렸던 포트가 이번에는 막힌 채로 유지됩니다.
UDLD는 케이블을, 루프 가드는 상대 스위치를 본다
UDLD(unidirectional link detection) 는 스위치 간에 단방향 링크가 생겼을 때 해당 포트를 비활성화합니다. 주기적으로 송신 포트를 통하여 UDLD 패킷을 전송하고, 이 패킷을 수신한 상대 포트는 이것을 다시 자신의 송신 포트를 통해 상대에게 반향(echo)시켜 줌으로써 양방향 링크가 동작 중인 것을 확인합니다.
루프 가드와 역할이 겹쳐 보이지만 감지하는 대상이 다릅니다. UDLD는 케이블링이 잘못된 것을 감지하고, 루프 가드는 상대 스위치가 잘못 작동 중인 것을 감지합니다. 작동 단위도 달라서 UDLD는 포트별로, 루프 가드는 각 포트에 대해 VLAN별로 작동합니다. 그래서 UDLD와 루프 가드를 같이 적용하는 것이 좋습니다.
// 전체 설정모드에서,
udld ?
SW3(config)#udld ?
// 적극 모드, 광케이블 포트와 UTP 포트 모두 적용
aggressive Enable UDLD protocol in aggressive mode on fiber ports except where locally configured
// 정상 모드, 광케이블 포트에 적용
enable Enable UDLD protocol on fiber ports except where locally configured
// UDLD 메시지 전송 간격 설정
message Set UDLD message parameters
// 특정 포트에서,
udld port [aggressive]
UDLD는 각 스위치 간에 동일하게 설정해야 합니다. 복구 방법은 여러 가지가 있어, 관리자 모드에서 udld reset을 하거나, 다운된 포트에서 sh 후 no sh를 하거나, UDLD를 해제했다가 다시 설정하면 됩니다. 자동 복구를 걸어 둘 수도 있습니다.
errdisable recovery cause udld
루트 가드는 아래쪽에서 루트가 나오는 것을 막는다
루트 가드(root guard) 는 특정 포트에 접속된 네트워크에 있는 스위치들이 루트 스위치가 될 수 없도록 설정합니다. 루트 가드가 설정된 포트에 현재 루트 스위치보다 더 우선하는 스위치 ID를 가진 BPDU를 수신하면 해당 포트를 다운시킵니다.
// 특정 포트에서
spanning-tree guard root
동작을 확인하기 위해 SW1을 루트로, SW2를 그보다 낮은 순위로 둡니다.
// 확인을 위해 SW1,2의 우선순위 조정
SW1(config)#spanning-tree vlan 1 priority 4096
SW2(config)#spanning-tree vlan 1 priority 32768
// SW1의 포트에 루트 가드 설정
SW1(config)#int range e0/0-1
SW1(config-if-range)#spanning-tree guard root
*Jan 21 02:33:05.716: %SPANTREE-2-ROOTGUARD_CONFIG_CHANGE: Root guard enabled on port Ethernet0/0.
*Jan 21 02:33:05.717: %SPANTREE-2-ROOTGUARD_CONFIG_CHANGE: Root guard enabled on port Ethernet0/1.
이제 SW2가 루트를 노리게 만들어 봅니다.
// 확인을 위해 SW2의 우선순위를 0으로 설정
SW2(config)#spanning-tree vlan 1 priority 0
// SW1에서 루트 가드가 작동
SW1(config-if-range)#
*Jan 21 02:34:02.884: %SPANTREE-2-ROOTGUARD_BLOCK: Root guard blocking port Ethernet0/1 on VLAN0001.
상태를 보면 포트가 BKN*, 사유는 *ROOT_Inc로 표시됩니다.
// SW1의 스패닝 트리 상태 확인
SW1(config-if-range)#do sh span vlan 1
...
Interface Role Sts Cost Prio.Nbr Type
Et0/0 Desg BKN*100 128.1 Shr *ROOT_Inc
Et0/1 Desg BKN*100 128.2 Shr *ROOT_Inc
SW2의 우선순위를 다시 낮추면 포트가 자동으로 풀립니다.
// 확인을 위해 SW2의 우선순위 설정
SW2(config)#spanning-tree vlan 1 priority 8192
// SW1에서 확인
*Jan 21 02:36:38.476: %SPANTREE-2-ROOTGUARD_UNBLOCK: Root guard unblocking port Ethernet0/1 on VLAN0001.
SW1(config-if-range)#do sh span vlan 1
...
Interface Role Sts Cost Prio.Nbr Type
Et0/0 Desg FWD 100 128.1 Shr
Et0/1 Desg FWD 100 128.2 Shr
포트가 자동으로 살아나지 않을 경우 해당 포트에서 sh, no sh를 합니다.
조정 기술은 STP를 빠르게 만들고, 보호 기술은 그 빨라진 STP가 잘못 판단하지 않게 붙잡습니다. 둘은 한 쌍으로 쓰입니다.
'IT·테크 > 인프라' 카테고리의 다른 글
| 종단 VLAN 구성 — 전체 스위치 네트워크에 걸친 VLAN을 STP로 나누기 (0) | 2026.08.06 |
|---|---|
| STP — 스위치 네트워크의 루프를 끊는 스패닝 트리 프로토콜 (0) | 2026.08.05 |
| 사설 VLAN(Private VLAN) — VLAN 하나 안에서 다시 격리하기 (0) | 2026.08.05 |
| VLAN과 트렁킹, VTP — 브로드캐스트 도메인을 잘라 내는 법 (0) | 2026.08.04 |
| 트랜스패런트 브리징 — 스위치가 MAC 주소 테이블로 프레임을 넘기는 규칙 (0) | 2026.08.04 |