태그: VLAN

Network Study – 3주차 : Layer2 보충(VLAN, STP)

Layer2, 이더넷 스위칭을 다루면서 L2에서 사용하는 VLAN과 STP를 다루지 않았기에 다시금 보충하게 되었다.

VLAN에는 802.1Q, Cisco ISL(Inter-Switch Link), 802.1aq SPB(Shortest Path Bridging)이 있고, STP는 802.1D STP(Spanning Tree Protocol), 802.1w RSTP(Rapid Spaning Protocol), 802.1s MSTP(Multiple Spanning Tree Protocol) 그리고 SPB를 다룬다.

1. VLAN 개요

VLAN이란, L2단에서 하나의 물리적인 LAN을 여러 개의 가상의 LAN으로 나누는 기술을 말한다. 물리 망은 공유하지만, 부서에 따라 다른 네트워크 정책을 적용해야 할 경우나, 단순히 트래픽을 서로 격리할 필요가 있을 경우 사용된다. VLAN을 적용하면 일반적으로 보안이 강화된다.
VLAN의 동작은 VLAN Tagging을 통하여 이루어진다. VLAN이 설정된 포트로 프레임이 들어오면, 해당 프레임에 VLAN Tag를 붙인다. 그리고 목적지 포트가 같은 VLAN에 속하지 않으면 그 프레임을 폐기한다. 정상적으로 전달되는 경우 출력 포트를 나갈 때 VLAN Tag를 제거하여 호스트들이 패킷을 수신하게 한다. 이렇듯 VLAN은 종단간 통신에 있어 투명한 기술이다.
그리고 Trunk Port와 같이 다중 VLAN이 적용된 포트의 경우는 Tag를 붙인 채로 프레임을 보낸다. 덧붙여, Default 또는 Native VLAN이라 불리는 VLAN 1(설정으로 변경 가능)에 속한 프레임은 VLAN Tagging을 하지 않으며, Trunk Port로부터 태깅이 되지 않은 프레임이 넘어오면 Native VLAN으로 취급된다.

이러한 Port-Based VLAN이 전형적인 VLAN 적용 방식이며, 다른 방식으로는 Protocol-Based VLAN(802.1v)이 있다.

1-1. IEEE 802.1Q 상세 동작

IEEE 표준인 802.1Q의 동작에 대해 알아본다. 802.1Q는 표준 프로토콜이기에 가장 많이 사용되는 VLAN 프로토콜이라 할 수 있다.
단, 이더넷에서만 이용할 수 있다는 제약을 가진다. 몇몇 벤더는 비표준 기술로써 ATM 등에 대한 802.1Q을 지원한다.

802.1Q는 다음과 같이 프레임에 VLAN 태그를 삽입한다. Source MAC Address 뒤에 802.1Q 헤더가 오며, 첫 두 바이트 값은 0x8100이다. 이는 Ether-Type 필드와 겹쳐서, 802.1Q 프레임과 일반 프레임을 구분할 수 있도록 한다. 그리고 다음 3비트가 Priority 필드, 다음 1비트는DEI(Drop Eligible Indicator)로 혼잡 상황 발생시 이 프레임이 폐기될 수 있는지의 여부를 결정한다. 이전에는 이 값이 Ethernet-Token Ring 연동을 위한 CFI 값이었다.
그 뒤의 12비트가 VLAN ID 값으로 2^12 = 4096개의 VLAN ID 중에서 예약된 0과 4096을 제외한 1~4095, 최대 4094개의 VLAN ID를 사용할 수 있다.
특히, VLAN ID 0은 VLAN이 설정되지 않은 프레임을 의미하는데, 이  경우에는 Priority 옵션만을 사용하게 된다.

802.1Q는 지금도 계속 갱신되고 있으며, 최신 버젼의 802.1Q 지원은 벤더와 소프트웨어 버젼마다 다르다. 많은 Draft 중에서 802.1Q-2014 Draft Standard는 802.1aq와 병합되었다.

1-2. Cisco ISL 상세 동작

