네트워크, 보안

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

daengsik 2022. 1. 7. 09:19

L2단에서 가장 흔히 발생하는 이슈이자 장애 포인트입니다. 아무 생각 없이 네트워크를 구성했다간 STP의 쓴맛을 보게 되는 경우가 허다하고 경우에 따라 해결하기 곤란한 상황이 많이 발생하므로 설계시에 꼭 고려되어야만 하는 내용입니다.

잘 숙지하고 있어야 트러블슈팅에 문제가 없을테니 내용이 많더라도 꼭 이해하시고 실습해보시는걸 권장드립니다.

 

 

1. STP (Spanning Tree Protocol)

그래프 이론에서 Spanning Tree 는 신장 트리라고 불리는데, 간단히 요약하자면 어떠한 그래프 내의 모든 꼭짓점을 포함하는 최소 연결 부분 그래프를 말합니다.

 

웬 그래프 이론이냐... 네트워크는 사실 생각해보면 그래프와 굉장히 유사한 점들이 많고 이를 연구하여 최적화나 중심성 등의 성질들이 연구됩니다. 흥미 있으시다면 그래프 이론이나 스패닝 트리의 알고리즘을 찾아보시는것도 나쁘지 않습니다. 머리가 지끈지끈하신 분들이 계실테니 본문에서 설명하지는 않겠습니다.

 

그래서 이 신장 트리, 스패닝 트리가 도대체 뭐냐?

 

 

왼쪽이 원래의 그래프, 오른쪽의 모든 것들이 스패닝 트리입니다. 뭔가 경우의 수가 많은데, 스패닝 트리에서 초점을 두셔야 할 부분은 다음과 같습니다.

 

  1. 모든 노드가 연결된 상태이다.
  2. 간선(링크) 의 개수가 (n-1) 개이다. (여기서 n은 노드, 꼭짓점의 수)
  3. 비순환 구조를 갖는다.

 

자, 네트워크 이야기로 다시 돌아오겠습니다. 이제 감을 어느정도 잡으셨을 듯 한데, 스패닝 트리 프로토콜(STP) 이란 네트워크에서 이러한 스패닝 트리의 구조를 갖게 하는 어떠한 규약이겠습니다. 그런데 왜 이런 구조가 필요할까요?

 

 

위 사진과 같은 구성들은 현업에서 굉장히 자주 보는 구성입니다. 이중화 구성 또는 박스구성이라고 하는데, 여기서 한가지 주목하실점은 이 구조들이 바로 순환 구조를 가지고 있다는점입니다.

 

돈다~~돌아~~

 

네트워크에서 이러한 순환 구조를 갖는 것을 루핑(Looping) 이라 합니다. 이 루핑 구조에서는 네트워크에 지대한 영향을 미치는 문제가 발생하기 시작합니다. 

 

 

2. Frame Looping

1. 브로드캐스팅 폭풍(Broadcasting Storm)

이 브로드캐스트 폭풍이란것은 루핑구조에서 브로드캐스트가 발생할 때 생기는 현상입니다. 대표적인 브로드캐스트 프레임인 ARP Request 를 생각해 보았을때, 아래 [그림1] 처럼 플러딩될겁니다.

 

좌 : [그림1] / 우 : [그림2]

 

그리면 SW3은 어떡하나요? 또 플러딩하겠죠. 그러면 [그림2]같이 또 플러딩 할겁니다.

 

그러면 SW1은 어떡하나요? 또 [그림1] 처럼 플러딩하겠죠. 그리고 나면 또 [그림2], [그림1] ...이상황을 계속 반복하면 브로드캐스팅 프레임이 빙~빙 돌게되는 루핑이 일어나겠죠. 당연히 네트워크에 이 쓸모없는 프레임이 빙빙 돌면 영향을 미쳐 이 프레임을 처리하느라 점점 느려지고, 나아가서 네트워크가 제기능을 하지 못하는 심각한 상황까지 다다르게 됩니다.

 

2. MAC Address Table 불안정

Looping이 발생하면 [그림1] 에서 PC의 MAC Address를 스위치가 각기 다른 Interface에서 계속 받게 됩니다. 그러면 MAC Address Table이 계속 변하는 Instability가 발생합니다. 

 

3. 이중 Frame 수신

Frame이 Looping 되며 똑같은 Frame을 계속 받게 되면 해당 Frame을 사용하는 프로그램이 제대로 동작하지 않을 수 있습니다. 당장 ARP만 보더라도 루핑이 발생하면서 네트워크에 영향을 끼치고 제대로 동작하지 않게 되니 당연한 수순입니다.

 

 

3. 동작방식

이제 문제점이 뭔지 정확하게 알았으니 STP가 어떻게 동작하는지에 대해 알아보겠습니다.

 

 

