infra
Platform

모듈 맵

[Network] Port Security와 VLAN 필터링 기초

0 / 35 완료

펼치기
0 / 35 완료0%

Networking · 25 / 35

[Network] Port Security와 VLAN 필터링 기초

VLAN이 왜 필요한지, 개발망/운영망 분리가 어떻게 동작하는지, 클라우드 보안 그룹이 이걸 어떻게 대체하는지 이해합니다

🚨INCIDENT ALERT
HIGH

개발망과 운영망을 분리했다고 들었는데 실제로는 같은 브로드캐스트 도메인에 섞여 있었습니다. 한쪽의 실험 트래픽이 다른 망까지 영향을 주며 장애 범위가 커졌습니다.

VLAN은 물리 스위치를 더 사지 않고도 논리적으로 망을 나누는 방법입니다. 어디까지 같은 L2인지 알아야 장애 전파를 막을 수 있습니다.

VLAN과 논리적 망 분리

물리적인 네트워크 장비 하나로 여러 개의 독립된 네트워크처럼 운영할 수 있다면 어떨까요? VLAN(Virtual LAN)은 바로 이것을 가능하게 합니다. 개발망, 운영망, 관리망을 물리적으로 완전히 분리하지 않아도, VLAN 태그 하나로 논리적인 분리와 보안을 동시에 달성할 수 있습니다.


이번 챕터에서 배울 것
  • 1브로드캐스트 도메인 개념과 VLAN이 필요한 이유
  • 2VLAN의 동작 방식 — Access 포트와 Trunk 포트
  • 3개발망/운영망/관리망 논리적 분리 설계 패턴
  • 4클라우드에서의 대응 — VPC 서브넷, 보안 그룹이 VLAN을 대체하는 방식
실습 환경 준비
현재 네트워크 인터페이스 목록 확인
ip link show
VLAN 커널 모듈 로드 확인
lsmod | grep 8021q || sudo modprobe 8021q
vlan 패키지(vconfig) 설치 — 레거시 도구 실습 시 필요
sudo apt-get install -y vlan
VLAN 인터페이스는 실물 스위치 없이도 리눅스 브리지로 실습 가능

가상 환경(KVM, VirtualBox, VMware)에서 스위치 포트를 Trunk 모드로 설정하면 실제 태깅 동작을 확인할 수 있습니다.

VLAN 기본 개념

💡개념

브로드캐스트 도메인과 VLAN의 필요성

같은 스위치에 연결된 개발서버와 운영서버가 있습니다. 개발팀이 실수로 브로드캐스트 폭풍을 일으켰고, 트래픽이 운영 서버까지 덮쳐서 응답 지연이 발생했습니다. 네트워크를 물리적으로 분리하지 않으면 이런 사고가 반복됩니다. VLAN은 물리 장비를 추가하지 않고 네트워크를 논리적으로 분리하는 방법으로, 이 원리를 이해하면 클라우드의 VPC 개념도 자연스럽게 연결됩니다.

브로드캐스트 도메인과 VLAN의 필요성

브로드캐스트 도메인이란

이더넷 네트워크에서 ARP, DHCP 등의 브로드캐스트 패킷은 같은 L2 세그먼트의 모든 호스트에게 전달됩니다. 이 범위를 브로드캐스트 도메인이라고 합니다.

스위치 1대에 100대 서버 연결 시 (VLAN 없음)

서버 A가 ARP 브로드캐스트 전송
    ↓
서버 B, C, D ... Z (99대) 전부 수신 및 처리
→ 불필요한 CPU 소모
→ 보안 문제 (내부 망 구조 노출)
→ 장애 전파 범위 넓음

VLAN으로 브로드캐스트 도메인 분리

VLAN은 물리 스위치를 논리적으로 나눠 각 그룹이 서로의 브로드캐스트를 보지 못하게 합니다. 아래 구조에서 개발망의 ARP는 운영망 서버에 전혀 전달되지 않습니다.

VLAN 10 (개발망): 서버 A, B, C
VLAN 20 (운영망): 서버 D, E, F
VLAN 30 (관리망): 서버 G, H

