본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 5. · 13 Views
스위치와 MAC 주소 학습 완벽 가이드
네트워크의 핵심 장비인 스위치가 어떻게 데이터를 전달하는지, MAC 주소를 학습하고 관리하는 원리를 알아봅니다. VLAN을 통한 네트워크 분리까지 초급자도 쉽게 이해할 수 있도록 설명합니다.
목차
1. 스위치란
김개발 씨는 새로운 회사에 입사한 첫날, IT 인프라팀에서 네트워크 장비들을 소개받았습니다. "이건 스위치예요.
우리 회사 모든 컴퓨터가 이걸 통해서 통신하죠." 선배의 설명을 듣던 김개발 씨는 문득 궁금해졌습니다. 스위치가 정확히 무슨 일을 하는 걸까요?
**스위치(Switch)**는 네트워크에서 여러 장치들을 연결하고, 데이터를 목적지까지 정확하게 전달하는 장비입니다. 마치 우체국 분류 센터에서 편지를 받는 사람의 주소를 보고 정확한 배달부에게 전달하는 것과 같습니다.
스위치를 이해하면 네트워크가 어떻게 효율적으로 데이터를 주고받는지 알 수 있습니다.
다음 코드를 살펴봅시다.
# 스위치의 기본 동작을 시뮬레이션하는 코드
class Switch:
def __init__(self, name, port_count):
self.name = name
# 스위치의 포트 수 설정
self.ports = {i: None for i in range(1, port_count + 1)}
# MAC 주소 테이블 초기화
self.mac_table = {}
def connect_device(self, port, device_mac):
# 장치를 특정 포트에 연결
self.ports[port] = device_mac
print(f"포트 {port}에 장치 {device_mac} 연결됨")
def show_ports(self):
# 현재 포트 연결 상태 출력
for port, mac in self.ports.items():
status = mac if mac else "비어있음"
print(f"포트 {port}: {status}")
김개발 씨는 입사 첫날부터 회사 네트워크에 대해 배우기 시작했습니다. IT 인프라팀의 박시니어 씨가 서버실을 안내해 주며 말했습니다.
"저기 보이는 장비가 스위치예요. 우리 회사의 모든 통신이 저 장비를 거쳐간답니다." 김개발 씨는 고개를 갸웃거렸습니다.
"라우터랑 뭐가 다른 거예요?" 박시니어 씨가 웃으며 설명을 시작했습니다. "좋은 질문이에요.
쉽게 설명해 드릴게요." 그렇다면 스위치란 정확히 무엇일까요? 쉽게 비유하자면, 스위치는 마치 대형 건물의 우편물 분류실과 같습니다.
건물에 도착한 모든 우편물은 분류실에서 받는 사람의 호수를 확인하고, 정확한 층과 방으로 전달됩니다. 편지를 건물 전체에 뿌리는 것이 아니라, 딱 받아야 할 사람에게만 전달하는 것입니다.
스위치도 마찬가지로 네트워크에서 데이터 패킷을 받으면, 정확히 목적지 장치에만 전달합니다. 스위치가 없던 시절에는 어땠을까요?
초기 네트워크에서는 **허브(Hub)**라는 장비를 사용했습니다. 허브는 데이터를 받으면 연결된 모든 장치에 그대로 전달했습니다.
마치 아파트 전체에 확성기로 방송하는 것과 같았습니다. 101호에 택배가 왔는데, 모든 세대에 "101호 택배 왔습니다!"라고 방송하는 셈이었죠.
당연히 네트워크가 혼잡해지고, 보안 문제도 발생했습니다. 바로 이런 문제를 해결하기 위해 스위치가 등장했습니다.
스위치는 MAC 주소라는 고유한 식별자를 사용하여 각 장치를 구분합니다. 데이터 패킷이 도착하면 목적지 MAC 주소를 확인하고, 해당 장치가 연결된 포트로만 데이터를 전송합니다.
덕분에 네트워크 대역폭을 효율적으로 사용할 수 있고, 다른 장치들은 불필요한 데이터를 받지 않습니다. 위의 코드를 살펴보면, Switch 클래스는 포트와 MAC 주소 테이블을 관리합니다.
connect_device 메서드로 장치를 포트에 연결하고, mac_table에 어떤 MAC 주소가 어떤 포트에 있는지 기록합니다. 이것이 스위치의 가장 기본적인 동작 원리입니다.
실제 회사에서는 수십, 수백 대의 컴퓨터가 스위치에 연결됩니다. 사무실 책상마다 있는 네트워크 케이블이 결국 스위치로 모이고, 스위치가 모든 통신을 중재합니다.
이메일을 보내거나 파일을 공유할 때, 데이터는 스위치를 거쳐 정확한 목적지로 전달됩니다. 박시니어 씨의 설명을 들은 김개발 씨가 고개를 끄덕였습니다.
"아, 그래서 스위치가 네트워크의 핵심 장비라고 하는 거군요!" 스위치를 이해하면 네트워크 트러블슈팅의 기초를 다질 수 있습니다. 네트워크 문제가 발생했을 때 스위치의 동작 원리를 알면, 어디서 문제가 생겼는지 추론할 수 있습니다.
실전 팁
💡 - 스위치는 OSI 7계층 중 2계층(데이터 링크 계층)에서 동작합니다
- 관리형 스위치는 웹 인터페이스나 CLI로 설정을 변경할 수 있습니다
- 가정용 공유기에도 스위치 기능이 내장되어 있습니다
2. 스위치의 특징과 허브와의 차이
다음 날, 김개발 씨는 회의실에서 네트워크 교육을 받게 되었습니다. 강사가 화이트보드에 두 개의 그림을 그렸습니다.
"왼쪽은 허브, 오른쪽은 스위치입니다. 둘의 차이를 아시는 분?" 김개발 씨는 어제 박시니어 씨에게 들은 이야기가 떠올랐습니다.
허브는 받은 데이터를 모든 포트로 전송하는 단순한 장비이고, 스위치는 목적지 MAC 주소를 확인하여 해당 포트로만 전송하는 지능형 장비입니다. 마치 허브는 교실에서 선생님이 모든 학생에게 말하는 것이고, 스위치는 특정 학생에게만 귓속말하는 것과 같습니다.
이 차이가 네트워크 성능과 보안에 큰 영향을 미칩니다.
다음 코드를 살펴봅시다.
# 허브와 스위치의 동작 차이 시뮬레이션
class Hub:
def __init__(self, port_count):
self.ports = list(range(1, port_count + 1))
def forward_frame(self, source_port, data):
# 허브: 모든 포트로 데이터 전송 (브로드캐스트)
print(f"허브: 포트 {source_port}에서 받은 데이터를 모든 포트로 전송")
for port in self.ports:
if port != source_port:
print(f" -> 포트 {port}로 전송: {data}")
class Switch:
def __init__(self, port_count):
self.ports = list(range(1, port_count + 1))
self.mac_table = {} # MAC 주소 테이블
def forward_frame(self, source_port, source_mac, dest_mac, data):
# 스위치: MAC 테이블을 참조하여 특정 포트로만 전송
self.mac_table[source_mac] = source_port # 출발지 MAC 학습
if dest_mac in self.mac_table:
dest_port = self.mac_table[dest_mac]
print(f"스위치: 포트 {dest_port}로만 전송: {data}")
else:
print(f"스위치: 목적지 모름, 플러딩 수행")
네트워크 교육 시간, 강사가 재미있는 비유로 설명을 시작했습니다. "여러분, 허브와 스위치의 차이를 식당에 비유해 볼게요." 허브는 마치 시끄러운 푸드코트와 같습니다.
주문 번호가 나오면 확성기로 전체 푸드코트에 방송합니다. "15번 손님, 음식 나왔습니다!" 모든 손님이 이 방송을 듣게 되고, 자기 번호인지 확인해야 합니다.
손님이 많아질수록 시끄럽고 혼잡해집니다. 반면 스위치는 고급 레스토랑의 웨이터와 같습니다.
웨이터는 각 테이블 번호를 기억하고 있어서, 음식이 나오면 해당 테이블로 직접 가져다줍니다. 다른 테이블 손님은 전혀 방해받지 않습니다.
기술적으로 살펴보면, 이 차이는 **충돌 도메인(Collision Domain)**이라는 개념과 연결됩니다. 허브는 모든 포트가 하나의 충돌 도메인을 공유합니다.
두 장치가 동시에 데이터를 보내면 충돌이 발생하고, 다시 전송해야 합니다. 연결된 장치가 많을수록 충돌 가능성이 높아지고 네트워크 속도가 느려집니다.
스위치는 각 포트가 독립적인 충돌 도메인을 가집니다. 포트 1과 포트 2가 통신하는 동안, 포트 3과 포트 4도 동시에 통신할 수 있습니다.
마치 여러 개의 독립된 대화가 동시에 진행되는 것과 같습니다. 위의 코드에서 Hub 클래스의 forward_frame 메서드를 보면, 출발 포트를 제외한 모든 포트로 데이터를 전송합니다.
반면 Switch 클래스는 mac_table을 확인하여 목적지 MAC 주소가 어느 포트에 있는지 찾고, 해당 포트로만 전송합니다. 보안 측면에서도 큰 차이가 있습니다.
허브를 사용하면 네트워크에 연결된 모든 장치가 다른 장치의 통신 내용을 엿볼 수 있습니다. 스니핑 공격에 매우 취약합니다.
스위치는 데이터를 해당 포트로만 전송하므로 이런 위험이 크게 줄어듭니다. 현재 허브는 거의 사용되지 않습니다.
가격 차이도 크지 않고, 스위치의 장점이 압도적이기 때문입니다. 오래된 장비실에서나 볼 수 있는 유물이 되었습니다.
김개발 씨가 손을 들었습니다. "그럼 지금은 허브를 전혀 안 쓰는 건가요?" 강사가 대답했습니다.
"네트워크 패킷을 분석해야 할 때 일부러 허브를 쓰기도 해요. 모니터링 장비로 모든 트래픽을 볼 수 있거든요.
하지만 그것도 요즘은 스위치의 포트 미러링 기능으로 대체되고 있습니다."
실전 팁
💡 - 스위치는 전이중(Full-Duplex) 통신을 지원하여 동시에 송수신이 가능합니다
- 허브는 반이중(Half-Duplex) 통신만 지원합니다
- 포트 미러링을 사용하면 스위치에서도 트래픽 모니터링이 가능합니다
3. MAC 주소 학습
점심시간, 김개발 씨는 박시니어 씨와 함께 식사하며 질문했습니다. "스위치가 어떻게 어떤 장치가 어느 포트에 있는지 아는 거예요?" 박시니어 씨가 젓가락을 내려놓으며 말했습니다.
"좋은 질문이에요. 바로 MAC 주소 학습이라는 과정을 거치거든요."
**MAC 주소 학습(MAC Address Learning)**은 스위치가 네트워크 프레임의 출발지 MAC 주소를 확인하여 어떤 장치가 어느 포트에 연결되어 있는지 기억하는 과정입니다. 마치 새 학기에 선생님이 학생들의 자리를 파악하는 것과 같습니다.
처음에는 모르지만, 학생들이 발표할 때마다 "아, 김철수는 3번째 줄에 앉아있구나"라고 기억하게 됩니다.
다음 코드를 살펴봅시다.
class Switch:
def __init__(self):
# MAC 주소 테이블: {MAC주소: (포트번호, 타임스탬프)}
self.mac_table = {}
def learn_mac_address(self, frame, ingress_port):
# 프레임에서 출발지 MAC 주소 추출
source_mac = frame['source_mac']
# MAC 주소 테이블에 학습 (출발지 MAC -> 수신 포트)
self.mac_table[source_mac] = {
'port': ingress_port,
'timestamp': time.time()
}
print(f"학습: MAC {source_mac}는 포트 {ingress_port}에 연결됨")
def lookup_mac(self, dest_mac):
# 목적지 MAC 주소로 포트 조회
if dest_mac in self.mac_table:
return self.mac_table[dest_mac]['port']
return None # 모르면 None 반환 (플러딩 필요)
# 사용 예시
switch = Switch()
frame = {'source_mac': 'AA:BB:CC:DD:EE:01', 'dest_mac': 'AA:BB:CC:DD:EE:02'}
switch.learn_mac_address(frame, ingress_port=1)
박시니어 씨가 냅킨에 그림을 그리며 설명을 시작했습니다. "스위치를 처음 켜면 아무것도 모르는 상태예요.
MAC 주소 테이블이 비어있죠." 스위치가 켜진 직후, 컴퓨터 A가 컴퓨터 B에게 데이터를 보내려고 합니다. 이때 스위치는 아직 아무것도 모릅니다.
컴퓨터 A도 어디있는지, 컴퓨터 B도 어디있는지 모릅니다. 그런데 여기서 중요한 일이 일어납니다.
컴퓨터 A가 보낸 프레임이 스위치의 포트 1로 들어옵니다. 스위치는 이 프레임의 출발지 MAC 주소를 확인합니다.
"AA:BB:CC:DD:EE:01이라는 MAC 주소를 가진 장치가 포트 1에 연결되어 있구나!" 스위치는 이 정보를 MAC 주소 테이블에 기록합니다. 이것이 바로 MAC 주소 학습입니다.
스위치는 프레임을 받을 때마다 출발지 MAC 주소를 확인하고 학습합니다. 그렇다면 목적지는 어떻게 찾을까요?
아직 컴퓨터 B의 위치를 모르므로, 스위치는 **플러딩(Flooding)**을 수행합니다. 프레임이 들어온 포트를 제외한 모든 포트로 프레임을 전송합니다.
이 중 컴퓨터 B가 연결된 포트로도 프레임이 전달됩니다. 컴퓨터 B가 응답 프레임을 보내면, 스위치는 또다시 학습합니다.
"AA:BB:CC:DD:EE:02라는 MAC 주소를 가진 장치가 포트 3에 연결되어 있구나!" 이제 스위치는 두 컴퓨터의 위치를 모두 알게 되었습니다. 다음부터 컴퓨터 A와 B가 통신할 때는 플러딩이 필요 없습니다.
스위치가 MAC 주소 테이블을 참조하여 정확한 포트로만 프레임을 전송합니다. 위의 코드에서 learn_mac_address 메서드가 이 과정을 구현합니다.
프레임이 들어오면 source_mac을 추출하고, 수신 포트와 함께 mac_table에 저장합니다. lookup_mac 메서드는 목적지 MAC 주소로 포트를 조회합니다.
김개발 씨가 감탄했습니다. "오, 스위치가 스스로 학습하는 거군요!
따로 설정할 필요가 없네요." 박시니어 씨가 고개를 끄덕였습니다. "맞아요, 그래서 **플러그 앤 플레이(Plug and Play)**라고도 해요.
케이블만 연결하면 알아서 동작하죠." 이런 자동 학습 덕분에 네트워크 관리자는 수백 대의 장치를 일일이 등록할 필요가 없습니다. 스위치가 알아서 네트워크 토폴로지를 파악합니다.
실전 팁
💡 - MAC 주소 학습은 프레임의 출발지 주소만 사용합니다
- 목적지를 모르면 플러딩, 알면 해당 포트로만 전송합니다
- 이 과정은 투명 브리징(Transparent Bridging)이라고도 불립니다
4. MAC 주소 테이블 관리
교육이 끝난 후, 김개발 씨는 실습을 위해 스위치 관리 화면에 접속했습니다. MAC 주소 테이블을 확인하니 수백 개의 항목이 있었습니다.
"이렇게 많은 MAC 주소를 어떻게 관리하는 거지?" 옆에서 보던 박시니어 씨가 말했습니다. "에이징 타이머라는 게 있어요.
스위치가 알아서 정리하거든요."
스위치의 MAC 주소 테이블은 무한히 커지지 않습니다. **에이징 타이머(Aging Timer)**를 사용하여 일정 시간 동안 사용되지 않은 항목을 자동으로 삭제합니다.
마치 도서관에서 오래 대출되지 않은 책 카드를 정리하는 것과 같습니다. 또한 장치가 다른 포트로 이동하면 테이블을 업데이트하여 네트워크 변화에 적응합니다.
다음 코드를 살펴봅시다.
import time
class MACTableManager:
def __init__(self, aging_time=300): # 기본 에이징 시간: 300초
self.mac_table = {}
self.aging_time = aging_time
def add_entry(self, mac_address, port):
# MAC 주소 엔트리 추가 또는 갱신
self.mac_table[mac_address] = {
'port': port,
'last_seen': time.time()
}
def age_out_entries(self):
# 에이징 타이머 만료된 엔트리 삭제
current_time = time.time()
expired = []
for mac, info in self.mac_table.items():
if current_time - info['last_seen'] > self.aging_time:
expired.append(mac)
print(f"에이징 아웃: {mac} (마지막 활동: {self.aging_time}초 전)")
for mac in expired:
del self.mac_table[mac]
def update_entry(self, mac_address, new_port):
# 장치 이동 시 포트 업데이트
if mac_address in self.mac_table:
old_port = self.mac_table[mac_address]['port']
if old_port != new_port:
print(f"포트 변경: {mac_address} 포트{old_port} -> 포트{new_port}")
self.add_entry(mac_address, new_port)
김개발 씨가 스위치 CLI에서 show mac address-table 명령을 입력하자, 화면에 수많은 항목이 나타났습니다. "와, 진짜 많네요.
이게 다 뭐예요?" 박시니어 씨가 화면을 가리키며 설명했습니다. "여기 보이는 각 줄이 하나의 MAC 주소 엔트리예요.
VLAN, MAC 주소, 타입, 포트 정보가 있죠." 스위치의 MAC 주소 테이블은 메모리에 저장됩니다. 당연히 메모리는 무한하지 않습니다.
만약 모든 MAC 주소를 영원히 저장한다면 어떻게 될까요? 첫째, 메모리가 가득 찰 것입니다.
둘째, 더 이상 사용하지 않는 장치의 정보가 계속 남아있게 됩니다. 셋째, 장치가 다른 포트로 이동해도 예전 정보가 남아 문제를 일으킬 수 있습니다.
이 문제를 해결하기 위해 에이징 타이머가 존재합니다. 에이징 타이머의 기본값은 대부분 **300초(5분)**입니다.
스위치는 각 MAC 주소 엔트리에 마지막으로 해당 MAC 주소를 본 시간을 기록합니다. 300초 동안 해당 MAC 주소의 프레임을 받지 못하면, 그 엔트리를 테이블에서 삭제합니다.
만약 해당 장치가 다시 통신을 시작하면 어떻게 될까요? 스위치는 다시 MAC 주소를 학습하면 됩니다.
잠깐의 플러딩이 발생하겠지만, 이내 정상적으로 동작합니다. 에이징 타이머가 갱신되는 시점도 중요합니다.
해당 MAC 주소를 출발지로 하는 프레임이 들어올 때마다 타이머가 리셋됩니다. 지속적으로 통신하는 장치는 에이징 아웃되지 않습니다.
위의 코드에서 age_out_entries 메서드가 이 과정을 구현합니다. 현재 시간과 마지막 활동 시간을 비교하여 aging_time을 초과한 엔트리를 삭제합니다.
또 다른 중요한 기능은 포트 변경 감지입니다. 노트북 사용자가 회의실로 이동하여 다른 포트에 연결했다고 가정해봅시다.
스위치는 같은 MAC 주소가 다른 포트에서 나타나면, 테이블을 즉시 업데이트합니다. update_entry 메서드에서 이 로직을 볼 수 있습니다.
기존 포트와 새 포트가 다르면 로그를 남기고 정보를 갱신합니다. 김개발 씨가 물었습니다.
"그럼 에이징 시간을 바꿀 수도 있나요?" 박시니어 씨가 대답했습니다. "물론이죠.
환경에 따라 조절할 수 있어요. 장치 이동이 잦은 환경에서는 짧게, 안정적인 환경에서는 길게 설정하기도 합니다."
실전 팁
💡 - 대부분의 스위치는 에이징 타이머 기본값이 300초입니다
- 정적 MAC 엔트리는 에이징되지 않고 영구적으로 유지됩니다
- MAC 테이블이 가득 차면 보안 문제가 발생할 수 있습니다 (MAC flooding 공격)
5. VLAN 개념
며칠 후, 김개발 씨는 새로운 프로젝트를 맡게 되었습니다. 재무팀과 개발팀의 네트워크를 분리해 달라는 요청이었습니다.
"물리적으로 스위치를 따로 설치해야 하나요?" 김개발 씨의 질문에 박시니어 씨가 웃으며 말했습니다. "VLAN이라는 게 있어요.
하나의 스위치로도 네트워크를 분리할 수 있습니다."
**VLAN(Virtual LAN)**은 물리적으로 하나의 스위치에서 논리적으로 여러 개의 독립된 네트워크를 만드는 기술입니다. 마치 하나의 사무실 건물에서 층별로 출입증을 다르게 발급하여 구역을 분리하는 것과 같습니다.
같은 VLAN에 속한 장치들만 서로 통신할 수 있고, 다른 VLAN과는 라우터를 통해야만 통신할 수 있습니다.
다음 코드를 살펴봅시다.
class VLANSwitch:
def __init__(self):
self.vlans = {} # {vlan_id: {'name': str, 'ports': []}}
self.port_vlan = {} # {port: vlan_id}
def create_vlan(self, vlan_id, name):
# 새로운 VLAN 생성
self.vlans[vlan_id] = {'name': name, 'ports': []}
print(f"VLAN {vlan_id} ({name}) 생성됨")
def assign_port_to_vlan(self, port, vlan_id):
# 포트를 특정 VLAN에 할당
if vlan_id not in self.vlans:
print(f"오류: VLAN {vlan_id}가 존재하지 않습니다")
return
self.port_vlan[port] = vlan_id
self.vlans[vlan_id]['ports'].append(port)
print(f"포트 {port}가 VLAN {vlan_id}에 할당됨")
def can_communicate(self, port1, port2):
# 두 포트가 통신 가능한지 확인 (같은 VLAN인지)
vlan1 = self.port_vlan.get(port1)
vlan2 = self.port_vlan.get(port2)
return vlan1 == vlan2 and vlan1 is not None
# 사용 예시
switch = VLANSwitch()
switch.create_vlan(10, "개발팀")
switch.create_vlan(20, "재무팀")
switch.assign_port_to_vlan(1, 10)
switch.assign_port_to_vlan(2, 10)
switch.assign_port_to_vlan(3, 20)
박시니어 씨가 화이트보드에 그림을 그리기 시작했습니다. "VLAN을 이해하려면, 먼저 왜 필요한지부터 알아야 해요." 예전에는 부서별로 네트워크를 분리하려면 물리적으로 스위치를 따로 설치해야 했습니다.
개발팀 스위치, 재무팀 스위치, 영업팀 스위치를 각각 구매하고 케이블링도 따로 해야 했습니다. 비용도 많이 들고, 관리도 복잡했습니다.
더 큰 문제는 조직 변경이 있을 때였습니다. 개발팀 직원이 재무팀으로 부서 이동을 하면, 물리적으로 네트워크 케이블을 다른 스위치로 옮겨야 했습니다.
자리를 옮기지 않으면 긴 케이블을 끌어와야 하는 상황이 발생했습니다. 바로 이런 문제를 해결하기 위해 VLAN이 등장했습니다.
VLAN은 논리적인 네트워크 분리입니다. 물리적으로는 같은 스위치에 연결되어 있지만, 스위치 설정을 통해 서로 다른 네트워크처럼 동작하게 만듭니다.
쉽게 비유하자면, VLAN은 마치 아파트의 층별 보안 시스템과 같습니다. 모든 주민이 같은 건물에 살지만, 3층 출입카드로는 5층에 들어갈 수 없습니다.
같은 층 사람들끼리만 복도를 공유합니다. 위의 코드에서 VLAN 10은 개발팀, VLAN 20은 재무팀입니다.
포트 1과 2는 VLAN 10에, 포트 3은 VLAN 20에 할당되어 있습니다. can_communicate 메서드를 보면, 같은 VLAN에 속한 포트끼리만 True를 반환합니다.
VLAN의 장점을 정리해보겠습니다. 첫째, 보안이 강화됩니다.
재무팀의 민감한 데이터가 개발팀 네트워크로 유출되지 않습니다. 둘째, 브로드캐스트 도메인이 분리됩니다.
VLAN 10의 브로드캐스트는 VLAN 20으로 전달되지 않아 네트워크 효율이 높아집니다. 셋째, 유연한 관리가 가능합니다.
직원이 부서를 옮기면 스위치 설정만 변경하면 됩니다. 김개발 씨가 고개를 끄덕였습니다.
"그럼 VLAN 10과 VLAN 20이 통신하려면 어떻게 해야 하나요?" 박시니어 씨가 대답했습니다. "좋은 질문이에요.
다른 VLAN 간 통신은 라우터나 L3 스위치가 필요해요. 이걸 Inter-VLAN 라우팅이라고 합니다." VLAN은 현대 기업 네트워크의 기본 구성 요소입니다.
대부분의 기업에서 부서별, 서비스별로 VLAN을 나누어 관리합니다.
실전 팁
💡 - VLAN ID는 1부터 4094까지 사용할 수 있습니다
- VLAN 1은 기본 VLAN으로, 모든 포트가 처음에 속해있습니다
- 여러 스위치 간에 VLAN을 확장하려면 트렁크(Trunk) 포트가 필요합니다
6. 포트 기반 VLAN 설정
이제 실제로 VLAN을 설정해볼 시간입니다. 김개발 씨는 스위치 CLI에 접속하여 명령어를 입력하기 시작했습니다.
"포트 기반 VLAN이 가장 기본이에요." 박시니어 씨가 옆에서 지켜보며 안내했습니다. "각 포트가 어느 VLAN에 속할지 지정하는 거예요."
포트 기반 VLAN은 스위치의 각 물리적 포트를 특정 VLAN에 할당하는 방식입니다. 가장 일반적이고 직관적인 VLAN 설정 방법입니다.
마치 아파트에서 101호부터 105호까지는 A동, 106호부터 110호까지는 B동으로 지정하는 것과 같습니다. 해당 포트에 연결된 모든 장치는 자동으로 그 VLAN에 속하게 됩니다.
다음 코드를 살펴봅시다.
class PortBasedVLAN:
def __init__(self, switch_name, port_count=24):
self.switch_name = switch_name
# 모든 포트는 기본적으로 VLAN 1에 속함
self.port_config = {i: {'vlan': 1, 'mode': 'access'}
for i in range(1, port_count + 1)}
self.vlans = {1: 'default'}
def create_vlan(self, vlan_id, name):
self.vlans[vlan_id] = name
return f"VLAN {vlan_id} '{name}' created"
def configure_access_port(self, port, vlan_id):
# 포트를 액세스 모드로 설정하고 VLAN 할당
if vlan_id not in self.vlans:
return f"Error: VLAN {vlan_id} does not exist"
self.port_config[port] = {
'vlan': vlan_id,
'mode': 'access'
}
return f"Port {port} configured as access port in VLAN {vlan_id}"
def show_vlan_brief(self):
# VLAN 요약 정보 출력
print(f"\n{self.switch_name} VLAN Configuration")
print("-" * 50)
for vlan_id, name in self.vlans.items():
ports = [p for p, c in self.port_config.items()
if c['vlan'] == vlan_id]
print(f"VLAN {vlan_id:4} | {name:15} | Ports: {ports}")
# 실제 설정 예시
switch = PortBasedVLAN("SW-OFFICE-01")
switch.create_vlan(10, "Development")
switch.create_vlan(20, "Finance")
switch.configure_access_port(1, 10)
switch.configure_access_port(2, 10)
switch.configure_access_port(5, 20)
switch.show_vlan_brief()
박시니어 씨가 김개발 씨 옆에 의자를 끌어와 앉았습니다. "자, 이제 실제로 VLAN을 설정해볼까요?
포트 기반 VLAN부터 시작해봅시다." 포트 기반 VLAN은 가장 직관적인 방식입니다. 스위치의 각 물리적 포트를 특정 VLAN에 할당합니다.
예를 들어 포트 1번부터 12번까지는 개발팀 VLAN, 13번부터 24번까지는 재무팀 VLAN으로 설정하는 식입니다. 이 방식의 장점은 명확합니다.
설정이 단순합니다. 포트 번호와 VLAN 번호만 지정하면 끝입니다.
어떤 장치가 연결되든, 해당 포트에 연결되면 자동으로 지정된 VLAN에 속합니다. 관리도 쉽습니다.
네트워크 도면에 포트별 VLAN을 표시해두면 누구나 쉽게 이해할 수 있습니다. 위의 코드에서 configure_access_port 메서드가 핵심입니다.
포트 번호와 VLAN ID를 받아서 port_config 딕셔너리에 저장합니다. mode를 'access'로 설정하는데, 이는 해당 포트가 하나의 VLAN에만 속한다는 의미입니다.
실제 스위치 CLI에서는 다음과 같이 설정합니다. 시스코 스위치를 예로 들면, 먼저 글로벌 설정 모드에서 VLAN을 생성합니다.
그다음 인터페이스 설정 모드에서 해당 포트를 액세스 모드로 지정하고 VLAN을 할당합니다. show vlan brief 명령으로 설정 결과를 확인할 수 있습니다.
김개발 씨가 설정을 완료하고 결과를 확인했습니다. "포트 1, 2번이 VLAN 10에, 포트 5번이 VLAN 20에 할당되었네요.
그럼 포트 1번 컴퓨터와 포트 5번 컴퓨터는 통신이 안 되는 거죠?" 박시니어 씨가 고개를 끄덕였습니다. "맞아요.
같은 스위치에 연결되어 있어도 다른 VLAN이면 직접 통신이 불가능해요." 포트 기반 VLAN의 단점도 있습니다. 장치가 물리적으로 이동하면 VLAN도 바뀝니다.
개발팀 직원이 노트북을 들고 회의실로 가서 재무팀 포트에 연결하면, 갑자기 재무팀 VLAN에 속하게 됩니다. 의도치 않은 네트워크 접근이 발생할 수 있습니다.
이런 문제를 해결하기 위해 MAC 기반 VLAN이나 802.1X 인증 기반 VLAN 같은 방식도 사용합니다. 하지만 대부분의 환경에서는 포트 기반 VLAN이 충분합니다.
김개발 씨가 설정을 저장하며 말했습니다. "생각보다 어렵지 않네요!"
실전 팁
💡 - 액세스 포트는 하나의 VLAN에만 속할 수 있습니다
- 설정 후 반드시 show vlan으로 결과를 확인하세요
- 설정 변경 전에 현재 설정을 백업해두는 습관을 들이세요
7. MAC 기반 VLAN 설정
설정을 마친 김개발 씨에게 박시니어 씨가 질문을 던졌습니다. "그런데 만약 직원이 노트북을 들고 다니면서 여러 포트에 연결해도, 항상 자기 부서 VLAN에 접속하게 하고 싶으면 어떻게 해야 할까요?" 김개발 씨는 잠시 생각하다가 답했습니다.
"그건... MAC 주소를 기준으로 하면 되지 않을까요?"
MAC 기반 VLAN은 장치의 MAC 주소를 기준으로 VLAN을 할당하는 방식입니다. 포트가 아닌 장치 자체를 식별하여 VLAN을 결정합니다.
마치 신분증을 기반으로 출입 권한을 부여하는 것과 같습니다. 어느 출입구를 통해 들어오든, 본인의 신분증에 따라 접근 가능한 구역이 정해집니다.
다음 코드를 살펴봅시다.
class MACBasedVLAN:
def __init__(self, switch_name):
self.switch_name = switch_name
self.mac_vlan_mapping = {} # {mac_address: vlan_id}
self.vlans = {1: 'default', 10: 'Development', 20: 'Finance'}
def register_mac_to_vlan(self, mac_address, vlan_id):
# MAC 주소를 특정 VLAN에 등록
mac_upper = mac_address.upper()
self.mac_vlan_mapping[mac_upper] = vlan_id
print(f"MAC {mac_upper} -> VLAN {vlan_id} 등록됨")
def determine_vlan(self, mac_address, ingress_port):
# 장치가 연결될 때 VLAN 결정
mac_upper = mac_address.upper()
if mac_upper in self.mac_vlan_mapping:
vlan = self.mac_vlan_mapping[mac_upper]
print(f"MAC 기반: {mac_upper}는 VLAN {vlan}에 할당")
return vlan
else:
# 등록되지 않은 MAC은 기본 VLAN으로
print(f"미등록 MAC: {mac_upper}는 기본 VLAN 1로 할당")
return 1
def show_mac_vlan_table(self):
print(f"\n{self.switch_name} MAC-VLAN Mapping")
print("-" * 50)
for mac, vlan in self.mac_vlan_mapping.items():
print(f"{mac} -> VLAN {vlan} ({self.vlans[vlan]})")
# 사용 예시
switch = MACBasedVLAN("SW-FLEXIBLE-01")
switch.register_mac_to_vlan("AA:BB:CC:DD:EE:01", 10) # 개발팀 직원 노트북
switch.register_mac_to_vlan("AA:BB:CC:DD:EE:02", 10) # 개발팀 직원 노트북
switch.register_mac_to_vlan("11:22:33:44:55:66", 20) # 재무팀 직원 노트북
# 어느 포트에 연결해도 같은 VLAN
switch.determine_vlan("AA:BB:CC:DD:EE:01", ingress_port=5)
switch.determine_vlan("AA:BB:CC:DD:EE:01", ingress_port=15)
김개발 씨의 추측이 정확했습니다. 박시니어 씨가 미소를 지으며 말했습니다.
"바로 그거예요. MAC 기반 VLAN이라고 합니다." 포트 기반 VLAN의 한계를 떠올려봅시다.
개발팀 김대리가 노트북을 들고 회의실로 갔습니다. 회의실 포트는 재무팀 VLAN으로 설정되어 있습니다.
김대리는 갑자기 재무팀 네트워크에 접속하게 됩니다. 개발 서버에 접근할 수 없고, 재무 데이터에 접근할 수 있는 이상한 상황이 발생합니다.
MAC 기반 VLAN은 이 문제를 해결합니다. 스위치에 미리 MAC 주소와 VLAN의 매핑 정보를 등록해둡니다.
김대리 노트북의 MAC 주소 AA:BB:CC:DD:EE:01은 VLAN 10에 등록됩니다. 이제 김대리가 어느 포트에 연결하든, 스위치는 MAC 주소를 확인하고 VLAN 10으로 할당합니다.
위의 코드에서 register_mac_to_vlan 메서드가 이 매핑을 등록합니다. determine_vlan 메서드는 장치가 연결될 때 MAC 주소를 확인하여 적절한 VLAN을 반환합니다.
등록되지 않은 MAC 주소는 기본 VLAN으로 처리합니다. MAC 기반 VLAN의 장점은 명확합니다.
이동성이 보장됩니다. 직원이 어디로 이동하든 자신의 VLAN에 접속합니다.
보안이 강화됩니다. 등록되지 않은 장치는 기본 VLAN이나 격리 VLAN으로 보내 통제할 수 있습니다.
유연성이 높아집니다. 핫데스크 환경이나 회의실처럼 여러 부서가 공유하는 공간에서 유용합니다.
하지만 단점도 있습니다. 관리 부담이 증가합니다.
모든 장치의 MAC 주소를 등록하고 관리해야 합니다. 새 장비가 추가될 때마다 수동으로 등록해야 합니다.
MAC 스푸핑에 취약할 수 있습니다. 악의적인 사용자가 다른 장치의 MAC 주소를 위조하면 해당 VLAN에 접근할 수 있습니다.
김개발 씨가 질문했습니다. "그럼 어떤 방식이 더 좋은 건가요?" 박시니어 씨가 대답했습니다.
"상황에 따라 달라요. 대부분의 환경에서는 포트 기반 VLAN으로 충분해요.
이동이 잦은 환경이나 보안이 중요한 환경에서는 MAC 기반이나 802.1X 인증 기반을 고려하죠." 실제 기업 환경에서는 여러 방식을 조합하여 사용합니다. 서버실처럼 장비 이동이 없는 곳은 포트 기반, 무선 네트워크나 핫데스크 환경은 인증 기반으로 설정하는 식입니다.
김개발 씨가 고개를 끄덕였습니다. "네트워크도 참 고려할 게 많네요." 박시니어 씨가 웃으며 말했습니다.
"그래서 재미있는 거죠. 오늘 배운 내용으로 기본기는 충분히 쌓았어요.
나머지는 실무에서 하나씩 경험하면 됩니다."
실전 팁
💡 - MAC 기반 VLAN은 동적 VLAN 할당이라고도 불립니다
- 대규모 환경에서는 RADIUS 서버와 연동하여 자동화합니다
- 802.1X 인증과 함께 사용하면 보안을 크게 강화할 수 있습니다
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.