자, 이러한 구조에서 스패닝 트리는 각 스위치를 연결하는 링크중 하나가 사라져야 하겠습니다. 예를들어 SW3과 SW4 을 잇는 링크를 끊어보겠습니다.

 

  1. 모든 노드가 연결되었고,
  2. 링크의 개수가 꼭짓점의 수인 4에서 1을 뺀 3이며,
  3. 비순환 구조입니다.

 

스패닝 트리의 조건을 모두 만족했습니다. 위치만 살짝 조절해 볼까요?

 

 

우리가 아는 Tree 형 구조와 같아졌습니다. 이 과정들을 스위치가 내부적으로 수행하는것이 바로 스패닝 트리 프로토콜입니다. 

 

 

4. Root 스위치 선출방식

트리 구조에서 최상단에 위치한 Root를 내부적으로 선정해야지만 트리 구조를 어떻게 만들 것인지 정할 수 있을겁니다. 가장 효율적인 트리 구조를 만들기 위해 스위치들은 Root 선출을 위해 서로 정보를 교환하며 다음과 같은 절차를 거칩니다. 이때 교환하는 정보를 BPDU라고 합니다.

 

기본적으로 스위치는 Configuration BPDU를 2초마다 서로 교환하며 서로의 역할을 결정할 수 있도록 동작합니다. BPDU(Bridge Protocol Data Unit)는 STP에서 스위치(브리지)간 서로 주고받는 정보 프레임입니다.

 

Root 스위치의 선출은 우선순위+MAC Address 값이 가장 작은 스위치가 Root 로 선발됩니다. Bridge Priority는 32768을 기본값으로 가집니다.

 

 

 

BPDU Header format

 

 

5. Block Port 선출방식

ROOT 를 골라냈으니 이제 어느 스위치의 어떤 인터페이스를 차단시켜서 스패닝 트리를 완성할지 고민해봐야겠죠. 효율적인 차단을 위해서는 당연히 속도가 느리거나, 거리가 멀거나 하는 조건들을 고려하여 가장 열등한 녀석을 차단하는것이 좋을겁니다. 

 

 

이 두가지 조건을 고려하는 방식으로는 경로값(path cost)을 사용하게 됩니다. 속도에 따라 경로에 수치를 주고, ROOT 까지의 경로값을 모두 더하여 차단할 포트를 선택하게 되는 것입니다. 경로값은 아래 표를 참고하시면 되겠습니다.

 

속도 (Bandwidrh) 경로값 (path cost)
10 Mbps (Ethernet) 100
100 Mbps (Fast Ethernet) 19
1 Gbps (Gigabit Ethernet) 4
10 Gbps (10Gigabit Ethernet) 2

 

그래서 이러한 조건들을 고려하여 우선 차단하지 않을 인터페이스들을 골라내고, 마지막까지 남은 인터페이스를 최종적으로 차단하게 됩니다. 차단하지 않을 인터페이스를 골라내는데에는 다음과 같은 조건과 순서들을 거치게 됩니다.

 

1. Root Port 선출
- 가장 작은 경로값을 가진 Port
- 인접한 스위치의 Bridge ID가 가장 낮은 Port
- 인접한 스위치의 Port ID가 가장 낮은 Port : (Port priority + Port number) / priority 기본값 : 128

 

 

예시에서 모든 세그먼트는 100Mbps의 속도를 가지므로 Path cost는 19 로 동일하고, 포트의 cost는 Root 까지의 경로값을 모두 합산하기 때문에 오른쪽 그림과 같습니다. 여기에 더해 SW4는 cost 값이 38로 동일한 두 개의 포트를 가지므로 인접한 스위치의 Bridge ID 를 확인하여 아래와 같은 Root Port 를 갖게 됩니다.

 

 

 

2. Designated Port 선출
- 가장 작은 경로값을 가진 Port
- 인접한 스위치의 Bridge ID가 가장 낮은 Port
- 인접한 스위치의 Port ID가 가장 낮은 Port : (Port priority + Port number) / priority 기본값 : 128

 

그러면 이제 DP를 선출해야 하는데, 조건 자체는 동일합니다. 다만 DP는 한 세그먼트 안에서 무조건 하나는 존재해야합니다. 즉, SW3SW4를 잇는 세그먼트에는 Root Port 가 없지만, DP는 있어야 한다는 겁니다. 결과적으로 아래와 같은 구성이 되겠습니다.

 

 

 

3. Alternated Port 선출

 

자, 이제 남은 포트는 하나뿐이네요, 해당 포트는 차단됩니다.

 

 