서버 A가 ARP 브로드캐스트 전송
    ↓
VLAN 10 내의 서버 B, C만 수신
서버 D~H는 수신하지 않음 ← 격리 성공!

VLAN이 해결하는 문제들

문제VLAN 없음VLAN 있음
보안 격리같은 스위치면 같은 망VLAN별 완전 격리
브로드캐스트 부하모든 호스트가 수신VLAN 내부만 수신
물리 장비 비용망별 스위치 필요스위치 1대로 분리 가능
망 확장성물리 케이블 재배선포트 설정만 변경

언제 VLAN이 필요한가

  • 개발/스테이징/운영 환경을 같은 물리 인프라에서 분리할 때
  • PCI-DSS, HIPAA 등 컴플라이언스 요구 보안 분리
  • 멀티테넌트 환경에서 고객 간 격리
  • IoT/OT 장비를 IT 네트워크와 분리
💡개념

802.1Q VLAN Tagging — Trunk와 Access 포트

VLAN을 설정했는데 같은 VLAN 내에서도 통신이 안 됩니다. 스위치 포트 설정을 보면 어떤 포트는 access mode, 어떤 포트는 trunk mode로 되어 있습니다. 이 차이를 모르면 잘못 설정해도 어디가 틀린지 찾을 수 없습니다. 802.1Q 태깅이 어떻게 VLAN 정보를 프레임에 실어 나르는지 이해해야 포트 설정이 왜 이렇게 나뉘는지 납득이 됩니다.

802.1Q VLAN Tagging — Trunk와 Access 포트

802.1Q 프레임 구조

802.1Q 표준은 이더넷 프레임에 4바이트의 VLAN 태그를 삽입합니다.

일반 이더넷 프레임:
┌──────────┬──────────┬──────┬────────────┬─────┐
│ Dst MAC  │ Src MAC  │ Type │  Payload   │ FCS │
│  6 bytes │  6 bytes │ 2 B  │            │ 4 B │
└──────────┴──────────┴──────┴────────────┴─────┘

802.1Q Tagged 프레임:
┌──────────┬──────────┬────────┬──────┬────────────┬─────┐
│ Dst MAC  │ Src MAC  │  Tag   │ Type │  Payload   │ FCS │
│  6 bytes │  6 bytes │ 4 bytes│ 2 B  │            │ 4 B │
└──────────┴──────────┴────────┴──────┴────────────┴─────┘
                              ↑
                    ┌─────────────────┐
                    │  TPID: 0x8100   │  2 bytes
                    │  PCP (3bits)    │
                    │  DEI (1bit)     │
                    │  VID (12bits)   │  VLAN ID: 1~4094
                    └─────────────────┘

VID(VLAN Identifier)는 12비트이므로 최대 4094개의 VLAN을 구성할 수 있습니다.

Access 포트 vs Trunk 포트

Access 포트 — 일반 서버/PC 연결용

스위치 Access 포트 (VLAN 10)
    │
    │  태그 없는 일반 프레임 ──▶ 수신 후 VLAN 10 태그 추가
    │  VLAN 10 태그 프레임 ──▶  태그 제거 후 전송
    │
    ▼
PC 또는 서버 (VLAN 모름)

Trunk 포트 — 스위치 간 또는 서버 VLAN 트렁킹용

스위치 Trunk 포트
    │
    │  VLAN 10 태그 프레임 ──▶ 그대로 통과
    │  VLAN 20 태그 프레임 ──▶ 그대로 통과
    │  VLAN 30 태그 프레임 ──▶ 그대로 통과
    │
    ▼
상대 스위치 또는 서버 (VLAN 인식)

PVID (Port VLAN ID)

Access 포트의 기본 VLAN을 PVID 또는 Native VLAN이라고 합니다. 태그 없는 프레임이 들어오면 해당 포트의 PVID로 처리됩니다.

