IT·테크/인프라

사설 VLAN(Private VLAN) — VLAN 하나 안에서 다시 격리하기

레루루 2026. 8. 5. 20:54
반응형

이 글은 2021년 4월 기준 기록입니다.

 

VLAN으로 격리하려면 격리 단위마다 VLAN을 하나씩 써야 합니다. 격리할 대상이 늘어나면 VLAN 번호도, 거기 붙일 네트워크 주소도 함께 늘어납니다. 사설 VLAN은 이 비용을 줄이려는 장치입니다.

사설 VLAN은 VLAN을 아끼면서 격리를 얻는다

사설 VLAN(Private VLAN)이 노리는 것은 세 가지입니다. VLAN 개수 낭비를 줄이고, IP 주소를 절약하며, 불필요한 데이터 전송을 막아 보안을 얻습니다.

 

구조는 주VLAN(Primary)과 부VLAN(Secondary) 으로 구성됩니다. 기존의 VLAN을 주VLAN과 부VLAN으로 설정하고, 부VLAN이 주VLAN에 포함되는 형태입니다.

 

주VLAN은 외부와 통신하기 위한 VLAN이고, 여기에 붙는 포트를 프로미스큐어스 포트(promiscuous port) 라고 합니다. 부VLAN은 주VLAN 내에서 다시 VLAN을 구분하는 역할을 하며, 두 종류가 있습니다. 독립 포트(isolated port) 는 독립 포트로 설정된 VLAN 내에서 서로 통신할 수 없습니다. 커뮤니티 포트(community port) 는 같은 커뮤니티 포트끼리는 통신할 수 있습니다.

즉 격리의 강도를 포트 종류로 고르는 셈입니다. 아무와도 통신하면 안 되는 대상은 독립 포트에, 자기들끼리는 통신해야 하는 그룹은 커뮤니티 포트에 둡니다.

설정 전에 걸리는 조건들이 있다

사설 VLAN은 시작하기 전에 지켜야 할 전제가 몇 가지 있습니다.

 

사설 VLAN 설정은 반드시 vtp transparent 모드에서 해야 합니다. 그리고 부VLAN을 먼저 만드는 것이 낫습니다. 주VLAN에서 부VLAN을 연결하는 명령을 쓰기 때문입니다. 사설 VLAN이 연결된 스위치에는 동일한 VLAN을 생성해야 하고, 독립 포트에 사용할 부VLAN은 하나만 생성할 수 있습니다.

독립 포트 설정 — 아무와도 통신하지 못하게 한다

먼저 스위치 간 트렁크 구간을 잡습니다.

// 트렁크 구간 설정
SW1(config)#int e1/0
SW1(config-if)#switchport trunk encapsulation dot1q
SW1(config-if)#sw mo tr
SW1(config-if)#exit

사설 VLAN을 만들 수 있도록 VTP를 트랜스패런트 모드로 바꿉니다.

// vtp 트랜스패런트 모드로 설정
SW1(config)#vtp mode transparent

부VLAN을 먼저 만들고 독립 포트용으로 지정합니다.

// 부VLAN 생성
SW1(config)#vlan 101
SW1(config-vlan)#name Sec_for_VLAN100     // 이름 설정
SW1(config-vlan)#private-vlan isolated    // 독립 포트로 지정
SW1(config-vlan)#exit

주VLAN을 만들면서 방금 만든 부VLAN을 연결합니다.

// 주VLAN 생성
SW1(config)#vlan 100
SW1(config-vlan)#name Pri_for_VLAN101    // 이름 설정
SW1(config-vlan)#private-vlan primary    // 주VLAN으로 설정
SW1(config-vlan)#private-vlan association 101    // 소속 부 VLAN 지정
SW1(config-vlan)#exit

외부로 나가는 포트에 프로미스큐어스 역할을 주고, 주VLAN과 부VLAN 번호를 매핑합니다.

// 주VLAN 할당
SW1(config)#int e0/0
SW1(config-if)#switchport mode private-vlan promiscuous
// 스위치의 포트에 프로미스큐어스 역할을 지정
SW1(config-if)#switchport private-vlan mapping 100 101
// 주VLAN으로 작동할 때 주VLAN 번호와 부VLAN 번호를 할당
SW1(config-if)#exit

단말이 붙는 포트에는 부VLAN을 할당합니다.

// 부VLAN 할당
SW1(config)#int e2/0
SW1(config-if)#switchport mode private-vlan host
// 스위치 포트에 부VLAN을 할당
SW1(config-if)#switchport private-vlan host-association 100 101
// 부VLAN으로 작동할 때 주VLAN 번호와 부VLAN 번호를 할당
SW1(config-if)#exit