802.1Q와는 달리, ISL은 프레임을 캡슐화(Encapsulation) 한다. 때문에 프레임의 앞에 ISL Header가 추가되며, 끝에 FCS가 추가된다.

ISL 프레임의 구조는 다음과 같다.

(1) Destination Address (40Bit) : 특이하게도 48비트가 아닌 40Bit의 MAC을 사용한다. 이 주소는 멀티캐스트 주소로써, “01-00-0C-00-00” 또는 “03-00-0c-00-00″이다. 이 주소값은 패킷이 ISL 포맷임을 알린다.
(Q: 어째서 일반적인 L2 Address Type이 아닌가? Multicast Address가 맞긴 한가?)
(2) Type : ISL 프레임이 담고 있는 프레임의 포맷을 알린다. 0 : Ethernet, 1 : Token Ring, 2: FDDI, 3: ATM
(3) User : Type 필드의 확장으로, Priority를 나타낸다. 기본값은 0, 최대값은 3이다.
(4) Source Address : Source MAC Address이다.
(5) Length : ISL 프레임에서 DA, Type, User, SA, Len, FCS를 제외한 길이를 바이트 단위로 나타낸다. 따라서 총 길이 –  20Byte가 Length 값이 된다.
(6) SNAP (24Bit) : SNAP 값이다. 0xAAAA03을 가진다.
(7) High Bits of Source Address : OUI 값을 나타낸다. Cisco가 소유하고 있는 OUI 중 “00-00-0C”를 사용한다.
(8) Destination VLAN ID : VLAN ID값을 나타낸다. 최대 4096개의 VLAN을 지원한다. 이 중 0과 4096은 예약되어 있기에 사용 가능한 VLAN은 1-4095이다.
(9) BPDU and CDP Indicator : BPDU나 CDP 패킷을 캡슐화하였을 경우 세트된다.
(10) Index : 스위치의 Egress Port 번호를 나타낸다. 진단용으로만 사용되며, 수신한 측에서는 이 값을 무시한다.
(11) Reserved : Token-Ring, FDDI 프레임을 위해 예약된 값이다.
(12) Encapsulated Frame : 캡슐화된 원본 L2 프레임이다.
(13) FCS : 전체 ISL 프레임의 32Bit CRC 값이다.

ISL이 개발된 이후 802.1Q가 개발되었고, 현재는 ISL을 거의 사용하지 않는다. Ethernet에 맞춰 개발된 802.1q와 달리 더 다양한 네트워크를 지원한다는 장점이 있다.

 

2. STP 개요

STP(Spanning Tree Protocol)은 스위치 패킷의 루프를 방지하기 위하여 고안된 프로토콜이다. 토폴로지 구성에 있어, 스위치간 중복 링크가 활성화된 경우 브로드캐스트 패킷이 복사되어서 링크를 떠돌게 되는 브로드캐스트 스톰(Broadcast Storm)이 발생할 수 있다. 이러한 상태를 ‘루프가 발생했다’고 하며, 브로드캐스트 프레임, 혹은 다른 프레임이 스위치 링크를 무한히 떠돌아다니는 상황을 방지하고, 링크가 다운되었을 경우의 리던던시(Redundancy)를 제공하기 위해 STP가 사용된다.
한 가지 흥미로운 점은 Ethernet Frame에는 이러한 상황을 방지하기 위한 TTL 필드가 존재하지 않는다는 것인데, Ethernet을 만들 당시에는 이러한 문제를 미처 생각하지 못했던 것이 아닐까?
STP가 동작하는 방식은 매우 간단하다. Root Bridge를 선정하고, Root Bridge로 갈 수 있는 최단 경로의 포트를 선정한 뒤 다른 링크는 전부 블록시켜 버린다. 이를 통하여 모든 브리지(스위치)간의 통신이 가능해지며, 링크가 단절되었을 경우 자동으로 재연산을 수행하여 대체 경로를 찾는다.

