네트워크, 보안

스위칭 - STP (Spanning Tree Protocol) #2

daengsik 2022. 1. 18. 11:53

이전 포스팅에서 설명드렸다시피 STP도 종류가 다양합니다. 이번 포스팅에서는 분량 문제로 미처 다루지 못했던 PVST, RSTP, MSTP등의 동작과 설정에 대해 알아보도록 하겠습니다.

내용이 방대해서 잘 정돈되지 않은 부분도 많으니 질문주신다면 아는 선에서 답변해 드리겠습니다.

 

 

STP 종류

표준 명칭 기능
Cisco 전용 프로토콜 PVST
(per-VLAN Spanning Tree)
- ISL 트렁킹 프로토콜을 사용하는 경우에 지원.
- VLAN별로 STP가 따로 동작함.
- 백본패스트, 업링크패스트, 포트패스트등이 포함.
PVST+ - ISL 및 802.1Q 트렁킹 프로토콜을 지원.
- BPDU Guard 및 Root Guard 지원.
Rapid PVST+ - 802.1D보다 수렴이 빠름.
- IEEE 802.1w 기반.
IEEE 표준 프로토콜 RSTP
(Rapid Spanning Tree Protocol)
- 802.1D보다 수렴이 빠름.
- Cisco 전용 프로토콜 확장
MSTP
(Multiple Spanning Tree Protocol)
- 다수의 VLAN을 동일한 STP로 묶을 수 있음.


STP는 L2 이중화 구성에서 발생하는 루핑 이슈를 막기위해 개발된 프로토콜입니다. 그런데 서비스의 연속성을 위해서 이중화까지 해뒀는데, STP 때문에 발생하는 Down Time이 30초, 50초나 된다는건 요즘같은 세상에서는 용납이 불가능합니다.

네이버로 접속하려 했는데 1초, 2초정도 늦어지는 거라면 모르겠지만 30초~50초간 접속이 안된다면 아 이거 컴퓨터가 왜이래? 라는 생각이 들지 않을까요? 심지어 중요한 데이터를 다루는 관공서, 은행과 같은 경우들은 큰 문제가 발생할 가능성도 존재합니다.

그래서 STP는 많은 개선들이 이뤄졌고 Down Time을 줄이기 위해 고속화 역시 많이 이뤄졌습니다. 크게 Cisco 전용 프로토콜과 표준 프로토콜로 분류 가능하고 실제로도 CST(Common Spanning-Tree)보다는 PVST+, RSTP와 같은 확장 프로토콜들이 주로 사용되고 있으므로 잘 알아두셔야 하겠습니다.

 

Cisco 전용 프로토콜 - PVST

per-VLAN Spanning Tree 라는 명칭에 맞게 VLAN별로 STP를 지정해줄 수 있는 프로토콜입니다. STP는 물리적 구성만으로 스패닝 트리를 구축하는데 VLAN은 논리적으로 분리되어 있는 브로드캐스트 도메인입니다. 따라서 STP 구성이 부적절한 경우가 발생할 수 있습니다. 다음 예시를 한번 보겠습니다.

 


이러한 구성이 굉장히 흔한 구성이라고 말씀드렸었습니다. 이 구성에서 단일 STP가 돌아간다면 대충 오른쪽과 같은 구성이 될텐데, BLK 된 포트로는 BPDU 만 주고받고 데이터는 전달되지 않습니다. 따라서 하단의 PC가 통신한다고 가정했을 때 모든 트래픽이 B/B #1 로 집중됩니다.

 


이경우 트래픽이 많다면 오히려 백본 1번기가 처리하기 부담스러운 상황이 발생하여 속도가 느려지는 역효과가 발생할 수 있습니다. 두 장비 모두 활용할 수 있는 방법으로 VLAN마다 STP를 따로 돌려준다면 아래와 같은 방법이 가능해질겁니다.

 


이렇게 VLAN별로 STP를 따로 구성함으로써 모든 자원을 효율적으로 사용할 수 있게 합니다. 이 경우 Bridge ID는 아래와 같이 구성됩니다.

 


이전 글에서 Root를 선발하기 위한 BID의 Priority 기본값이 32768 이라고 설명드렸습니다. STP가 돌아가더라도 65535까지 우선순위를 정할 필요가 있을까요? 그정도의 네트워크는 존재하지 않고 필요하지도 않으니 해당 필드를 나누어서 사용하여 VLAN을 구분할 수 있게 되겠습니다.

그래서 실질적인 우선순위는 4비트만을 사용하는데 VLAN을 나타내는 12비트가 뒤따라오기 때문에 4096을 기준으로 X2 하여 계산하여야 합니다. 즉, 기본값인 32768은 Priority 8을 나타내며 Priority와 VLAN을 더한것이 ID가 됩니다.