연결된 스위치에도 동일한 VLAN을 만들어야 하므로, SW2에서 같은 순서를 반복합니다.

// 트렁크 구간 설정
SW2(config)#int e1/0
SW2(config-if)#sw tr enc dot
SW2(config-if)#sw mo tr
SW2(config-if)#exit
// vtp 트랜스패런트 모드로 설정
SW2(config)#vtp mode transparent
// 부VLAN 생성
SW2(config)#vlan 101
SW2(config-vlan)#name Sec_for_VLAN100
SW2(config-vlan)#private-vlan isolated
SW2(config-vlan)#exit
// 주VLAN 생성
SW2(config)#vlan 100
SW2(config-vlan)#name Pri_for_VLAN101
SW2(config-vlan)#private-vlan primary
SW2(config-vlan)#private-vlan association 101
SW2(config-vlan)#exit

단말이 여러 대 붙는 쪽은 int range로 한 번에 처리합니다.

// 독립 포트 할당
SW2(config)#int range e2/0-1
SW2(config-if-range)#switchport mode private-vlan host
SW2(config-if-range)#switchport private-vlan host-association 100 101
SW2(config-if-range)#exit

설정이 의도대로 들어갔는지 확인합니다.

// 사설 vlan 설정 확인
SW1#sh vlan private-vlan
SW2#sh vlan private-vlan

동작 확인은 핑으로 합니다. 게이트웨이까지 가는지, 외부 인터넷까지 가는지를 각 PC에서 나눠 봅니다.

// 핑 확인(PC1, PC2, PC3에서)
ping 1.1.1.254    // 게이트웨이까지 가는지
ping 1.1.100.1    // 외부 인터넷

커뮤니티 포트 설정 — 그룹 안에서는 통신하게 둔다

커뮤니티 구성은 독립 포트 구성에 부VLAN을 하나 더 얹는 형태입니다. 독립용 VLAN 101과 커뮤니티용 VLAN 102를 각각 만들고, 주VLAN에서 둘 다 연결합니다.

SW1(config)#int e1/0
SW1(config-if)#sw tr enc dot
SW1(config-if)#sw mo tr
SW1(config-if)#exit
SW1(config)#vtp mode transparent
SW1(config)#vlan 101
SW1(config-vlan)#private-vlan isolated
SW1(config-vlan)#name Isol_for_VLAN100
SW1(config-vlan)#exit
SW1(config)#vlan 102
SW1(config-vlan)#name Comm1_for_VLAN100
SW1(config-vlan)#private-vlan community
// VLAN 102를 community로 설정
SW1(config-vlan)#exit

주VLAN에서 연결할 부VLAN을 모두 써 주어야 합니다. 하나라도 빠지면 그 부VLAN은 주VLAN을 통해 밖으로 나가지 못합니다.

SW1(config)#vlan 100
SW1(config-vlan)#name Pri_for_VLAN101_102
SW1(config-vlan)#private-vlan primary
SW1(config-vlan)#private-vlan association 101-102
// 연결할 부VLAN을 모두 써줘야 함
SW1(config-vlan)#exit

프로미스큐어스 포트의 매핑에서도 마찬가지입니다.

SW1(config)#int e0/0
SW1(config-if)#switchport mo private-vlan promiscuous
SW1(config-if)#switchport private-vlan mapping 100 101-102
// 연결할 부VLAN을 모두 써줘야 함
SW1(config-if)#exit
SW1(config)#int e2/0
SW1(config-if)#switchport mode private-vlan host
SW1(config-if)#switchport private-vlan host-association 100 101
SW1(config-if)#exit

SW2도 같은 구성을 갖추되, 단말 포트는 커뮤니티 VLAN인 102에 붙입니다.

SW2(config)#int e1/0
SW2(config-if)#switchport tr enc dot
SW2(config-if)#sw mo tr
SW2(config-if)#exit
SW2(config)#vtp mode transparent
SW2(config)#vlan 101
SW2(config-vlan)#name Isol_for_VLAN100
SW2(config-vlan)#private-vlan isolated
SW2(config-vlan)#exit
SW2(config)#vlan 102
SW2(config-vlan)#name Comm1_for_VLAN100
SW2(config-vlan)#private-vlan community
SW2(config-vlan)#exit
SW2(config)#vlan 100
SW2(config-vlan)#name Pri_for_VLAN101_102
SW2(config-vlan)#private-vlan primary
SW2(config-vlan)#private-vlan association 101-102
SW2(config-vlan)#exit
SW2(config)#int range e2/0-1
SW2(config-if-range)#switchport mode private-vlan host
SW2(config-if-range)#switchport private-vlan host-association 100 102
SW2(config-if-range)#exit

프로미스큐어스 포트는 여러 개 둘 수 있다

