본문으로 바로가기
TaeyoungKim.dev

CIDR /24와 /26 차이: IP가 속한 서브넷과 사용 가능 주소 계산

리눅스작성 약 4분 읽기TaeyoungKim
LinkedInX

가상 네트워크 10.20.30.0/24를 /26 네 개로 나눴다. 이제 10.20.30.70을 어느 서브넷에 놓아야 할까? 목록에 .0, .64, .128, .192가 보이는데 숫자만 훑어서는 자꾸 헷갈린다. 주소는 한 칸만 어긋나도 다른 서브넷이니 눈대중은 금물이다.

이번에는 이 주소 하나를 끝까지 따라가 보자. /26이 만드는 경계를 찾고, 일반적인 IPv4 호스트 수와 Azure에서 실제로 할당 가능한 수가 왜 다른지도 확인한다.

/24를 /26으로 나누면 왜 64개씩 끊길까?

IPv4 주소는 32비트다. CIDR 표기의 /24는 앞 24비트가 네트워크 부분이라는 뜻이고, /26은 앞 26비트를 고정한다. /24에서 /26으로 가며 2비트를 더 고정하므로 **서브넷은 4개(2²)**가 된다.

/26의 호스트 부분은 6비트다. 한 서브넷에는 2⁶ = 64개의 주소가 들어가고, 서브넷 마스크는 255.255.255.192다. 마지막 자리에서 범위가 64씩 바뀌는 이유가 여기 있다. /24 전체를 나누면 다음처럼 겹치지 않는다.

서브넷포함되는 마지막 자리네트워크 주소마지막 주소
10.20.30.0/26.0~.6310.20.30.010.20.30.63
10.20.30.64/26.64~.12710.20.30.6410.20.30.127
10.20.30.128/26.128~.19110.20.30.12810.20.30.191
10.20.30.192/26.192~.25510.20.30.19210.20.30.255

10.20.30.70은 어느 /26 서브넷에 속할까?

.70은 .64 이상이고 .127 이하이므로 10.20.30.64/26에 속한다. 특히 .63은 첫 번째 서브넷의 마지막 주소이고 .64는 두 번째 서브넷의 첫 주소다. 경계에 걸친 주소 하나를 잘못 넣으면 서로 다른 서브넷을 같은 범위라고 생각하기 쉽다.

이 범위에서 .64는 네트워크 주소, .127은 마지막 주소다. 일반적인 IPv4 호스트 계산에서는 양 끝을 제외한 .65~.126, 62개를 호스트 주소로 본다. 그러나 이 숫자를 그대로 클라우드 VM에 배정 가능한 IP 수라고 읽으면 안 된다.

Azure VNet에서는 왜 62개가 아니라 59개일까?

Azure는 각 서브넷의 처음 네 주소와 마지막 한 주소를 예약한다. 따라서 이 /26의 64개 중 .64.67과 .127은 할당 대상이 아니며, 계산상 할당 가능한 범위는 .68.126의 59개다. 10.20.30.70은 이 범위 안에도 있다. 예약 규칙은 Microsoft의 Azure VNet IP 계획 안내에서 확인할 수 있다.

주소를 설계할 때는 ‘CIDR 범위에 들어간다’와 ‘플랫폼에서 리소스에 할당할 수 있다’를 나눠 보자. 필요한 인스턴스가 59개라고 해서 /26이 늘 충분한 것도 아니다. 확장 여유와 다른 서브넷·연결 네트워크와의 주소 중복까지 확인해야 한다.

Python으로 서브넷 경계값을 어떻게 확인할까?

손으로 계산한 뒤에는 Python 표준 라이브러리 ipaddress로 범위를 확인할 수 있다. 아래 코드를 subnet_check.py로 저장해 실행하면 된다.

python
from ipaddress import ip_address, ip_network

parent = ip_network("10.20.30.0/24")
target = ip_address("10.20.30.70")

for subnet in parent.subnets(new_prefix=26):
    print(f"{subnet}: {subnet.network_address} ~ {subnet.broadcast_address}")

selected = ip_network(f"{target}/26", strict=False)
print(f"{target} belongs to {selected}")

assert str(selected) == "10.20.30.64/26"
assert ip_address("10.20.30.63") not in selected
assert ip_address("10.20.30.64") in selected
assert ip_address("10.20.30.127") in selected
text
10.20.30.0/26: 10.20.30.0 ~ 10.20.30.63
10.20.30.64/26: 10.20.30.64 ~ 10.20.30.127
10.20.30.128/26: 10.20.30.128 ~ 10.20.30.191
10.20.30.192/26: 10.20.30.192 ~ 10.20.30.255
10.20.30.70 belongs to 10.20.30.64/26

strict=False는 입력한 호스트 주소 .70/26에서 네트워크 주소 .64/26을 찾아 준다. ipaddress가 보여 주는 범위는 IPv4 계산 결과다. Azure의 추가 예약분 3개까지 자동으로 빼 주는 도구는 아니므로, 실제 할당 수는 별도로 계산해야 한다.

핵심 요약

/24를 /26으로 나누면 주소 64개짜리 서브넷 네 개가 된다. .70은 .64~.127 범위인 10.20.30.64/26에 속한다. 일반 IPv4 호스트 주소는 62개지만, Azure VNet은 처음 네 주소와 마지막 주소를 예약하므로 이 예제에서는 59개를 할당 가능 수로 봐야 한다. 먼저 범위의 경계를 확인하고, 그다음 플랫폼 예약 규칙을 적용하자.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#CIDR#서브넷 마스크#서브네팅#IP 주소 범위#Azure VNet

함께 읽으면 좋은 글