스위치 포트 설정:
- 포트 1: PVID=10 (개발망 서버)
- 포트 2: PVID=20 (운영망 서버)
- 포트 24: Trunk (다른 스위치 연결)

리눅스 서버에서의 VLAN 처리

리눅스 서버를 스위치 Trunk 포트에 연결하면, 서버에서 직접 VLAN을 처리할 수 있습니다.

물리 NIC (eth0) ─── Trunk 포트 연결
    │
    ├── eth0.10 (VLAN 10: 192.168.10.x)
    ├── eth0.20 (VLAN 20: 192.168.20.x)
    └── eth0.30 (VLAN 30: 192.168.30.x)

이를 통해 NIC 하나로 여러 망에 동시 접속이 가능합니다.


💡개념

클라우드에서 VLAN의 개념이 어떻게 사용되는가

온프레미스에서는 VLAN으로 망을 분리하지만, AWS/GCP 같은 클라우드에서는 같은 개념이 다른 이름으로 구현됩니다.

클라우드에서 VLAN의 개념이 어떻게 사용되는가

온프레미스                     AWS
─────────────────────          ──────────────────────────
VLAN (L2 분리)           →    VPC 서브넷 (IP 범위 분리)
스위치 ACL               →    Security Group (포트 기반 허용/차단)
VLAN 간 라우터           →    VPC Route Table
방화벽                   →    Network ACL (NACL)

실제 대응 예시:
개발망 VLAN 10           →    10.0.1.0/24 (dev-subnet)
운영망 VLAN 20           →    10.0.2.0/24 (prod-subnet)
관리망 VLAN 100          →    10.0.100.0/24 (mgmt-subnet)

클라우드 Security Group = VLAN + 방화벽 — 온프레미스의 두 계층 기능을 하나의 규칙 셋으로 통합합니다:

온프레미스: VLAN으로 격리 + 별도 방화벽 장비로 차단
AWS:        VPC 서브넷 분리 + Security Group으로 포트 제어

Security Group 규칙 예시 (DB 서버):
  Inbound:  TCP 3306  from  10.0.2.0/24 (운영 서브넷만 허용)
  Inbound:  TCP 3306  from  10.0.100.0/24 (관리 서브넷만 허용)
  Outbound: 모두 차단 (DB는 외부 연결 불필요)

개발자는 스위치를 만질 일이 없지만, "왜 이 서버가 저 서버랑 통신이 안 되는가"를 이해하려면 VLAN 개념을 알아야 VPC 서브넷 설계를 제대로 할 수 있습니다.


참고: 리눅스에서 직접 VLAN 인터페이스를 생성하는 실습(ip link add, 8021q 모듈)은 네트워크 엔지니어 영역입니다. 개발자로서 직접 스위치를 설정할 일은 없으며, 클라우드 환경에서는 콘솔/CLI로 서브넷과 보안 그룹을 관리합니다.


1리눅스에서 VLAN 인터페이스 생성 및 확인

리눅스 서버에서 VLAN 인터페이스를 직접 생성해보고, 802.1Q 태깅이 어떻게 동작하는지 확인합니다.

로컬 터미널
# 1단계: 8021q 커널 모듈 로드 확인
lsmod | grep 8021q
# 없으면 로드
sudo modprobe 8021q

# 2단계: VLAN 10 인터페이스 생성 (eth0에 연결)
sudo ip link add link eth0 name eth0.10 type vlan id 10

# 3단계: VLAN 인터페이스에 IP 할당 및 활성화
sudo ip addr add 192.168.10.100/24 dev eth0.10
sudo ip link set eth0.10 up

# 4단계: 인터페이스 목록 확인
ip link show eth0.10
# eth0.10@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
# link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

