📚 네트워크 · 패킷 분석 › 04. 네트워크 장비 실습 — 165편
이전 글: 164. Access Port · 다음 글: 166. 802.1Q
Trunk Port는 여러 VLAN의 프레임을 하나의 물리 링크로 함께 전달하는 포트입니다. 링크 위에서 각 프레임이 어느 VLAN 소속인지 구분하기 위해 IEEE 802.1Q 태그를 붙입니다. 태그의 구조는 다음 글 166. 802.1Q에서 다루고, 이 글은 포트로서의 설정과 운영에 집중합니다.
Trunk가 없다면 스위치 두 대가 VLAN 10·20·30을 공유하려면 VLAN마다 케이블을 하나씩 연결해야 합니다. Trunk는 이를 링크 하나로 줄입니다.
| Trunk가 쓰이는 곳 | 이유 |
|---|---|
| 스위치 ↔ 스위치 (업링크) | 여러 VLAN을 건물·층 사이에 연장 |
| 스위치 ↔ 라우터·방화벽 | 한 인터페이스에서 여러 VLAN을 라우팅 (Router-on-a-stick, 167. Inter-VLAN Routing) |
| 스위치 ↔ 가상화 호스트 | VM마다 다른 VLAN 배정 |
| 스위치 ↔ 무선 AP | SSID별로 다른 VLAN 연결 |
| SPAN 목적지 ↔ IDS 센서 | 미러링된 트래픽에 태그가 남아 있을 수 있음 |
[스위치 A] Trunk 링크 [스위치 B]
VLAN 10 포트 ─┐ ┌─ VLAN 10 포트
VLAN 20 포트 ─┼→ 태그 붙임 → [VID 10 프레임][VID 20 프레임][태그 없음] → 태그 읽고 제거 ─┼─ VLAN 20 포트
VLAN 99 포트 ─┘ (Native VLAN 99는 태그 없이) └─ VLAN 99 포트
Trunk 포트의 동작을 결정하는 세 가지 설정입니다.
| 설정 | 의미 | 기본값(Cisco 계열) |
|---|---|---|
| 허용 VLAN 목록 | 이 Trunk로 실어 나를 VLAN | 모든 VLAN (1~4094) |
| Native VLAN | 태그 없이 보내고, 태그 없이 들어온 프레임을 배정할 VLAN | VLAN 1 |
| 협상(DTP) | 상대와 Trunk 형성을 자동 협상할지 | 모델·버전에 따라 동적 모드 |
Native VLAN은 양쪽이 같아야 합니다. A는 Native를 99, B는 1로 설정하면 A의 VLAN 99 트래픽이 태그 없이 넘어가 B에서는 VLAN 1로 들어갑니다. 즉 두 VLAN이 의도치 않게 이어집니다. Cisco 계열은 CDP로 이를 감지하면 %CDP-4-NATIVE_VLAN_MISMATCH 로그를 남깁니다.
Trunk 운영에서 자주 생기는 문제와 보안 영향입니다.
| 상황 | 결과 | 보안 영향 |
|---|---|---|
| 허용 목록이 "전체" | 필요 없는 VLAN까지 모든 스위치에 전달 | 한 스위치 침해 시 노출 VLAN 증가, 브로드캐스트 범위 확대 |
| Native VLAN = VLAN 1(기본) | 관리·기본 트래픽이 태그 없이 오감 | 이중 태그 기반 VLAN Hopping 조건(166. 802.1Q) |
| Native VLAN 불일치 | 두 VLAN이 연결됨 | 구역 분리 무력화 |
| 단말 포트에서 Trunk 형성 | 단말이 여러 VLAN에 접근 | Switch Spoofing 형태 (164. Access Port) |
| 허용 목록에서 VLAN 누락 | 해당 VLAN 통신 단절 | 가용성 장애(보안 이벤트로 오인 가능) |
Trunk 보안 설정 요약입니다.
| 권고 | Cisco 계열 설정 예 |
|---|---|
| Trunk로 고정, 협상 끄기 | switchport mode trunk, switchport nonegotiate |
| 허용 VLAN 최소화 | switchport trunk allowed vlan 10,20,99 |
| Native VLAN을 미사용 VLAN으로 | switchport trunk native vlan 999 |
| Native VLAN도 태그 붙이기(지원 장비) | 전역 vlan dot1q tag native |
실습 예시 — GNS3 등에서 Cisco IOS 계열 스위치 간 Trunk 설정입니다. 값은 예시(값은 환경마다 다름)이며, encapsulation 명령은 ISL을 함께 지원하는 일부 모델에서만 필요합니다.
interface GigabitEthernet0/24
description UPLINK-TO-CORE
switchport trunk encapsulation dot1q
switchport mode trunk
switchport nonegotiate
switchport trunk native vlan 999
switchport trunk allowed vlan 10,20,99
확인 형식 예시(일부만 표시):
Switch# show interfaces trunk
Port Mode Encapsulation Status Native vlan
Gi0/24 on 802.1q trunking 999
Port Vlans allowed on trunk
Gi0/24 10,20,99
실습 예시 — Linux bridge에서 한 포트를 Trunk처럼 설정합니다(Rocky/Ubuntu 공통, VLAN 필터링이 켜진 br0 기준). pvid·untagged 없이 추가한 VLAN은 태그를 유지한 채 오갑니다.
# ens39를 VLAN 10, 20의 Trunk로 (태그 유지), 기본 VLAN 1 제거
sudo bridge vlan add dev ens39 vid 10
sudo bridge vlan add dev ens39 vid 20
sudo bridge vlan del dev ens39 vid 1
bridge vlan show dev ens39
ens39 반대편 VM에서 태그를 확인하려면 해당 인터페이스에서 tcpdump -e -nn -i <인터페이스> vlan으로 캡처합니다. NIC의 VLAN 오프로드 설정에 따라 태그가 캡처에 보이지 않을 수 있습니다.
📷 [실습 화면 삽입 위치] Trunk 반대편 VM에서
tcpdump -e -nn vlan출력에vlan 10,vlan 20태그가 붙은 프레임이 함께 보이는 화면
| 흔적 | 확인할 수 있는 것 |
|---|---|
| 스위치 설정 변경 로그 | Trunk 허용 목록·Native VLAN·모드 변경 |
| CDP·LLDP 관련 로그 | Native VLAN 불일치, 이웃 장비 변경 |
| 포트 상태 로그 | 단말 포트가 Trunk로 바뀐 사건(장비별 메시지 상이) |
| 패킷 캡처 | 단말 구간에서 보이면 안 되는 802.1Q 태그, 예상 밖 VLAN ID |
관제자가 확인할 질문
오탐 주의: SPAN 목적지 포트나 가상화 호스트 연결 포트에서 여러 VLAN 태그가 보이는 것은 정상입니다. 태그가 보인다는 사실보다 그 포트에서 보여야 할 VLAN 목록과 일치하는가를 기준으로 판단합니다.