서브넷과 CIDR
서브넷 마스크와 CIDR 접두어로 네트워크·호스트·브로드캐스트 범위를 계산하고 VPC 주소 공간을 설계합니다.
클래스 기반 주소 체계의 가장 큰 문제는 유연성이 없다는 것이었습니다.
호스트가 300대 필요한 조직에 클래스 C(254대)를 주면 부족하고, 클래스 B(65,534대)를 주면 65,000개 이상의 주소가 낭비됩니다.
이 문제를 해결하기 위해 등장한 것이 서브넷(Subnet)과 CIDR(Classless Inter-Domain Routing)입니다.
서브넷 마스크의 역할
서브넷 마스크(Subnet Mask)는 IP 주소에서 어디까지가 네트워크부이고 어디서부터가 호스트부인지를 알려주는 값입니다.
IP 주소와 서브넷 마스크를 비트 단위로 AND 연산하면 네트워크 주소가 나옵니다. 예를 들어 192.168.1.100과 255.255.255.0을 AND하면 192.168.1.0입니다.
반대로 마스크에서 0으로 남은 비트가 호스트부이며, 이 범위 안에서 호스트 주소와 브로드캐스트 주소가 결정됩니다.
CIDR 표기법
CIDR은 클래스에 얽매이지 않고, 네트워크부의 비트 수를 자유롭게 지정하는 방식입니다.
192.168.1.0/24는 앞 24비트가 네트워크부라는 뜻입니다.
서브넷 마스크 255.255.255.0과 같은 의미이지만, 표기가 훨씬 간결합니다.
| CIDR | 마스크 · 일반 호스트 수 · 용도 예 |
|---|---|
| /8 | 255.0.0.0 · 24비트 호스트부 · 16,777,214개 · 대형 주소 공간 |
| /16 | 255.255.0.0 · 16비트 · 65,534개 · 기업 VPC |
| /20 | 255.255.240.0 · 12비트 · 4,094개 · 대규모 서브넷 |
| /24 | 255.255.255.0 · 8비트 · 254개 · 일반 LAN |
| /25 | 255.255.255.128 · 7비트 · 126개 · 중간 서브넷 |
| /26 | 255.255.255.192 · 6비트 · 62개 · 소규모 서브넷 |
| /27 | 255.255.255.224 · 5비트 · 30개 · 서버 팜 |
| /28 | 255.255.255.240 · 4비트 · 14개 · 소규모 DMZ |
| /30 | 255.255.255.252 · 2비트 · 2개 · 포인트투포인트 |
| /31 | 255.255.255.254 · 1비트 · 두 주소 모두 사용 · 포인트투포인트 |
| /32 | 255.255.255.255 · 호스트부 없음 · 단일 호스트 경로 |
일반적인 IPv4 브로드캐스트 서브넷에서 호스트 수에서 2를 빼는 이유는, 호스트부가 모두 0인 주소(네트워크 주소)와 모두 1인 주소(브로드캐스트 주소)는 호스트에 할당할 수 없기 때문입니다.
은 프리픽스 길이입니다.
다만 /31은 포인트투포인트 링크에서 두 주소를 모두 사용할 수 있고, /32는 단일 호스트 경로를 나타내므로 위 공식의 예외로 다룹니다.
서브넷 분할 계산
192.168.1.0/24 네트워크를 4개의 서브넷으로 나누어야 합니다.
4개의 서브넷이 필요하므로 , 즉 호스트부에서 2비트를 빌려 네트워크부를 확장합니다.
CIDR SPLIT · TWO BORROWED BITS / FOUR EQUAL BLOCKS
호스트부 2비트를 빌리면 /24가 같은 크기의 /26 네 개로 나뉜다
192.168.1.0/24의 256개 주소를 00·01·10·11에 대응하는 네 구역으로 나눕니다. 각 /26은 전체 64개 주소이며 일반 브로드캐스트 서브넷의 호스트 할당 가능 수는 62개입니다.
주소 범위는 마지막 옥텟만 줄여 적었습니다. /26의 처음 주소는 네트워크, 마지막 주소는 브로드캐스트입니다. 첫 호스트를 게이트웨이로 쓰는 것은 예제의 관례입니다. /31·/32와 클라우드 예약 규칙은 별도로 확인합니다.
| 네트워크 주소 | 호스트 · 브로드캐스트 · 게이트웨이 예 |
|---|---|
| 192.168.1.0/26 | 호스트 .1~.62 · 브로드캐스트 .63 · 게이트웨이 .1 |
| 192.168.1.64/26 | 호스트 .65~.126 · 브로드캐스트 .127 · 게이트웨이 .65 |
| 192.168.1.128/26 | 호스트 .129~.190 · 브로드캐스트 .191 · 게이트웨이 .129 |
| 192.168.1.192/26 | 호스트 .193~.254 · 브로드캐스트 .255 · 게이트웨이 .193 |
게이트웨이를 첫 호스트 주소로 잡은 것은 이 예제의 관례이며 CIDR이 정하는 규칙은 아닙니다. 아래 코드는 작은 IPv4 실습 범위에서 hosts()를 리스트로 만듭니다. 큰 주소 공간이나 IPv6에 그대로 적용하면 메모리·시간이 과도하게 들 수 있습니다.
"""서브넷 분할 계산기"""
import ipaddress
def subnet_divide(network_str, new_prefix):
"""네트워크를 지정된 프리픽스로 분할"""
network = ipaddress.ip_network(network_str, strict=False)
subnets = list(network.subnets(new_prefix=new_prefix))
print(f"원래 네트워크: {network}")
print(f"서브넷 마스크: {network.netmask}")
print(f"사용 가능 호스트: {len(list(network.hosts()))}\n")
print(f"분할 결과 ({len(subnets)}개 /{new_prefix} 서브넷):")
print(f"{'서브넷':<22} {'호스트 범위':<35} {'BC':<16} {'호스트수'}")
print("-" * 90)
for i, subnet in enumerate(subnets, 1):
hosts = list(subnet.hosts())
if hosts:
first, last = hosts[0], hosts[-1]
print(f"{str(subnet):<22} {str(first)} ~ {str(last):<20} "
f"{str(subnet.broadcast_address):<16} {len(hosts)}")
# 실습
subnet_divide("192.168.1.0/24", 26) # 4개 분할
print()
subnet_divide("10.0.0.0/16", 20) # 16개 분할
# 두 IP가 같은 서브넷에 있는지 확인
def same_subnet(ip1, ip2, prefix):
"""두 IP가 같은 서브넷에 있는지 확인"""
net = ipaddress.ip_network(f"{ip1}/{prefix}", strict=False)
return ipaddress.ip_address(ip2) in net
print(f"\n같은 서브넷? {same_subnet('192.168.1.100', '192.168.1.200', 24)}")
print(f"같은 서브넷? {same_subnet('192.168.1.100', '192.168.1.200', 25)}")코드 마지막의 두 출력은 /24에서 True, /25에서 False입니다. /25는 마지막 옥텟을 .0~.127과 .128~.255로 나누므로 .100과 .200이 다른 블록에 놓입니다. strict=False는 .100처럼 호스트 비트가 있는 입력을 해당 네트워크 주소로 정규화한다는 뜻이며, 입력 주소를 새로 할당하거나 서로 통신하게 만드는 기능은 아닙니다.
독립 설계: 일반적인 IPv4 브로드캐스트 LAN 하나에 단말 50대와 별도의 게이트웨이 1개를 넣으려 합니다. 이 문제에서는 모두 주소 하나씩을 쓰고 추가 예약은 없습니다. /27과 /26 중 어느 크기가 최소로 충분할까요? 같은 주소 블록을 아래의 일반 AWS IPv4 서브넷 예약 조건으로 쓰는 경우에도 계산하세요.
필요 주소와 예약 규칙 확인
일반 LAN은 51개의 호스트 주소가 필요합니다. /27은 전체 32개에서 네트워크·브로드캐스트를 뺀 30개로 부족하고, /26은 64 − 2 = 62개여서 충분합니다. 일반 AWS 예약 조건에서는 /27이 32 − 5 = 27개, /26이 64 − 5 = 59개의 리소스 할당 가능 주소를 가집니다. AWS의 VPC 라우터 주소는 그 다섯 예약 중 하나이므로, 단말에 대응하는 리소스 50개의 주소와 별도의 사용자 관리 게이트웨이 리소스 1개까지 요구하면 51개가 필요하고 /26이 충분합니다. 관리형 VPC 라우터를 쓰는 구성이라면 그 라우터를 이 51번째 사용자 할당 주소로 다시 세지 않습니다. BYOIP 등 예외나 ENI·Pod의 추가 요구는 별도 예산입니다.
슈퍼넷팅 (경로 집약)
서브넷 분할이 큰 네트워크를 작게 나누는 것이라면, 슈퍼넷팅(Supernetting)은 반대로 여러 네트워크를 하나로 합치는 것입니다.
경로 집약은 아무 네트워크나 합칠 수 있는 것이 아닙니다.
네트워크들이 연속된 주소 범위여야 하고, 합친 범위가 프리픽스 경계에 맞게 정렬되어 있어야 합니다.
또한 집약 대상 경로가 같은 방향으로 나가거나 같은 정책으로 처리될 수 있어야 합니다.
예를 들어 192.168.0.0/24부터 192.168.3.0/24까지 네 개의 연속된 네트워크는 192.168.0.0/22 하나로 표현할 수 있습니다.
클라우드 VPC 서브넷 설계
AWS VPC를 설계할 때 CIDR 계산이 직접적으로 필요합니다.
| 설계 원칙 | 이유 |
|---|---|
| VPC CIDR은 넉넉하게 선택 | 기본 CIDR 크기는 나중에 변경할 수 없음 |
| 보조 CIDR 확장 가능성 고려 | 필요 시 secondary IPv4 CIDR을 추가 가능 |
| AZ별로 균등 분할 | 가용성 확보 |
| Public/Private/DB 분리 | 이름만으로 격리되지 않으므로 라우팅·보안 정책을 함께 구성 |
| 서브넷당 예약 IP 5개 고려 | AWS가 첫 4개와 마지막 1개 주소를 예약 |
| EKS/컨테이너 IP 예산 확보 | 노드와 Pod ENI/IP 소진 방지 |
AWS에서 IPv4 서브넷 크기는 /16부터 /28 범위 안에서 선택합니다.
일반적인 AWS IPv4 서브넷은 첫 네 개와 마지막 주소를 예약하므로 /24의 할당 가능 주소는 251개입니다. BYOIP로 가져온 주소 범위에는 이 예약 규칙의 예외가 있습니다.
AWS 공식 서브넷 CIDR 안내의 IPv4 크기·첫 네 주소와 마지막 주소 예약·BYOIP 예외를 기준으로 표를 적용합니다. “일반 호스트 2개 제외”와 “일반 AWS 주소 5개 예약”은 같은 규칙이 아닙니다.
# Linux에서 서브넷 정보 확인
ip addr show eth0 | grep inet
# 네트워크 주소 계산 (ipcalc)
ipcalc 192.168.1.100/26
# 출력: Network, HostMin, HostMax, Broadcast, Hosts
# Docker 네트워크의 서브넷 확인
docker network inspect bridge | grep -A 5 IPAM다음 절에서는 사설 IP를 사용하는 장치들이 어떻게 인터넷과 통신하는지, NAT와 DHCP의 동작 원리를 살펴보겠습니다.