# 5단계: VLAN 상세 정보 확인
ip -d link show eth0.10
# vlan protocol 802.1Q id 10 <REORDER_HDR>  ← VLAN ID 확인
sudo ip link add link eth0 name eth0.10 type vlan id 10
🔍실행 후 확인할 것
  • ip -d link show eth0.10 에서 vlan protocol 802.1Q id 10 이 표시되는지 확인
  • ip link show 에서 eth0.10@eth0 형태로 부모 인터페이스(eth0)가 명시되는지 확인
  • lsmod | grep 8021q 로 커널 모듈이 로드됐는지 확인
  • tcpdump -i eth0 -e vlan 실행 후 eth0.10으로 패킷을 보내면 VLAN 태그가 붙어서 나가는지 확인
  • ip addr show eth0.10 에서 할당한 192.168.10.100/24 가 정상 표시되는지 확인

트러블슈팅

L2 스위치 및 VLAN 망 분리 환경의 장애 극복

실무 온프레미스 인프라 환경에서 서로 다른 VLAN ID를 사용하는 컨테이너 또는 가상 서버 간의 통신 장애가 발생하면, SRE는 L2 스위치의 태깅(Tagging) 정책과 포트 할당 오류를 가장 먼저 의심해야 합니다.

  • 네트워크 인터페이스 VLAN 수동 확인 규칙:
    • Trunk 포트 설정 점검: 스위치가 다중 VLAN 트래픽을 단일 물리 케이블로 흘려보내는 Trunk 모드로 올바르게 정의되어 있는지 점검합니다.
    • 물리 레이어 상태 점검: ip link show 명령어를 실행하여 물리 카드 포트가 LOWER_UP 상태인지 검증합니다.

증상

서버에 VLAN 인터페이스를 설정하고 IP를 잡았는데, 게이트웨이나 같은 망의 다른 서버와 통신이 전혀 안 됩니다.

로컬 터미널
# 실습 디렉토리 준비
mkdir -p /tmp/networking/part5/exam_24 && cd /tmp/networking/part5/exam_24

ping -c 4 192.168.10.1
# PING 192.168.10.1: 56 data bytes
# Request timeout for icmp_seq 0
# Request timeout for icmp_seq 1
# ...
# 100% packet loss

# ARP 테이블 확인
arp -n
# (아무것도 없거나 incomplete 상태)
ip neigh show
# 192.168.10.1 dev eth0.10  FAILED

원인 진단

로컬 터미널
# 서버측 VLAN 설정 확인
ip -d link show eth0.10
# vlan protocol 802.1Q id 10  ← 서버는 VLAN 10으로 설정됨

# 패킷 캡처로 실제 태그 확인
sudo tcpdump -i eth0 -e -n vlan
# 나가는 패킷: VLAN 10 태그가 달려서 나감

# 스위치 포트 설정 확인 (관리자에게 확인 요청 or 직접 확인)
# 스위치 포트가 Access PVID=20으로 설정되어 있다면?
# → 스위치는 VLAN 10 태그를 무시하거나 잘못된 VLAN으로 처리

문제 상황 다이어그램: VLAN trunk 설정 불일치로 발생하는 상황입니다.

서버 (eth0.10, VLAN 10으로 태깅)
    │
    │  프레임에 VLAN 10 태그 삽입
    ▼
스위치 포트 (Access 모드, PVID=20)
    │
    │  VLAN 10 태그를 받았지만 이 포트는 VLAN 20 전용!
    │  → 태그 불일치로 프레임 드랍 또는 VLAN 20으로 잘못 처리
    ▼
통신 불가!

해결 방법

해결책 1: 스위치 포트를 Trunk 모드로 변경

서버가 VLAN 인터페이스를 사용한다면 스위치 포트를 Trunk로 설정해야 합니다.

스위치 설정 (Cisco IOS 예시):
interface GigabitEthernet0/1
  switchport mode trunk
  switchport trunk allowed vlan 10,20
  no shutdown

해결책 2: 서버에서 VLAN 인터페이스를 사용하지 않고 Access 포트 PVID에 맞춤

스위치 포트가 Access VLAN 10이라면 서버에서도 별도 VLAN 태깅 없이 eth0을 직접 사용합니다.

로컬 터미널
# 잘못된 방식: VLAN 인터페이스 사용 (스위치가 Access 모드일 때)
# ip addr add 192.168.10.10/24 dev eth0.10  ← 이렇게 하면 안 됨

