[ACSA 교육#21] 802.1Q

지난 포스팅에서 VLAN에 대해 알아보았습니다.
하나의 물리적 스위치 안에 가상의 스위치를 만들어서 보다 효율적으로 브로드캐스트 도메인을 만들어 관리할 수 있었습니다.

VLAN의 한계점

하지만, 다음 그림을 한 번 살펴볼까요?

그림은 각각 VLAN 10과 VLAN 20에 포트가 구성된 스위치 2대가 있습니다. 이제 이 두개의 스위치를 연결하려고 SW1의 24번 포트와 SW2의 24번 포트를 서로 연결합니다. 두 스위치의 모든 단말이 통신이 될까요?

24번 포트는 Default VLAN인 VLAN-ID 1번으로 매핑되어 있습니다. 하지만 이 포트에는 VLAN 10과 VLAN 20에 연결되지 않았기 때문에 VLAN 10과 VLAN 20의 트래픽을 전달할 수가 없습니다.

하나의 인터페이스에는 오직 하나의 VLAN ID만 지정할 수 있다!

그렇다면 이러한 문제를 어떻게 해결할 수 있을까요?

아주 단순 무식한 방법은 두 개의 링크를 더 연결하는 것입니다. 포트 22에 VLAN 10을 할당하고, 포트 23에 VLAN 20을 매핑하여 두 개의 스위치를 연결합니다. 그럼 모든 VLAN에 대해서 스위치간 연결이 되었기 때문에 두 스위치의 모든 단말이 통신이 가능해집니다.

하지만, 여기서 문제가 발생합니다.
만약.. VLAN이 10개 있다면? VLAN이 100개가 있다면? 두 스위치간 상호연결을 위해서 VLAN 개수 만큼의 물리적 연결이 필요해지게 됩니다. 불필요한 포트 낭비일뿐만 아니라 사실상 불가능합니다.

따라서 하나의 물리적 포트를 사용하여 여러 개의 VLAN을 연결하는 방법이 필요합니다.

802.1Q Tagging

아래 표준 이더넷 프레임 구조를 한 번 볼까요?

Host A의 브로드캐스트 프레임으로 24번 포트를 포함하여 VLAN 10이 할당된 모든 포트로 플러딩되어 나갔다고 생각해보겠습니다. 이 프레임에는 수신하는 스위치가 어떤 VLAN인지 알수 있는 필드가 없습니다. 따라서, SW2 스위치는 이 프레임을 받는 순간, 이 브로드캐스트 프레임이 VLAN 10인지, VLAN 20인지, 아니면 VLAN 1의 프레임인지 알 수가 없습니다.

따라서 우리는 어떤 VLAN ID인지 정보를 알려줄 수 있는 태깅 메커니즘(Tagging Mechanism)이 필요합니다.
이와 관련된 표준이 IEEE 802.1q이며, Length(길이)와 Payload 필드 사이에 802.1q Tag 필드를 추가하게 됩니다.

이 필드에서 가장 중요한 것은 역시나 VID 또는 VLAN ID, VLAN Tag라고 하는 필드입니다.

SW1 스위치는 Trunk Port (트렁크 포트)라고 특별히 정의한 포트를 통해서 브로드캐스트 프레임을 보내기 전에 이 Tag를 프레임에 추가하게 됩니다. 그리고 SW2는 이 프레임을 수신했을 때, Tag 정보를 보고 “VLAN 10의 트래픽이구나” 라고 알 수 있게 됩니다. 그럼 SW2는 다시 이 특수 Tag를 제거하고 VLAN 10의 모든 포트, 즉 Host E와 Host F에게 트래픽을 전달하게 됩니다.

마찬가지로, Host G가 브로드캐스트 트래픽을 보내게 되면, SW2의 트렁크 포트, 24번 포트에서 VID=20의 태그를 추가하여 SW1으로 보내고, SW1은 해당 트래픽 정보를 통해 VLAN 20의 트래픽이라는 것을 알고 태그를 제거한 후에 Host C와 Host D로 트래픽을 보내게 됩니다.

따라서, 이제 하나의 물리적 포트를 사용하여 여러 스위치에 걸쳐 VLAN 개념을 확장할 수 있습니다.

VLAN ID 필드는 12bit 길이를 갖고 있어, 최대 4094개의 VLAN-ID를 만들 수 있습니다. (1-4094)

802.1q 표준에서 관리자는 Layer 2 헤더 안에 Tag 또는 VID가 포함되지 않은 프레임을 사용할 수도 있습니다.
즉, Tag가 지정되지 않은 상태로 표준 이더넷 프레임이 전송된다는 것을 의미합니다.

이러한 VLAN은 Untagged VLAN 또는 Native VLAN이라고 얘기합니다.
AOS-CX에서 기본 Native VLAN 값은 1이며, 필요할 경우 다음 명령어로 변경할 수 있습니다.

SW1(config-if)# vlan trunk native <vlan id>

두 스위치(Peer)간의 Native VLAN은 동일한 값 사용하는 것을 권장합니다.

VLAN Trunk 구성 (Configuration)

AOS-CX 스위치에서는 “vlan trunk”라는 명령어를 사용하여 허용 VLAN ID를 정의합니다. Trunk Interface (트렁크 인터페이스)에는 여러 개의 VLAN ID를 할당할 수 있습니다.

SW1(config)# interface 1/1/24
SW1(config-if)# vlan trunk allow 1,10,20

Trunk Port 구성하기에 앞서 VLAN에 대한 구성이 사전에 정의되어야 합니다.

또한, 아래와 같이 show 명령어를 사용하여 Trunk 인터페이스에 대한 정보를 확인할 수 있습니다.

SW1# show vlan port 1/1/24

--------------------------------------------------------
VLAN	Name		Mode		Mapping
--------------------------------------------------------
1	DEFAULT_VLAN_1	native-untagged	port
10	Sales		trunk		port
20	Services	trunk		port

Native VLAN 구성 (Configuration)

앞서 말한 것과 같이 모든 VLAN 트래픽은 Native VLAN (기본값: VLAN 1)을 제외하고 Trunk 링크를 통과하도록 태그가 지정됩니다. 하지만, 필요하다면 Native VLAN의 값을 변경할 수 있습니다.

아래의 예시는 Native VLAN의 값을 VLAN 10으로 변경합니다.

SW1(config)# interface 1/1/24
SW1(config-if)# vlan trunk native 10

Native VLAN 값을 변경할 경우에는 서로 연결된 두 스위치 모두 변경해야만 합니다. 그래서 변경할 경우 반드시 양방향 스위치의 값이 모두 변경되었는지 확인해야 합니다.

지난번에 배웠던 “show lldp neighbor-info” 명령어를 사용하여 어떤 스위치가 Trunk 인터페이스(1/1/24)에 연결되었는지 확인 가능합니다.

“show vlan port” 명령어를 사용하여 변경한 값을 확인할 수 있습니다.

SW1# show vlan port 1/1/24
--------------------------------------------------------
VLAN	Name		Mode		Mapping
--------------------------------------------------------
1	DEFAULT_VLAN_1	trunk		port
10	Sales		native-untagged	port
20	Services	trunk		port