STP의 문제점은 수렴 시간(Convergence Time)이 길어 링크 절체 시간이 길다는 것과, 대체 경로를 사용한 로드 밸런싱이 불가능하다는 것이 있다. 전자는 RSTP의 등장으로 어느 정도 해소되었지만, STP 알고리즘의 특성 상 대체 경로를 형성하는 것이 불가능하기에 현대 데이터센터에서 STP를 사용하는 것은 상당히 낭비가 큰 일이다. STP/RSTP를 대체하기 위한 프로토콜로는 SPB, TRILL 등이 있다. 물론 SDN을 통한 경로 관리도 대안이 될 수 있으리라.

2-1. STP 상세 동작

RSTP를 다루기에 앞서, STP의 동작을 먼저 다루도록 하겠다. STP에서 사용되는 용어들은 다음과 같다.

– Root Bridge : STP의 중심이 되는 브리지. 주로 Bridge ID값이 높은 장비가 선출된다.
– Root Port : Root Bridge로 가는 최단 경로에 위치한 포트
– Designated Port : Designated Bridge에 속한 포트 중 해당 LAN Segment의 Minimum Path Cost를 갖는 포트.
– Designated Bridge : LAN Segment에 연결되어 있는 브리지 중 Root 브리지로 가는 Path Cost 값이 가장 작은 경로를 가진 Bridge. 각 LAN 세그먼트마다 하나씩 선출된다. 이 때 주의해야 할 점은, 여기서의 LAN 세그먼트는 물리적인 세그먼트라는 것이다.
– BPDU(Bridge Protocol Data Unit) : STP에서 토폴로지 정보를 교환하기 위한 프레임을 말한다. 여러 종류의 BPDU들이 존재한다.

STP는 다음과 같은 순서로 동작한다.

1. 루트 브리지(Root Bridge) 선출
2. 루트 포트(Root Port) 선출
3. Designated Bridge 선출 (각 LAN Segment마다)
4. Designated Port 결정
5. Port State 천이 (Blocking – Listening – Leaning – Forwarding)

이제 이 과정을 좀 더 자세히 다뤄 보자. 하지만 상세 동작을 다루기 위해서는 BPDU에 대한 이해가 필요하기에 BPDU의 구조를 먼저 다루도록 하겠다.

BPDU 프레임의 구조는 다음과 같다.

(1) Configuration BPDU

(1) Protocol ID : 0x0000(STP)
(2) Protocol Version : 0x00 (IEEE 802.1D)
(3) BPDU Type : 0x00, Configuration BPDU
(4) Flags : 첫번째 비트가 TC, 마지막 비트가 TC Ack 플래그이다.
(5) Root Identifier (64Bit) : BPDU를 만든 브리지가 Root Bridge로 여기는 브리지의 ID.
(6) Root Path Cost (32Bit) : BPDU를 만든 브리지로부터 루트 브리지까지의 총 Path Cost값.
(7) Bridge Identifer (64Bit) : BPDU를 만든 브리지의 Bridge ID
(8) Port Identifier : BDPU를 전송한 포트의 Port ID
(9) Message Age (16Bit) : 루트 브리지에서 BPDU를 전송할 때 0으로 세트된다. 그리고 브리지를 타고 내려갈 때마다 1씩 증가하며, 각 브리지는 (자신의 Max Age – Messeage Age)만큼 BPDU를 보관한다. Timer가 Max Age를 넘어서면 BPDU는 만료된다.
(Q: 만약 Timer가 짧고, 많은 브리지를 거쳐야 한다면 BPDU가 도달 불가능한 브리지도 생길 것인가?)
(10) Max Age : Root Bridge의 Max Age 값.
(11) Hello Time (16Bit) : Root Bridge가 Hello를 보내는 주기.
(12) Forwarding Delay : Root Bridge에 설정된 Bridge Forwarding Delay 값.

여기서 주의할 점은 STP 타이머 값들은 모두 루트 브리지의 설정을 사용한다는 것이다. 루트 브리지의 타이머 설정은 Configuration BPDU를 통해 전체 브리지들로 전파된다.

(2) TCN(Topology Change Notification) BPDU

 

이제 BPDU에 대해 알아보았으니, BPDU의 정보를 기반으로 STP가 트리를 구성하는 과정을 살펴보자.