# 올바른 방식: 부모 인터페이스에 직접 IP 설정
sudo ip addr add 192.168.10.10/24 dev eth0

확인 체크리스트

□ 스위치 포트 모드 확인 (Access / Trunk)
□ Access 모드라면 PVID가 서버가 원하는 VLAN과 일치하는지
□ Trunk 모드라면 허용된 VLAN 목록에 해당 VLAN이 포함되는지
□ 서버에서 tcpdump로 실제 나가는 패킷의 VLAN 태그 확인
□ 서버에서 ARP 요청이 나가는지 확인

증상

작은 파일 전송은 되는데 큰 파일 전송이 안 됩니다. ping은 되지만 SCP나 HTTP 다운로드가 중간에 끊깁니다.

로컬 터미널
# 소형 패킷 ping 성공
ping -c 4 192.168.10.1
# 0% packet loss

# 대형 패킷 ping 실패
ping -c 4 -s 1472 192.168.10.1
# 100% packet loss

원인

802.1Q VLAN 태그는 이더넷 프레임에 4바이트를 추가합니다. 기본 MTU 1500에서 태그 4바이트를 포함하면 실제 데이터 페이로드는 1496바이트로 줄어듭니다. MTU 설정이 맞지 않으면 큰 패킷이 드랍됩니다.

로컬 터미널
# VLAN 인터페이스의 MTU 확인
ip link show eth0.10
# eth0.10@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500  ← 이게 문제
# 실제로는 1496이어야 함 (또는 부모 eth0을 1504로 올려야 함)

해결 방법

로컬 터미널
# 방법 1: 부모 인터페이스 MTU를 1504로 올림 (점보 프레임 지원 시)
sudo ip link set eth0 mtu 1504

# 방법 2: VLAN 인터페이스 MTU를 1496으로 내림
sudo ip link set eth0.10 mtu 1496

# 방법 3: Netplan에서 MTU 설정
# /etc/netplan/01-vlan.yaml 에서:
# vlans:
#   eth0.10:
#     mtu: 1496

검증

로컬 터미널
# 1472바이트 (ICMP 헤더 28바이트 포함하면 총 1500바이트)
ping -c 4 -s 1472 -M do 192.168.10.1
# -M do: 단편화 금지 (DF bit 설정)

실무 맥락

💼
실무 맥락
현업 패턴

3티어 네트워크 아키텍처와 VLAN

현대 데이터센터는 보통 코어-디스트리뷰션-액세스 3계층 구조이며, 각 계층 사이는 Trunk 링크로 연결됩니다.

코어 스위치 (Core)
    │ Trunk (VLAN 10,20,30,100...)
    ▼
디스트리뷰션 스위치 (Distribution)
    │ Trunk            │ Trunk
    ▼                  ▼
액세스 스위치1       액세스 스위치2
│Access VLAN10  │Access VLAN20
▼               ▼
웹 서버들       DB 서버들

서버 가상화 환경에서의 VLAN

KVM/VMware 같은 하이퍼바이저 환경에서는 물리 NIC에 VLAN Trunk를 연결하고, 가상 머신별로 다른 VLAN을 할당합니다.

로컬 터미널
# KVM 브릿지에 VLAN 설정 예시
# 물리 NIC: ens3 → Trunk 포트 연결
# VM1: VLAN 10 (개발망)
# VM2: VLAN 20 (운영망)

# libvirt 네트워크 XML 예시 (vlan-10.xml)
# <network>
#   <name>vlan10</name>
#   <forward mode='bridge'/>
#   <bridge name='br10'/>
#   <vlan tag='10'>
#     <interface dev='ens3'/>
#   </vlan>
# </network>

클라우드 환경의 VLAN 대안 — VXLAN

AWS VPC, OpenStack Neutron 등 클라우드 환경에서는 물리 VLAN 대신 **VXLAN(VLAN Extensible)**을 사용합니다. VXLAN은 UDP 터널 위에 L2를 캡슐화하여 수백만 개의 논리적 네트워크를 구성할 수 있습니다.