그러나 자원을 효율적으로 쓰던말던 Down Time이 개선되지 않으면 쓸 이유가 없습니다. 업링크패스트, 백본패스트, 포트패스트는 뭔가 빨라질것 같은 이름입니다. 쉽게 말하자면 연결된 각 링크의 용도를 명확히 규정하여 포트의 상태(청취, 학습, 전송)간 Convergence Time을 단축시키는 방법입니다.

 

포트패스트(Port-fast)


스위치는 모든 포트가 연결되면 LSN(15초) → LRN(15초) 상태를 거친 다음 FWD 상태가 됩니다. 하지만 이 그림에서 PC가 추가되더라도 End-Device 이므로 루프가 발생하지 않는 구간입니다. 포트패스트는 이러한 End-Device에 설정하면 LSN, LRN을 건너뛰고 바로 FWD 상태가 되어 30초의 Convergence Time을 단축시키는 방법입니다.

물론 End-Device가 아닌 포트에 설정하면 LSN, LRN 상태를 건너뛰므로 루핑이 발생할 수 있습니다. 유의하여 사용해야만 합니다.

Command

Switch(config)# spanning-tree portfast default		//모든 Access port에 port-fast 적용 
Switch(config)# interface [Interface] 
Switch(config-if)# spanning-tree portfast		//해당 인터페이스에 port-fast 적용 
Switch(config-if)# spanning-tree portfast turnk		//trunk 포트에 port-fast 적용

 

 

업링크패스트(Uplink-fast)


업링크는 상단으로 향하는 링크를 말합니다. 일반적으로 SW3, 4에서 SW1, 2로가는 링크들이 업링크지만 STP에서는 Root가 최상단에 위치해 있으니 Root로 향하는 링크를 말합니다. 그리고 그 중에서도 종단 스위치. 즉, Blocking 포트를 가진 스위치에서 설정하게 됩니다.

 


이 업링크가 끊겨서 SW4가 고립될시 BLK 포트는 LSN→LRN 을 거치는 30초간 통신이 단절되는데, 이 Delay를 없앱니다. BLK 포트 하나만 상태를 바꾸면 되니 사실 복잡할게 없는 작업인거죠. 다만, 무조건 종단스위치에서만 설정해야 효과가 있습니다.

업링크패스트는 내부적으로 종단스위치 Bridge ID의 Priority 값을 32768에서 49152로, 포트의 비용 역시 3000 증가시켜 종단 스위치가 Root로 지정되거나 포트가 Designated Port로 선택되지 않게 동작합니다. 또한 포트의 상태는 거의 즉각적으로 변화하더라도 MAC 테이블을 갱신하기까지 시간이 소요되어 통신이 즉시 가능하진 않습니다.

이에 더해 업링크패스트는 BLK을 FWD로 즉시 변화시키는 기능만을 수행하므로 단절된 링크를 복원했을시에는 LSN→LRN→FWD 상태를 모두 거쳐 30~35초간의 Down Time이 발생할 수밖에 없습니다.

Command

Switch(config)# spanning-tree uplinkfast //uplink-fast 적용

 

 

백본패스트(Backbone-fast)


백본패스트를 모든 스위치에 설정하게 될 경우, Root와 직접 연결된 링크가 단절되어 후순위 BPDU가 발생할 시 후순위 BPDU를 10번 수신하며 Root Bridge가 정말 Down되었는지 확인하는 20초(BPDU 전송주기 2초 * 10회)를 단축시킵니다.

 


그리고 이 경우는 후순위 BPDU를 받는 즉시 포트를 청취(LSN) 상태로 전환한다는 것이지 모든 포트를 즉시 FWD 상태로 바꾸는 것이 아닙니다. 즉 Max-age 20초만 단축할뿐 LSN→LRN 의 30초는 단축하지 못합니다.

Command

Switch(config)# spanning-tree backbonefast //backbone-fast 적용

 

 

Cisco 전용 프로토콜 - PVST+

그러면 PVST와 PVST+ 의 차이는 뭘까요? 잘 모르겠지만 PVST+가 조금 더 좋은것 같긴 합니다. +가 붙었으니까요. 그리고 VLAN 이 등장하면 항상 Trunking이 떠오르셔야 합니다. 여기서 PVST와 PVST+의 차이가 드러납니다.

PVST는 Cisco 독점 트렁킹 프로토콜인 ISL 만을 지원합니다. 그런데 아시다시피 ISL은 잘 안쓰는 프로토콜이죠. 다들 802.1Q를 쓰는데 Cisco에서 그걸 지원 안해주면 PVST 같은 좋은걸 만들어도 쓸모가 없습니다. 그래서 802.1Q를 지원하는 PVST+를 다시 만들어 내놓은거죠. 만드는김에 BPDU Guard, Root Guard 라는 보호/조정 기술까지 추가시켜서요.