2-1.1. Root Bridge 선출
스위치의 초기화가 완료되면, 스위치는 자신이 Root Bridge라고 생각한다. 때문에 모든 포트를 Designated Port로 간주, Configuration BPDU를 내보낸다.
스위치들은 Configuration BPDU 내의 Root Identifier와 자신이 알고 있는 Root Identifier를 비교, 더 값이 높은 쪽을 루트 브리지로 선정한다.

2-1.2. Root Port 선출
루트 브리지의 선출이 완료된 뒤, 각 브리지들은 루트 브리지의 BPDU를 수신한 포트들 중에서 Root Path Cost가 가장 작은 포트를 Root Port로 지정한다.
만약 코스트가 같은 포트가 둘 이상이면 Designated Bridge ID가 작은 포트를, 그것도 같으면 Designated Port ID를, 마지막으로 자신의 Port ID를 비교해서 낮은 쪽을 Root Port로 지정한다.

2.1.3. Designated Bridge 선출
LAN Segment에서 Root Path Cost값이 가장 작은 브릿지가 Designated Bridge가 된다. 이 때 같은 LAN Segment에 존재하는 브리지들을 파악하기 위하여 BPDU의 Bridge ID와 Port ID를 사용한다.
스위치 환경에서는 스위치 하나에 연결된 장비들이 하나의 LAN Segment가 되므로, 하나의 LAN Segment에 여러 스위치들이 존재할 수 없다. 때문에 Root에 더 가까운 스위치가 Designated Bridge가 될 것이다.

2.1.4. Designated Port 선정
LAN Segment에서 Designated Bridge와 연결된 포트가 Designated Port가 된다.

2.1.5. Forwarding State로 천이
Designated Port와 Root Port가 Forwarding 상태로 천이되며, 프레임과 BPDU를 전송한다.

2.1.6. STP Port Status

앞서 STP가 루프를 방지하기 위해서 일부 포트를 활성화하고, 일부 포트는 차단(Blocking)한다고 설명하였다. STP의 포트 상태에 대해 좀 더 자세히 알아보자.

(1) Disabled : 관리자에 의하여 사용이 중단되었거나, 물리적으로 링크가 Down된 상태
(2) Blocking : STP 연산 결과 Designated, Root 포트가 아니어서 프레임 전달 기능이 비활성화된 상태
(3) Forwarding : 프레임 전달 및 MAC Address Learning을 수행하는 상태.
(4) Listening : Blocking에서 Forwarding으로 천이하는 과정에서 생길 수 있는 루프를 방지하기 위해, 프레임 전달 및 MAC Learning을 수행하지 않고 대기하는 상태. Forwarding Delay 값의 영향을 받는다.
(5) Learning : Listening에서 천이되는 상태로, 프레임 전달은 수행하지 않고 MAC Address Learning만 수행하는 단계. 마찬가지로 Forwarding Delay 값의 영향을 받음.

여기서 주의해야 할 부분은 Blocking된 포트라 하더라도 BPDU 송신을 하지 않을 뿐, BPDU 수신은 이루어진다는 것이다.
그리고 Listening – Learning – Forwarding으로 천이되는 동안 Forwarding Delay동안 대기(기본값 20초)하여, 토폴로지 변동 시 절체 시간이 약 50초에 이른다는 것을 확인할 수 있다.

이상으로 STP의 상세 동작을 알아보았다.
추후 STP에서 문제가 되는 부분인 긴 절체시간을 해결하기 위하여 802.1w RSTP(Rapid Spanning Tree Protocol)가 제안된다.

2-2 RSTP 상세 동작

2-3. MSTP 상세 동작

2-4. 결론

 

3. SPB 상세 동작

VXLAN(Virtual eXtensible Local Area Network) – 1

최근 데이터센터에서 멀티 테넌트 환경을 지원하기 위해 각광받고 있는 VXLAN을 RFC를 바탕으로 이해해 보자.

RFC7348에서는 VXLAN을 ‘가상화된 L2 네트워크를 오버레이로 L3네트워크 상에서 구현하는 프레임워크’라 정의하고 있다. 그리고 RFC7348은 Informational 카테고리에 등록되어 있다.

 

