1. 개요

VLAN(Virtual LAN)은 스위치 설정만으로 하나의 LAN 을 여러 LAN 으로 나누는 기술이다. 포트마다 VLAN 번호를 정하면 같은 번호의 포트끼리만 하나의 LAN 이 된다. 선은 그대로인데 브로드캐스트가 닿는 범위가 나뉜다.

나뉜 VLAN 은 서로 완전히 다른 LAN 이다. VLAN 10 의 기기가 VLAN 20 의 기기와 통신하려면 라우터를 거쳐야 한다.

ABCD스위치 1대라우터VLAN 10VLAN 20스위치 1대를 두 판으로 나눈 것포트마다 VLAN 번호를 정한다A·B 는 10번 판, C·D 는 20번 판물결: A 의 브로드캐스트10번 판 안에서만 퍼진다C·D 에는 닿지 않는다판 사이를 건너려면라우터를 거쳐야 한다 (L3)선은 같아도 LAN 은 둘이다VLAN 은 선을 바꾸지 않고 스위치 설정만으로 LAN 을 나눈다

2. VLAN 태그

스위치는 프레임이 어느 VLAN 소속인지 알아야 한다. 이를 위해 Ethernet 헤더의 보내는 MAC 과 EtherType 사이에 4바이트 태그를 끼운다. 규격 이름을 따 802.1Q 태그라고도 부른다.

VLAN 태그가 붙은 Ethernet 프레임받는 MAC6B보내는 MAC6BVLAN 태그4BEtherType2B데이터IP 패킷FCS4B0x8100 (TPID)16비트 · 태그가 있다는 표시PCP3비트VID12비트 · VLAN 번호DEI 1비트TPID — 원래 EtherType 이 올 자리. 0x8100 이면 "뒤 2바이트는 태그" 로 읽는다PCP — 우선순위 0~7. 음성·영상 프레임을 먼저 보낼 때 쓴다DEI — 혼잡할 때 먼저 버려도 되는 프레임 표시VID — 0 과 4095 는 예약이라 실제로 쓰는 번호는 1~4094태그는 보내는 MAC 과 EtherType 사이에 끼운 4바이트 — 그중 12비트가 VLAN 번호다

태그를 끼우면 프레임이 4바이트 길어진다. Ethernet 프레임의 최대 크기가 1518바이트에서 1522바이트로 늘어나는 이유다. 스위치끼리는 이 크기를 받아 주도록 맞춰져 있다.

3. access 포트와 trunk 포트

스위치 포트는 태그를 어떻게 다루는지에 따라 둘로 나뉜다.

ACBD1020access · 태그 없음trunk · 태그로 구분스위치 1 — 태그를 붙인다스위치 2 — 태그를 뗀다주황: VLAN 10 · 보라: VLAN 20access 포트기기 쪽 포트. 한 VLAN 에만 속한다프레임에 태그가 없다trunk 포트스위치끼리 잇는 포트여러 VLAN 이 선 하나를 같이 쓴다태그를 보고 어느 VLAN 인지 안다기기는 태그를 볼 일이 없다태그는 스위치 사이 선 위에만 있다 — 기기 쪽으로 나갈 때 떼어 낸다

스위치는 access 포트로 들어온 프레임에 그 포트의 VLAN 번호로 태그를 붙여 trunk 로 보내고, 반대편 스위치는 태그를 보고 같은 VLAN 의 access 포트로 내보내면서 태그를 뗀다.

4. native VLAN

trunk 포트에 태그 없는 프레임이 들어오면 스위치는 그 프레임을 native VLAN 소속으로 본다. native VLAN 은 trunk 마다 하나씩 정하며, 기본값은 보통 VLAN 1 이다. 반대로 native VLAN 의 프레임은 trunk 로 나갈 때 태그를 붙이지 않는다.

trunk 양쪽의 native VLAN 이 다르면, 한쪽에서 VLAN 10 으로 보낸 태그 없는 프레임이 반대쪽에서 VLAN 20 으로 들어간다. 두 VLAN 이 섞이는 설정 실수라 양쪽을 같게 맞춘다.

5. VLAN 사이 통신

VLAN 이 다르면 같은 스위치에 꽂혀 있어도 서로의 MAC 에 프레임이 닿지 않는다. VLAN 마다 서브넷을 따로 두고, 그 사이를 라우터가 잇는다. 기기 입장에서는 “다른 서브넷이니 게이트웨이로 보낸다” 는 평소의 판단과 같다.

라우터 하나를 trunk 로 스위치에 연결해 여러 VLAN 의 게이트웨이를 겸하게 하기도 한다(router on a stick). 라우터 기능이 들어간 L3 스위치가 이 역할을 스위치 안에서 하기도 한다.

6. 개수 제한

VLAN 번호(VID)는 12비트다. 0 과 4095 는 예약이라 실제로 쓰는 번호는 1~4094, 약 4천 개다. 집이나 회사망에는 충분하지만, 고객마다 망을 나눠 줘야 하는 데이터센터에서는 모자랐다. 이 한계를 넘으려고 24비트 번호를 쓰는 VXLAN 이 나왔다.

7. 리눅스의 VLAN 인터페이스

리눅스에서는 실제 인터페이스 위에 VLAN 인터페이스를 만들어, 그 인터페이스로 나가는 프레임에 태그를 붙인다.

ip link add link eth0 name eth0.10 type vlan id 10    # eth0 위에 VLAN 10 인터페이스
ip addr add 192.168.10.5/24 dev eth0.10
ip link set eth0.10 up
ip -d link show eth0.10                               # vlan protocol 802.1Q id 10
# 태그가 실제로 붙는지 보기
tcpdump -i eth0 -e -n vlan                            # 출력에 "vlan 10" 이 보인다

쿠버네티스의 일반적인 CNI 는 VLAN 을 직접 쓰지 않는다. 노드 사이를 잇는 데는 VXLAN 이나 라우팅을 쓴다.

8. 관련 문서

  • LAN — VLAN 이 나누는 대상. 브로드캐스트가 닿는 범위
  • VXLAN — VLAN 의 4094 개 한계를 넘고, 떨어진 LAN 을 잇는다
  • Subnet — VLAN 마다 하나씩 짝지어 두는 주소 범위
  • ARP — VLAN 안에서만 퍼지는 브로드캐스트의 대표

9. 출처

VLAN 태그 형식은 IEEE 802.1Q 가 정의한다. VXLAN 을 정의한 RFC 7348 이 VLAN 의 역할과 4094 개 한계를 이렇게 정리한다.

“A key characteristic of Layer 2 data center networks is their use of Virtual LANs (VLANs) to provide broadcast isolation. A 12-bit VLAN ID is used in the Ethernet data frames to divide the larger Layer 2 network into multiple broadcast domains. This has served well for many data centers that require fewer than 4094 VLANs.”