물리 VLAN: 최대 4094개 (12bit VID)
VXLAN:     최대 16,777,216개 (24bit VNI)

보안 관점 — VLAN은 완벽한 격리가 아님

VLAN은 편리한 논리적 분리지만, VLAN Hopping 공격에 취약할 수 있습니다.

VLAN Hopping 공격 예방 체크리스트:
□ Native VLAN을 사용하지 않는 전용 VLAN으로 설정
□ Trunk 포트에서 불필요한 VLAN 차단 (allowed vlan 명시)
□ DTP(Dynamic Trunking Protocol) 비활성화
□ VLAN 간 라우팅은 반드시 방화벽을 통과하도록 설계

완전한 보안 격리가 필요하다면 VLAN만으로는 부족하고, 물리적 분리 또는 방화벽/SDN을 함께 사용해야 합니다.


정리

VLAN 핵심 개념
├── 브로드캐스트 도메인 분리 → 트래픽 격리 + 보안
├── 802.1Q: 프레임에 4바이트 VLAN 태그 추가
│   └── VID 12bit → 최대 4094개 VLAN
├── Access 포트: 단일 VLAN, 태그 없이 전달 (PC/서버용)
└── Trunk 포트: 여러 VLAN, 태그 유지 (스위치 간 연결)

리눅스 VLAN 설정
├── modprobe 8021q (커널 모듈 로드)
├── ip link add link eth0 name eth0.10 type vlan id 10
├── ip addr add 192.168.10.10/24 dev eth0.10
└── ip link set eth0.10 up

주요 트러블슈팅
├── PVID 불일치 → ARP 실패 → 통신 단절
│   └── 스위치 포트 모드/VLAN 설정 확인
└── MTU 문제 → 대용량 패킷 드랍
    └── VLAN 태그 4바이트 오버헤드 고려

다음 챕터에서는 NAT(Network Address Translation)와 포트 포워딩을 학습하여, 사설 IP를 가진 내부 서버를 외부에서 접근 가능하게 만드는 방법을 배웁니다.

지식 확인

퀴즈 — 5문제

Q1

개발팀(VLAN 10)과 운영팀(VLAN 20)이 같은 스위치에 연결돼 있습니다. 개발팀 서버에서 운영 DB 서버로 ping이 되는 상황을 물리적 변경 없이 차단하려 합니다. 가장 적절한 방법은?

Q2

스위치 A(VLAN 10·20·30 운영)와 스위치 B(VLAN 10·20·30 운영)를 포트 하나로 연결해 세 VLAN 트래픽을 모두 전달하려 합니다. 이 연결 포트를 어떻게 설정해야 하는가?

Q3

리눅스에서 eth0에 VLAN ID 20번 인터페이스를 생성하는 올바른 명령어는?

Q4

Access 포트와 Trunk 포트의 차이점을 올바르게 설명한 것은?

Q5

스위치 포트의 PVID(VLAN ID)가 10인데 서버에서 VLAN 20 인터페이스로만 통신을 시도하면 어떤 문제가 발생합니까?

0 / 5 답변

🧪 실습으로 확인하기

포트는 열렸다는데 왜 안 되지? — ss/netstat/telnet으로 TCP 진단

초급

"포트 8080 열었는데요?"와 "왜 안 돼요?" 사이의 간극을 메우는 실습. ss로 바인딩 상태를 확인하고, telnet/nc으로 원격 연결을 테스트하고, iptables 방화벽을 진단하고, 바인딩 주소(0.0.0.0 vs 127.0.0.1)까지 수정하는 4단계 TCP 포트 진단 플로우를 완성한다.

35📋 4단계💻 직접 환경
실습 시작하기 →

이것도 배워보세요

networking고급 · 60
[Network] HAProxy 기반 L4/L7 로드밸런싱과 헬스 체크 설정
Networking 트랙 계속
docker입문 · 30
[Docker] 백엔드 개발자에게 Docker와 컨테이너 가상화가 필수인 이유
Docker 트랙 시작점