하나씩 알아보겠습니다.

 

BPDU Guard

BPDU Guard는 이 기능을 활성화시킨 포트로 BPDU를 수신하면 그 즉시 해당 포트를 비활성화 시키는 기능입니다. 왜 이런 기능이 필요할지 생각해봅시다. BPDU는 장비간에 주고받는 데이터입니다. BPDU를 영원히 받을 일이 없는 쪽이 어디죠?

 


서버, PC와 같은 End-Device 쪽입니다. End-Device 방향에서 BPDU를 수신하게 되면 STP 관련 해킹 공격을 받고 있다는 사실을 알수 있게 되겠죠. 따라서 포트패스트처럼 BPDU Guard 를 걸어놓아 보안을 확보할 수 있습니다. 또한 BPDU를 수신하여 Shutdown 된 포트는 관리자가 no shutdown 명령어를 입력하기 전까지 복구되지 않습니다.

Command

Switch(config-if)# spanning-tree bpduguard enable	//port-fast 가 적용된 포트에서 bpdu guard 활성화 
Switch# show ip interface brief				//interface 상태 확인 
Switch# show interfaces status err-disabled		//err-disable 인터페이스와 발생원인 확인

 

 

Root Guard

루트 가드는 특정한 포트에 접속된 스위치들은 Root가 될 수 없게 차단하는 기능입니다. 이 기능은 새로운 장비가 네트워크에 추가되거나, 다른 장비를 설정하다가 원하지 않는 스위치가 Root가 되어 네트워크에 영향을 끼치는 것을 예방하기 위해 사용됩니다.

 

Command

Switch(config-if)# spanning-tree guard root //root-guard 적용

 

 

RSTP, Rapid PVST+

Rapid.. 뭔가 빨라졌습니다. 포트패스트, 백본패스트 등을 사용해도 Convergence Time 단축에 한계가 있었는데, RSTP는 기존 STP와 호환성도 유지하면서 획기적인 Convergence Time 단축이 가능합니다.

기본적으로 CST와 기본적인 루트 선정 방식, 포트활성화 여부가 동일하지만, 포트 상태나 역할에 차이점이 있습니다. 다음 예시를 하나 보고, 각 상태와 종류, 명칭에 대해 파악하시기 바랍니다.

 

 

포트상태

STP RSTP BPDU 수신 BPDU 송신 MAC 학습 데이터 전송
Blocking Discarding O X X X
Listening Discarding O X X X
Learning Learning O O O X
Forwarding Forwarding O O O O
Disabled Discarding X X X X

 

포트역할

포트 기능
Root Port STP와 동일, Configuration BPDU를 수신하며 데이터 전송이 가능.
Designated Port STP와 동일, Configuration BPDU를 송수신하며 데이터 전송이 가능.
Alternated Port RP가 Down 되었을때 역할을 이어받는 포트. 차단상태.
Backup Port DP가 Down 되었을때 역할을 이어받는 포트. 차단상태.
Disable 역할이 없는 포트. 고장 또는 포트의 Disable, 인터페이스 Shutdown등의 비활성 상태.

 

RSTP 링크 종류

Port의 Duplex 모드에 따라 링크를 나눕니다.

  • Point to Point Link : Full Duplex로 동작하는 포트.
  • Shared Link : Half Duplex로 동작하는 포트.

이후 장비 설정과 종류에 따라서 Link, Edge, Peer로 나눕니다.

  • Link : RSTP로 동작하는 Switch가 연결된 포트.
  • Edge : BPDU를 발생시키지 않는 PC, Server같은 End Device가 연결된 포트. 포트패스트와 동일.
  • Peer : RSTP로 동작하지 않고 다른 프로토콜을 사용하는 Switch가 연결된 포트.

 

경로비용

고속화가 많이 이루어진 요즘에는 1Gbps, 10Gbps 이상 규격에 대한 경로값들이 필요해졌기 때문에 아래 표와 같은 방식으로 경로값을 산출합니다.

속도 (Bandwidth) 경로값 (path cost)
10 Mbps (Ethernet) 2,000,000
100 Mbps (Fast Ethernet) 200,000
1 Gbps (Gigabit Ethernet) 20,000
10 Gbps 2,000
100 Gbps 200

 

동작방식

그래서, 이 RSTP가 도대체 뭘 하길래 Convergence Time이 단축될 수 있었는지 알아보겠습니다.

 


STP가 포트의 역할을 결정하기 위해 BPDU를 보고 Root Port, Designated Port, Alternated Port를 차례로 골라내는것과 달리 RSTP는 BPDU를 비교하여 역할을 제안하고 동의하는 협상과정만이 존재합니다.