1. 개요

IDC에서 서버 가상화가 확산되고, 하나의 서버가 많은 VM들을 가지게 되면서 Ethernet Switch가 가지는 MAC Address Table도 급격히 커지게 되었다. 또한 Extended VLAN의 최대 갯수가 4096개인 것에 비해 멀티 테넌트 환경에서 수천개, 혹은 그 이상의 VLAN을 요구하게 됨에 따라, 잠재적으로 중복된 VLAN ID가 발생할 가능성이 생겼다. 그리고 가상화된 L2 네트워크를 전체 데이터센터에 적용하게 되면, 기존에 사용되던 STP 같은 루프 방지 알고리즘은 많은 비활성화 된 링크를 만들어낸다. 이런 상황을 피하기 위해서 Equal-Cost Multipath(ECMP)를 도입한다 하더라도, VM간 통신에는 여전히 기존의 L2 모델을 남겨둘 수 밖에 없다.

이러한 문제점들을 해결하기 위하여 오버레이 네트워크가 제안되었다. 오버레이 네트워크란, 각각의 VM들이 만들어내는 MAC 트래픽을 논리적인 ‘터널’을 통해 캡슐화하여 전달하는 것을 의미한다. 그리고 VXLAN은 오버레이 네트워크를 실현하기 위한 프레임워크이다.

 

2. 가상화 환경에서의 제약 사항

2-1. STP(Spanning Tree Protocol)과 VLAN 범위의 제약

현재, L2 네트워크는 루프 회피를 위하여 IEEE 802.1D STP를 사용하고 있다. STP는 중복되는 링크를 블록하는 것으로 루프 방지를 구현한다. 때문에 데이터센터는 실제로 사용할 수 있는 것보다 더 많은 물리적 링크를 가져야 하고, 다중 경로를 통해 얻을 수 있는 복원성도 사라진다. 이를 해결하기 위한 최근의 시도로 TRILL(RFC6325)과 SPB(802.7ag)가 있지만, 멀티패스틑 구현할 수 있도록 도와주거나, STP의 문제들 중 일부를 덮어둘(surmount) 뿐이다. STP의 제약은 서버와 랙을 하나의 Layer 3 네트워크로 구성하는 것으로 해결될 수 있다. 하지만 이것 또한 VM 사이의 통신을 위한 L2 모델과 호환되지 않는다.

L2 데이터 센터의 특징은 Broadcast isolation을 위해 VLAN을 사용한다는 점이다. 12bit의 VLAN ID는 최대 4096개의 VLAN을 제공할 수 있으며, 기존의 데이터센터들에서는 4096개보다 더 적은 VLAN을 사용했기에 문제가 없었다. 하지만 서버 가상화의 도입으로 고객들에게 독립된 환경(Tenant)를 제공하는 것이 중요해졌고, 한 서버에 수많은 VM들이 올라감에 따라 VLAN ID는 급속도로 고갈되었다.

 

2-2. 멀티 테넌트 환경

클라우드 컴퓨팅은 om-demand한 동적 프로비저닝을 요구한다. 대부분의 클라우드 컴퓨팅은 Private Cloud이며, 서비스 제공자는 하나의 물리적 인프라 위에서 각 고객들에게 독립된 환경을 제공해주어야 한다. 테넌트를 이용한 네트워크 트래픽 분리는 L2, L3네트워크에서 적용될 수 있다. L2 네트워크에서는 이것을 위해 VLAN이 자주 사용된다. 클라우드 서비스 제공자는 많은 수의 테넌트를 제공해야 하며, 각 테넌트당 하나의 VLAN ID가 할당되어야 하는 환경에서 4096개의 VLAN ID 제한은 적합하지 않다. 게다가 하나의 테넌트가 여러개의 VLAN을 요구할 수도 있는데(Ex. 부서간 네트워크 분리) 이는 상황을 더욱 악화시킨다. 관련된 다른 문제로 cross-pod 확장이 있다. pod이란 연관된 네트워크와 스토리지로 구성된 하나 또는 그 이상의 랙을 말한다. 테넌트는 그것이 더 많은 서버와 VM을 필요로 할 때 다른 Pod으로 확장될 수 있어야 한다. 특히, 인접 Pod의 자원 활용율이 낮다면 더욱 그렇다. 이러한 환경에서는 “확장된” L2 환경이 필요하다.