외부로 나가는 경로가 하나뿐일 필요는 없습니다. int range로 여러 포트를 한꺼번에 프로미스큐어스로 지정할 수 있습니다.

먼저 라우터 쪽에 외부망 역할을 할 루프백과 게이트웨이 주소를 잡습니다.

R1(config)#int lo0
R1(config-if)#ip add 1.1.100.1 255.255.255.0
R1(config-if)#exit
R1(config)#int e0/0
R1(config-if)#no sh
R1(config-if)#ip add 1.1.1.254 255.255.255.0
R1(config-if)#exit

SW1에서 사용할 포트를 살리고, VTP와 사설 VLAN을 앞서와 같은 순서로 설정합니다.

SW1(config)#int range e0/0,e1/0,e2/0
SW1(config-if-range)#no sh
SW1(config-if-range)#exit
SW1(config)#vtp mode transparent
SW1(config)#vlan 101
SW1(config-vlan)#name isol_for_VLAN100
SW1(config-vlan)#private-vlan isolated
SW1(config-vlan)#exit
SW1(config)#vlan 100
SW1(config-vlan)#name pri_for_VLAN101
SW1(config-vlan)#private-vlan primary
SW1(config-vlan)#private-vlan association 101
SW1(config-vlan)#exit
SW1(config)#int e1/0
SW1(config-if)#sw tr enc dot
SW1(config-if)#sw mo tr
SW1(config-if)#exit

여기가 앞선 구성과 갈리는 지점입니다. 두 포트를 한 번에 프로미스큐어스로 지정합니다.

SW1(config)#int range e0/0,e2/0
SW1(config-if-range)#sw mo pri promiscuous
SW1(config-if-range)#sw pri mapping 100 101
SW1(config-if-range)#exit

SW2 쪽은 동일한 사설 VLAN을 만들고 단말 포트를 부VLAN에 붙입니다.

SW2(config)#int range e1/0,e2/0-1
SW2(config-if-range)#no sh
SW2(config-if-range)#exit
SW2(config)#vtp mode transparent
SW2(config)#vlan 101
SW2(config-vlan)#name isol_for_VLAN100
SW2(config-vlan)#private-vlan isolated
SW2(config-vlan)#exit
SW2(config)#vlan 100
SW2(config-vlan)#name pri_for_VLAN101
SW2(config-vlan)#private-vlan primary
SW2(config-vlan)#private-vlan association 101
SW2(config-vlan)#exit
SW2(config)#int e1/0
SW2(config-if)#sw tr enc dot
SW2(config-if)#sw mo tr
SW2(config-if)#exit
SW2(config)#int range e2/0-1
SW2(config-if-range)#sw mo private-vlan host
SW2(config-if-range)#sw private-vlan host-association 100 101
SW2(config-if-range)#exit

PC에는 라우터를 게이트웨이로 지정합니다.

PC1> ip 1.1.1.1/24 1.1.1.254
PC2> ip 1.1.1.2/24 1.1.1.254
PC3> ip 1.1.1.3/24 1.1.1.254

부VLAN이 SVI를 쓰게 하려면 매핑이 하나 더 필요하다

게이트웨이를 라우터가 아니라 스위치의 SVI로 두는 구성도 가능합니다. 위 설정에서 이어서 진행합니다.

주VLAN에 SVI를 만들어 IP를 주고, 부VLAN이 그 SVI를 쓸 수 있도록 매핑합니다.

SW1(config)#int vlan 100
SW1(config-if)#ip add 1.1.1.253 255.255.255.0
SW1(config-if)#no sh
SW1(config-if)#private-vlan mapping 101
// vlan 101번이 vlan 100번의 SVI를 사용할 수 있게 연결
*Jan 13 02:13:29.491: %PV-6-PV_MSG: Created a private vlan mapping, Primary 100, Secondary 101
SW1(config-if)#exit

SVI가 게이트웨이 역할을 하려면 스위치에서 라우팅이 켜져 있어야 하고, 밖으로 나가는 기본 경로도 필요합니다.

SW1(config)#ip routing
SW1(config)#ip route 0.0.0.0 0.0.0.0 1.1.1.254

이제 PC의 게이트웨이를 라우터가 아닌 SVI 주소로 바꿉니다.

PC1> ip 1.1.1.1/24 1.1.1.253
PC2> ip 1.1.1.2/24 1.1.1.253
PC3> ip 1.1.1.3/24 1.1.1.253

VLAN을 하나 더 만드는 대신 VLAN 하나를 안에서 쪼개는 것 — 사설 VLAN이 하는 일은 그것뿐이지만, 격리 단위가 많은 환경에서는 이 차이가 크게 벌어집니다.

반응형