STP와 동일한 예시로 동작과정을 한번 살펴보겠습니다.

 


Root 선출기준은 동일합니다. SW1이 Root가 됩니다. 그러면 Root 스위치부터 자신이 DP라는 제안을 시작하고, 하위 노드는 루핑을 막기위해 Root의 BPDU를 확인하는동안 잠시 다른 포트를 BLK 시킵니다.

 


Root의 BPDU가 자신의 것보다 더 좋으니 SW2, SW3은 제안을 수락하는 응답을 보냅니다. Root는 수락을 확인하는 즉시 포트상태를 DP, RP로 변경하고 기존 STP에서 청취(LSN) → 학습(LRN) 과정을 생략한 후 바로 FWD 상태로 설정합니다.

이 과정은 기존 STP에서 FWD 상태가 되기까지 30초가 소요되었던 것과 달리 몇초 이내에 거의 즉각적으로 수행됩니다.

 


이후 SW3, SW4는 다시 하위 노드로 제안을 보내고, SW4는 BPDU를 확인하고 더 좋은 BPDU(여기서는 SW2의 MAC Address 가 더 낮으므로 우선순위가 높음.) 쪽으로 응답을 보냅니다.

 


이후 SW3은 30초간 제안을 보내지만, SW4는 RP를 이미 갖고 있으니 응답하지 않습니다. 그러면 SW3은 그냥 FWD 상태로 전환시켜버립니다. 어차피 이 세그먼트는 Block 되는 회선이므로 Convergence Time에는 영향을 끼치지 않습니다.

 



장애 발생이나 토폴로지 변경시에도 마찬가지로 동작합니다. 기존 STP에서는 TCN BPDU를 주고받아 Root가 역할 재분배를 명령했다면, RSTP에서는 하위 노드에서 제안, 동의의 과정만으로 역할이 즉시 변경되어 FWD 상태로 진입하므로 Convergence Time이 매우 단축됩니다.

아래 직, 간접링크 장애시 동작방식을 확인하시기 바랍니다.

 

STP 직접링크 장애

 

 

RSTP 직접링크 장애

 

 

STP 간접링크 장애

 

 

RSTP 간접링크 장애

 

 

토폴로지 변경 전파방식

 

STP는 TCN BPDU를 Root가 수신하고 TC 플래그를 설정하는 방식이었다면 RSTP는 아래와 같이 Root에게 변경을 알리지 않고 변경을 수신하는 MAC 주소를 제외하고 모든 포트에서 MAC 주소를 지운 다음 모든 DP, RP에 BPDU를 전송하여 TCN을 플러딩하므로 기존보다 빠른 속도로 변경사항을 전파할 수 있습니다.

 

 

 

RSTP Header Format

STP와 호환을 유지하기 위해 거의 비슷한 Header를 가지지만, Flag 필드의 1Byte를 기존에는 TCN, TCA 확인만을 위해 사용했다면 RSTP는 모든 Flags bit 를 활용합니다. Header의 상세한 내용은 링크를 참조하시기 바랍니다.

 

 LINK  Cisco BPDU, IEEE BPDU 및 BPDU 다이어그램 전체보기

 

Command

Switch(config)# spanning-tree mode rapid-pvst

 

 

MSTP

MSTP는 PVST의 부하를 줄이기 위해 생겨났습니다. 예를들어 PVST가 동작중인 네트워크에 VLAN이 수백개가 존재한다면 2초마다 발생하는 BPDU 역시 수백개가 되니 많은 부하가 생겨날겁니다.

그래서 이 VLAN을 다시 묶어 그룹별로 Spanning Tree를 동작시켜 부하를 줄이는 것이 MSTP입니다. 이 때 묶는 그룹을 Instance 라고 하며, Instance 당 1개의 STP를 동작시킵니다.

나눴다 묶었다 헷갈리기 쉽지만 PVST는 기본적으로 동작하는 프로토콜이니 MSTP 명령어들만 잘 기억해 두신다면 상황에 따라 요긴하게 쓸 수 있습니다.

Command

MSTP 설정

Switch(config)# spanning-tree mode mst 				//stp mode 설정 
Switch(config)# spanning-tree mst configuration 		//mstp 설정 모드 
Switch(config-mst)# name [NAME] 				//mstp 영역 이름 설정 
Switch(config-mst)# instance [number] vlan [vlan_id - vlan_id]	//instance화 시킬 vlan 
Switch(config-mst)# revision [0-65535] 				//instance 매핑 번호 설정

 

MSTP 확인

Switch# show spanning-tree mst configuration	//mst 설정 확인 
Switch# show spanning-tree mst			//mst 정보 확인 
Switch# show current				//동작중인 mst 설정값 확인 
Switch# show pending				//방금 설정한 mst 설정값 확인