절차가 복잡해보이지만 이해만 하신다면 그리 어렵진 않습니다. 다음 예시들을 확인하시고, 어떤 포트가 Blocking 될지 예측해보시기 바랍니다. (단, 모든 세그먼트는 100Mbps이며 Bridge, port priority는 기본값이라고 가정한다.)






 

 

6. 포트 역할

Root Port - 데이터, BPDU 모두 이동이 가능한 Port
Designated Prot - 데이터, BPDU 모두 이동이 가능한 Port
Alternated Port - BPDU 는 이동이 가능하지만 데이터는 전달하지 않는 Port. 

 

 

7. 포트 상태

STP가 네트워크 전체에 발생하는 치명적 장애를 막기위한 프로토콜이니 역할을 변경하는 과정 역시 매우 신중하게 설계되어있습니다.

 

각 포트는 역할과 상태를 동시에 지닙니다. 점점 복잡해 지는 기분이실텐데, 비유하자면 역할은 직업과 같고 상태는 교육과정을 말합니다. 각 포트는 Root, Designated, Alternated 등의 직업을 할당받고 직업에 맞는 업무처리 능력을 기르기 위해서 신입사원 교육을 받는거죠. 수습사원, 인턴같은 느낌의 과정이라고 생각하시면 됩니다. 

 

Listening state
(LSN)
모든 포트는 청취상태가 되어 BPDU를 송수신하며 역할을 결정하게 되며 15초간 청취상태를 유지하면 학습상태로 변경됩니다. BPDU만 송수신 가능합니다.
Learning state
(LRN)
전송상태가 되기 전 MAC 주소를 학습하는 단계입니다. 마찬가지로 BPDU만 송수신 가능하며 15초간 학습상태를 유지하면 전송상태로 변경됩니다.
Forwarding state
(FWD)
MAC 주소 학습이 완료되고 데이터 전송까지 할수 있는 상태입니다. 즉, 정상적으로 기능하는 Root, Designated 포트상태입니다.
Blocking state
(BLK)
BPDU는 송수신이 가능하지만 MAC주소 학습과 데이터 전송이 불가한 상태입니다. Blocking Port의 역할을 수행하는 상태로, 어떤 상태이던지 BLK로는 즉시 변경됩니다.

관리자의 필요에 따라 역할과 상태가 변경될 수 있으며 설정즉시 LSN 상태로 진입하여 LRN, FWD 상태를 거칩니다.
Disable state 고장 또는 포트의 Disable, 인터페이스 Shutdown등의 비활성 상태입니다.

 

Root, Designated 라는 직업을 할당받았으니 면접도 보고(LSN), 신입사원 교육도 받고(LRN), 정식 사원(FWD)이 되는겁니다. 그런데 문제가 있는 녀석은 하루빨리 해고(BLK)시켜야겠죠? 그러니 해고절차는 즉시 시행하게 하는겁니다.

재입사를 희망하면 또 면접도 보고, 교육도 받고~ 하는겁니다.

 

 

8. 장애 발생시 동작

Blocking Port를 잠시 생각해 보겠습니다. 네트워크에 장애가 발생하니까 차단시키긴 했지만 사실 기능은 멀쩡한 녀석이거든요. 이럴거면 그냥 선 뽑아버려서 연결 안해도 될텐데 굳이 선도 꽂고 프로토콜로 입만 막아놓은데에는 이유가 있지 않을까요?

 

 

네트워크에서 발생하는 장애는 워낙 다양하지만, 이번엔 회선이 끊어지거나, 포트가 다운되거나 하는 경우를 생각해보겠습니다.

 

이 경우 SW2와 SW4의 링크가 끊어졌고, SW4는 Blocking 되어있으니 결과적으로 고립됩니다. 이중화를 해뒀는데 이렇게 쉽게 장애가 발생하면 무슨 의미가 있을까요?

 

그런데 Blocking Port는 기능적으로 문제가 있는 포트가 아닙니다. 이 포트를 살려서 쓰면 그만이죠. 기존의 Root Port가 끊어졌으니 이제는 루핑구조가 아닐뿐더러 Block Port를 Root Port로 바꿔주면 아무런 문제가 발생하지 않습니다. 

 

 

이 과정에서 SW4는 TCN BPDU(Topology Change Notice BPDU)를 변경될 구조의 상단인 SW3 방향으로 전달하여 토폴로지에 변경이 생겼다는 것을 알리고, SW3 역시 Root 방향으로 TCN BPDU를 포워딩하여 구조의 변경을 알립니다.

 

최종적으로 Root는 MAC Address Table 의 Aging Time을 300초에서 15초로 줄이도록 하는 TC(Topology Change)를 전송하여 구조 변경의 영향을 받는 MAC Address Table의 갱신시간을 조절하고, 각 포트의 역할을 재분배합니다.

 

