서브네팅 완전 이해

IP 주소를 효율적으로 분할하는 서브네팅 원리, 서브넷 마스크 계산, VLSM, 네트워크·브로드캐스트 주소 도출 방법을 설명합니다.

· 5 min read · PALDYN Team

지난 글에서 IPv4 주소 고갈 문제와 IPv6를 살펴봤습니다. 하지만 여전히 대부분의 기업 내부 네트워크는 IPv4를 사용하며, 주어진 IP 주소 블록을 효율적으로 나눠 쓰는 기술인 서브네팅(Subnetting) 이 필수입니다. 서브네팅은 큰 네트워크를 여러 개의 작은 네트워크로 분할해 보안 격리, 트래픽 제어, 주소 효율을 높이는 기법입니다.

왜 서브네팅이 필요한가

문제 상황: 192.168.1.0/24 네트워크에 영업팀(50명), 개발팀(30명)이 있음

서브네팅 없을 때:
  → 모든 장치가 같은 브로드캐스트 도메인
  → 영업팀 브로드캐스트가 개발팀 장치에도 전달
  → 보안 경계 없음 — 영업 PC에서 개발 서버 접근 가능

서브네팅 후:
  → 영업팀: 192.168.1.0/26 (62 호스트)
  → 개발팀: 192.168.1.64/26 (62 호스트)
  → 서로 다른 브로드캐스트 도메인 — 라우터를 통해야만 통신

서브넷 마스크 이해

서브넷 마스크는 IP 주소에서 어디까지가 네트워크, 어디서부터가 호스트인지를 나타내는 32비트 값입니다.

/24 마스크:
  비트:     11111111.11111111.11111111.00000000
  10진수:   255.255.255.0

/26 마스크:
  비트:     11111111.11111111.11111111.11000000
  10진수:   255.255.255.192
  네트워크 26비트 / 호스트 6비트

서브넷 계산 방법

서브네팅 계산 과정

핵심 공식

서브넷 수    = 2^(빌린 비트 수)
호스트 수    = 2^(호스트 비트 수) - 2  (-2: 네트워크·브로드캐스트 제외)
블록 크기    = 256 - 마스크의 마지막 유효 옥텟값

/26 계산 예제

원본: 192.168.1.0/24
목표: /26으로 분할 (24비트 → 26비트, 2비트 빌림)

서브넷 수 = 2^2 = 4개
호스트 수 = 2^6 - 2 = 62개
블록 크기 = 256 - 192 = 64

서브넷 1: 192.168.1.0   ~ 192.168.1.63
  네트워크: 192.168.1.0
  브로드캐스트: 192.168.1.63
  사용 가능: 192.168.1.1 ~ 192.168.1.62

서브넷 2: 192.168.1.64  ~ 192.168.1.127
서브넷 3: 192.168.1.128 ~ 192.168.1.191
서브넷 4: 192.168.1.192 ~ 192.168.1.255

자주 쓰는 서브넷 치트시트

CIDR마스크호스트 수사용 예
/30255.255.255.2522P2P 링크
/29255.255.255.2486소규모 세그먼트
/28255.255.255.24014소형 오피스
/27255.255.255.22430중소 부서
/26255.255.255.19262중형 부서
/25255.255.255.128126대형 부서
/24255.255.255.0254일반 LAN
/16255.255.0.065534대형 기업 내부

VLSM — 가변 길이 서브넷 마스크

고정 크기 서브넷은 주소를 낭비합니다. VLSM(Variable Length Subnet Mask) 은 각 서브넷에 필요한 크기만큼만 할당합니다.

VLSM 설계

10.0.0.0/24 를 세 팀에 배분:

영업팀 (100명 필요): /25 할당 (126 호스트)
  → 10.0.0.0/25 (10.0.0.0 ~ 10.0.0.127)

개발팀 (50명 필요): /26 할당 (62 호스트)
  → 10.0.0.128/26 (10.0.0.128 ~ 10.0.0.191)

관리팀 (20명 필요): /27 할당 (30 호스트)
  → 10.0.0.192/27 (10.0.0.192 ~ 10.0.0.223)

남은 블록: 10.0.0.224/27 (미사용)

실습: Python으로 서브넷 계산

import ipaddress

network = ipaddress.IPv4Network("192.168.1.0/24")

# /26으로 분할
subnets = list(network.subnets(new_prefix=26))
for i, subnet in enumerate(subnets, 1):
    hosts = list(subnet.hosts())
    print(f"서브넷 {i}: {subnet}")
    print(f"  네트워크: {subnet.network_address}")
    print(f"  브로드캐스트: {subnet.broadcast_address}")
    print(f"  호스트: {hosts[0]} ~ {hosts[-1]} ({len(hosts)}개)")

서브네팅 오류 사례

실수 1: 네트워크/브로드캐스트 주소를 호스트에 할당
  192.168.1.0/26 네트워크에서
  × 192.168.1.0 → 네트워크 주소, 할당 불가
  × 192.168.1.63 → 브로드캐스트, 할당 불가

실수 2: 겹치는 서브넷 설계
  10.0.0.0/24 와 10.0.0.128/24 동시 사용
  → /24 범위가 같으므로 10.0.0.128 이 두 네트워크에 속함

실수 3: /30 게이트웨이 링크 오설정
  점대점 링크에 /24 할당 → 252개 주소 낭비
  → P2P 링크는 /30 (2 호스트) 또는 /31 (RFC 3021)

서브네팅은 네트워크 설계의 핵심 기술입니다. CIDR과 함께 사용하면 인터넷 라우팅 테이블도 효율적으로 집약(Aggregation)할 수 있습니다. 다음 시리즈에서는 CIDR, 라우팅, NAT 등 네트워크 심화 주제를 이어서 다룹니다.


지난 글: IPv4 vs IPv6 완전 비교


읽어주셔서 감사합니다. 😊