본문으로 건너뛰기
AZ Tools

얼버무리지 않고 이해하는 IP 주소와 서브넷

서브네팅은 까다롭다는 평판이 있지만, 사실은 하나의 아이디어를 일관되게 적용한 것뿐입니다. 주소는 숫자이고, 프리픽스는 그중 앞의 몇 비트가 고정인지를 말합니다. 이게 이해되는 순간 호스트 수, 중첩, 집약이 모두 여기서 따라 나옵니다. 이 가이드는 그 계산과, 특별한 의미를 가진 대역들과, 직관이 무너지는 지점들을 다룹니다.

주소는 숫자이고, 프리픽스는 경계다

IPv4 주소는 하나의 32비트 숫자입니다. 익숙한 점 표기는 그 숫자를 사람 눈에 맞춰 네 바이트로 쪼갠 것뿐이죠. 192.168.1.10은 3232235786입니다. 서브넷 마스크가 하는 일 전부는 그 숫자를 어디서 자를지 정하는 것입니다. 앞쪽 비트는 네트워크를, 뒤쪽 비트는 그 안의 호스트를 가리킵니다.

CIDR 표기는 그 자르는 지점을 그대로 씁니다. `/24`는 앞 24비트가 네트워크이고 호스트에 8비트가 남는다는 뜻이며, `/26`은 26비트를 고정하고 6비트를 남깁니다. 마스크 255.255.255.0과 접미사 `/24`는 같은 말의 두 표기이고, 생각하기 좋은 쪽은 프리픽스 길이입니다. 그것은 개수이므로 비교와 포함 관계가 그냥 비트 연산이 됩니다.

프리픽스 읽기: 주소는 몇 개이고, 쓸 수 있는 건 몇 개인가

IPv4에서 길이 *n*인 프리픽스는 2^(32−n)개의 주소를 담습니다. `/24`는 256개, `/26`은 64개, `/30`은 4개죠. 일반적인 브로드캐스트 서브넷에서는 첫 주소가 네트워크 식별자, 마지막 주소가 브로드캐스트 주소라서 실제로 쓸 수 있는 호스트는 두 개 적습니다. 각각 254, 62, 2개입니다. 마지막 숫자가 점대점 링크에 전통적으로 `/30`을 쓰는 이유입니다.

경계는 임의가 아닙니다. 프리픽스는 언제나 자기 크기의 배수에서 시작합니다. `/26`은 .0, .64, .128, .192에 있고 그 사이에는 없습니다 — 192.168.1.100/26은 사실 192.168.1.64에서 시작하는 블록을 가리킵니다. 두 프리픽스는 완전히 포개지거나 아예 겹치지 않거나 둘 중 하나이며, 덕분에 라우팅 테이블과 방화벽 규칙을 다룰 수 있게 됩니다.

특별한 의미를 가진 대역들

IPv4의 세 대역은 사설 용도로 예약되어 공용 인터넷에서 라우팅되지 않습니다. 10.0.0.0/8, 172.16.0.0/12(주의: 172.x 전체가 아닙니다), 192.168.0.0/16입니다. 그 밖에 127.0.0.0/8은 루프백, 169.254.0.0/16은 링크 로컬 — DHCP가 실패했을 때 기기가 스스로에게 주는 주소 — 이고, 100.64.0.0/10은 통신사급 NAT라서 기기가 '공인' 주소를 보고하면서도 여전히 도달 불가능할 수 있습니다.

이걸 아는 건 잡학 이상의 의미가 있습니다. 로그가 10.x로 가득하다면 클라이언트 주소가 프록시 뒤에서 기록됐다는 뜻이고, 169.254 주소는 네트워크가 아예 올라오지 않았다는 뜻이며, '172는 사설이 아니다'라며 172.20.x를 공인으로 취급하는 것은 실제로 반복되는 실수입니다. 허용 목록이 얽혀 있다면 첫 옥텟이 아니라 대역 경계를 확인하세요.

IPv6는 계산을 바꾼다

IPv6 주소는 128비트이고, 16진수 네 자리 그룹 여덟 개로 씁니다. 0으로만 된 그룹의 연속 구간 하나는 `::`로 줄일 수 있는데, 주소당 한 번뿐입니다. 그러지 않으면 복원이 모호해지니까요. 그룹 앞의 0은 생략 가능해서 같은 주소에 유효한 표기가 여러 개 존재하며, 따라서 문자열 비교는 쓸모가 없습니다. 비교하거나 중복을 제거하기 전에 정규화하세요.

관례도 다릅니다. 단일 링크의 표준 크기가 `/64`라서 '호스트가 몇 개냐'는 질문은 대체로 흥미를 잃습니다. 브로드캐스트 주소가 없고, 빼야 할 네트워크/브로드캐스트 쌍도 없습니다. 프리픽스는 여전히 중첩된 비트 범위이므로 집약은 IPv4와 정확히 같은 방식으로 동작합니다. 숫자만 훨씬 클 뿐입니다.

정렬, 집약, 비교

주소를 절대 문자열로 정렬하지 마세요. 사전순으로는 10.0.0.9가 10.0.0.100 뒤에 오고 9.0.0.1이 10.0.0.1 뒤에 오므로, 그렇게 정렬된 리포트는 조용히 틀립니다. 숫자 값으로 정렬하세요. 그래야 인접한 블록이 서로 옆에 놓이고, 그게 모든 집약의 첫 단계입니다.

집약은 분할의 역연산입니다. 길이가 같은 두 프리픽스가 마지막 한 비트만 빼고 모든 비트를 공유하면, 한 비트 짧은 하나의 프리픽스로 합쳐집니다. 이걸 반복하면 흩어진 허용 목록이 몇 개의 블록으로 줄어드는데, 규칙 개수 제한과 조회 시간 면에서 실제로 돈이 되는 일입니다. 다만 임의의 시작–끝 범위가 언제나 하나의 프리픽스는 아니라는 점을 기억하세요. 10.0.0.5–10.0.0.20을 정확히 덮으려면 여러 블록이 필요하고, 깔끔하게 `/27`로 반올림하면 의도하지 않은 접근까지 허용하게 됩니다.

  • `/24` = 256개, 사용 가능 254개. `/26` = 64개, 62개. `/30` = 4개, 2개.
  • 프리픽스는 자기 크기의 배수에서 시작 — 192.168.1.100/26은 .64의 블록입니다.
  • 사설: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16. 링크 로컬: 169.254.0.0/16. CGNAT: 100.64.0.0/10.
  • 주소는 문자열이 아니라 숫자로 비교하세요.

관련 도구