물론 상태는 LSN(15초) → LRN(15초) → FWD 를 거치니 약 30초간 통신이 단절됩니다. 

 

 

 

다음 경우를 보겠습니다.

 

 

비슷한 상황으로 보이지만 꽤나 차이가 있습니다. 우선 SW2는 Root인 SW1과의 링크가 단절되었습니다. 이 경우 SW2는 Root인 SW1로부터 BPDU를 받지 못하니 SW2는 Root가 Down되었다고 판단하고 자기가 Root라며 주장하는 후순위 BPDU(Root Bridge보다 우선순위가 떨어지는 BPDU)를 보내기 시작합니다. 

 

 

SW4는 이경우 후순위 BPDU를 10번 수신하며 Root Bridge가 정말로 Down 되었는지를 확인하기 시작합니다. BPDU의 전송간격은 2초이므로 20초간 대기하는거죠. 그리곤 Root Bridge가 Down되지 않았다는 사실을 확인하면 SW1, SW2의 링크가 끊어졌다는 사실을 알 수 있게 되는거죠.

 

그러면 SW4는 다시 Root 방향으로 TCN BPDU를 전송하고, Root는 TCA, TC를 전송함으로써 포트들의 상태가 역변합니다.

 

 

또 Block 되었던 SW4의 포트가 Root Port로 정상적인 동작을 하기까지는 LSN→LRN→FWD 상태를 거쳐야하니 30초를 기다려야 합니다. 결과적으로 후순위BPDU를 수신하는 시간(2초x10회=20초)과 FWD 상태가 되가까지의 대기시간(30초)를 더해 50초간 SW3, SW4는 Down됩니다. 

 

30초, 50초간 단절되는 통신은 네트워크에서는 굉장히 긴 시간입니다. 마치 플랭크 자세를 한 것과 마찬가지로 식은땀이 줄줄나고, 배는 아파오고.. 거기에 수많은 컴플레인과 뒷감당까지.. 이 30초, 50초의 시간을 줄이기 위해 많은 프로토콜이 개발되어왔습니다.

 

STP Convergence Time은 STP Timer를 조절하거나, 포트패스트, 업링크패스트, 백본패스트, RSTP, MSTP등을 사용하여 조절가능합니다.

 

 

9. 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로 묶을 수 있음.

종류가 워낙 많다보니 분량이 너무 많아질 듯 하여 간략한 소개만 드리고 동작의 차이점이나 명령어는 다음 포스팅에서 상세히 다루도록 하겠습니다. 

 

 

Command

STP 확인

Switch# debug spanning-tree event			//STP 이벤트 디버깅
Switch# show spanning-tree active			//활성화된 인터페이스 Report
Switch# show spanning-tree root				//Root 확인
Switch# show spanning-tree bridge			//해당 Bridge의 설정과 상태
Switch# show spanning-tree detail			//STP 세부정보
Switch# show spanning-tree interface [interface]	//해당 인터페이스의 STP 상태
Switch# show spanning-tree summary			//STP 포트 상태 요약
Switch# show spanning-tree vlan [VLAN]			//VLAN STP 상태
Switch# show spanning-tree inconsistentports		//STP 불일치 포트

 

STP 설정

Switch(config)# spanning-tree vlan [vlan_id] priority [0~61440]		//Bridge 우선순위
Switch(config)# spanning-tree vlan [vlan_id] root primary		//Root Bridge로 설정
Switch(config)# spanning-tree vlan [vlan_id] root secondary		//Backup Root Bridge 설정
Switch(config-if)# spanning-tree vlan [vlan_id] cost [1-200000000]	//port 경로값 설정
Switch(config-if)# spanning-tree vlan [vlan_id] port-priority [0-224]	//port priority 설정

 

STP convergence time 설정

Switch(config)# spanning-tree vlan [vlan_id] hello-time [1-10]		//hello time interval 설정
Switch(config)# spanning-tree vlan [vlan_id] max-age [6-40]		//max-age time interval 설정
Switch(config)# spanning-tree vlan [vlan_id] forward-time [4-30]	//forward-time delay 설정

 

Diameter 조정

Diameter란 Root를 포함하여 가장 멀리 떨어진 스위치의 수량을 의미하며 타이머 값은 아래 표와 같고 기본값은 7입니다. 디아미터를 사용하여 자동으로 설정된 적정 타이머 값으로 조절이 가능합니다.

 

Hello Time은 설정할시 오히려 부하가 증가하므로 설정하지 않는것을 권장하고 있습니다.

 

Diameter 2 3 4 5 6 7
Hello 2 2 2 2 2 2
Delay 7 9 10 12 13 15
Max-age 10 12 14 16 18 20
Switch(config)# spanning-tree vlan [vlan_id] root primary diameter [2-7]