L3 네트워크 또한 멀티테넌시 환경에 대한 포괄적인 해결책은 아니다. 두 테넌트가 자신들의 네트워크에서 동일한 L3 주소를 사용할 수 있으려면, 클라우드 서비스 제공자가 고립된 네트워크 환경을 제공해 주어야 한다.

 

2-3. ToR Switch의 부적절한 테이블 크기

지금의 가상화된 환경에서는 ToR(Top of Rack)스위치의 MAC Address Table의 크기가 증가되어야 한다. 서버의 링크당 하나의 MAC Address를 학습해야 했던 이전과는 달리, 스위치는 이제 VM에 붙은 링크 수만큼의 MAC Address를 학습해야 한다. 데이터센터는 여러대의 랙으로 이루어져 있고, 다른 랙에 있는 VM과 통신하기 위하여 MAC을 학습해야 한다. 때문에 가상화되지 않은 환경에 비해 큰 테이블 크기를 요구한다.

스위치는 테이블이 다 찼을 시, 학습을 중단하고 학습되지 않은 패킷들을 모든 포트로 플러딩한다.

 

3. VXLAN

VXLAN은 L3 네트워크 위에 가상의 L2 네트워크를 오버레이하는 기술이다. 오버레이된 네트워크들을 VXLAN segment라고 하며 각각의 segment에 포함된 VM끼리만 통신이 가능하다. 각 VXLAN segment는 24비트의 식별자(VXLAN Network Identifier)를 가지며, 최대 1600만개 이상의 VXLAN 세그먼트가 만들어질 수 있다. VXLAN Netrowk Identifier(이하 VNI)는 내부의 캡슐화된 이더넷 프레임이 어떤 VM으로부터 나왔는지 특정하며, 때문에 세그먼트들 사이의 MAC을 오버래핑 하더라도, 트래픽이 세그먼트들을 ‘통과하는’일은 일어나지 않는다. 이러한 캡슐화 때문에 VXLAN은 L3 네트워크에서 L2 네트워크를 구성하는 터널링 기술로 불리기도 한다. 이 터널이 stateless 하기 때문에 각각의 프레임들은 일정한 규칙에 따라 캡슐화될 필요가 있다.

이 터널의 종단(VXLAN Tunnel End Point, 혹은 VTEP)은 VM을 서비스하고 있는 서버나 하이퍼바이저에 위치한다. 여기서, 물리적인 네트워크 장비나 서버 또한 사용될 수 있음을 기억하자.

그럼 이제 VXLAN이 터널을 어떻게 구성하는지 알아보자.

 

1. VXLAN이 적용된 VM은 VXLAN을 인지하지 못한다. 이 VM은 다른 VM과 통신하기 위하여 일반적인 MAC 프레임을 전송한다.

2. 물리 호스트 위의 VTEP는 프레임을 수신하고, 해당 VM이 속한 VNI를 찾는다. 그리고 목적지 MAC이 같은 세그먼트에 속하는 VM이라면, 원격 VTEP의 MAC을 매핑한다. 이 시점에서의 패킷 구조는 IP-MAC 헤더-원본 L2 프레임이다.

3. L3 네트워크를 타고 전송된 프레임이 원격 VTEP에 도착한다. 원격 VTEP는 VNI를 검증하고 목적지 VM이 해당 VNI에 속해있는지 확인한 뒤, 프레임의 캡슐화를 풀고, VM에 전달한다.

 

RFC7348은 VTEP의 구현과 프레임을 최종적으로 전달할 때의 구현에 대해선 정의하고 있지 않다. 따라서 이러한 부분에서 벤더간 호환성 문제가 발생할 수 있을 것으로 보인다.