서브넷(Subnet)과 CIDR 표기법 이해하기
서버를 운영하다 보면 네트워크 설정에서 192.168.1.0/24 같은 표기를 자주 만나게 됩니다. AWS에서 VPC를 만들 때도 나오고, 방화벽 규칙을 설정할 때도 나오고, 서버 간 통신을 구성할 때도 나옵니다. 슬래시 뒤에 붙는 숫자가 뭘 의미하는지 모르면 네트워크 설정을 할 때마다 찜찜한 채로 넘어가게 됩니다. 이번 글에서는 IP 주소의 구조부터 시작해서 서브넷과 CIDR 표기법이 어떤 의미인지를 정리해보겠습니다.
IP 주소의 구조부터 다시 보기
서브넷을 이해하려면 IP 주소가 어떻게 구성되어 있는지를 먼저 알아야 합니다.
IPv4 주소는 192.168.1.100처럼 점으로 구분된 네 개의 숫자로 이루어져 있습니다. 각 숫자는 0부터 255까지의 값을 가집니다. 사람이 보기에는 십진수 네 덩어리지만 컴퓨터 내부에서는 32비트 이진수로 처리됩니다. 192.168.1.100을 이진수로 바꾸면 11000000.10101000.00000001.01100100입니다.
이 32비트는 두 부분으로 나뉩니다. 앞부분은 네트워크 주소이고 뒷부분은 호스트 주소입니다. 네트워크 주소는 “어떤 네트워크에 속하는가”를 나타내고, 호스트 주소는 “그 네트워크 안에서 어떤 장비인가”를 나타냅니다.
현실 세계의 주소에 비유하면 네트워크 주소는 동네 이름이고 호스트 주소는 집 번호입니다. 같은 동네에 사는 사람들은 네트워크 주소가 같고 호스트 주소만 다릅니다. 다른 동네에 사는 사람에게 데이터를 보내려면 라우터를 거쳐야 합니다.
문제는 32비트 중에서 어디까지가 네트워크 주소이고 어디부터가 호스트 주소인지를 알 수 없다는 점입니다. 이걸 구분해주는 게 서브넷 마스크입니다.
서브넷 마스크란 무엇인가
서브넷 마스크는 IP 주소에서 네트워크 부분과 호스트 부분의 경계를 알려주는 값입니다. 서브넷 마스크도 IP 주소처럼 32비트로 되어 있는데, 앞쪽에 1이 연속으로 나오고 뒤쪽에 0이 연속으로 나오는 구조입니다.
예를 들어 서브넷 마스크가 255.255.255.0이면 이진수로는 11111111.11111111.11111111.00000000입니다. 1인 부분이 네트워크 주소이고 0인 부분이 호스트 주소입니다. 이 경우 앞의 24비트가 네트워크 주소이고 뒤의 8비트가 호스트 주소입니다.
IP 주소가 192.168.1.100이고 서브넷 마스크가 255.255.255.0이면, 네트워크 주소는 192.168.1이고 호스트 주소는 100입니다. 같은 네트워크에 속한 장비들은 전부 192.168.1로 시작하고 마지막 숫자만 다릅니다. 192.168.1.1부터 192.168.1.254까지가 이 네트워크에서 사용할 수 있는 호스트 주소입니다.
왜 254개인지 궁금할 수 있습니다. 호스트 부분이 8비트이면 0부터 255까지 총 256개의 값이 가능하지만, 호스트 부분이 전부 0인 주소(192.168.1.0)는 네트워크 자체를 가리키는 네트워크 주소로 예약되어 있고, 전부 1인 주소(192.168.1.255)는 브로드캐스트 주소로 예약되어 있습니다. 그래서 실제 장비에 할당할 수 있는 주소는 256에서 2를 뺀 254개입니다.
CIDR 표기법이란
CIDR은 Classless Inter-Domain Routing의 약자입니다. IP 주소 뒤에 슬래시와 숫자를 붙여서 서브넷 마스크를 간단하게 표현하는 방식입니다.
192.168.1.0/24라고 쓰면 앞의 24비트가 네트워크 주소라는 뜻입니다. 이건 서브넷 마스크 255.255.255.0과 같은 의미입니다. 슬래시 뒤의 숫자가 서브넷 마스크에서 1이 몇 개 연속되는지를 나타냅니다.
10.0.0.0/16이면 앞의 16비트가 네트워크 주소입니다. 서브넷 마스크로는 255.255.0.0입니다. 호스트 부분이 16비트이므로 사용 가능한 호스트 수는 2의 16승에서 2를 뺀 65,534개입니다.
172.16.0.0/12면 앞의 12비트가 네트워크 주소이고 호스트 부분이 20비트입니다. 사용 가능한 호스트 수는 2의 20승에서 2를 뺀 1,048,574개입니다.
숫자가 작을수록 네트워크 범위가 넓고 사용할 수 있는 호스트가 많습니다. 숫자가 클수록 네트워크 범위가 좁고 호스트 수가 적습니다. /32는 호스트 부분이 0비트이므로 단 하나의 IP 주소를 가리킵니다.
자주 보는 CIDR 표기를 정리하면 이렇습니다. /8은 서브넷 마스크 255.0.0.0이고 약 1,677만 개의 호스트를 수용합니다. /16은 255.255.0.0이고 약 65,000개입니다. /24는 255.255.255.0이고 254개입니다. /32는 255.255.255.255이고 1개입니다.
서브넷팅이란 무엇인가
서브넷팅은 하나의 큰 네트워크를 여러 개의 작은 네트워크로 쪼개는 것입니다.
예를 들어 회사에서 192.168.1.0/24 네트워크를 사용하고 있다고 합시다. 이 네트워크에는 254개의 장비를 연결할 수 있습니다. 그런데 부서가 세 개 있고 부서별로 네트워크를 분리하고 싶습니다. 보안상 다른 부서의 트래픽이 내 네트워크에 들어오지 않게 하고 싶을 수도 있고, 장애가 났을 때 영향 범위를 줄이고 싶을 수도 있습니다.
이때 /24 네트워크를 더 작은 단위로 나눌 수 있습니다. 192.168.1.0/26으로 나누면 어떻게 될까요. /26은 네트워크 부분이 26비트이고 호스트 부분이 6비트입니다. 호스트 수는 2의 6승에서 2를 뺀 62개입니다. /24 하나가 /26 네 개로 쪼개집니다.
192.168.1.0/26은 192.168.1.0부터 192.168.1.63까지의 범위입니다. 192.168.1.64/26은 192.168.1.64부터 192.168.1.127까지입니다. 192.168.1.128/26은 192.168.1.128부터 192.168.1.191까지이고, 192.168.1.192/26은 192.168.1.192부터 192.168.1.255까지입니다. 네 개의 서브넷이 만들어졌고 각각 62개의 호스트를 수용할 수 있습니다.
각 서브넷의 첫 번째 주소는 네트워크 주소이고 마지막 주소는 브로드캐스트 주소이므로 실제 사용 가능한 범위는 첫 번째와 마지막을 제외한 나머지입니다. 192.168.1.0/26에서 장비에 할당할 수 있는 주소는 192.168.1.1부터 192.168.1.62까지입니다.
클라우드 환경에서의 서브넷
AWS, GCP 같은 클라우드를 사용할 때 서브넷 개념이 더 자주 나옵니다.
AWS에서 서버를 만들려면 먼저 VPC(Virtual Private Cloud)를 만들어야 합니다. VPC는 클라우드 안에 격리된 내 전용 네트워크를 만드는 겁니다. VPC를 만들 때 IP 범위를 CIDR로 지정합니다. 예를 들어 10.0.0.0/16으로 VPC를 만들면 10.0.0.0부터 10.0.255.255까지의 IP를 사용할 수 있는 네트워크가 생깁니다.
VPC 안에서 다시 서브넷을 만들어야 합니다. 서브넷마다 가용 영역(AZ)을 지정합니다. 10.0.1.0/24를 가용 영역 A에, 10.0.2.0/24를 가용 영역 B에 만드는 식입니다. 서버를 만들 때 어떤 서브넷에 배치할지 선택하면 해당 서브넷의 IP 범위에서 주소가 할당됩니다.
퍼블릭 서브넷과 프라이빗 서브넷을 나누는 것도 흔한 구성입니다. 퍼블릭 서브넷에는 외부에서 접근 가능한 웹 서버를 두고, 프라이빗 서브넷에는 외부에서 직접 접근할 수 없는 데이터베이스 서버를 둡니다. 서브넷 자체에 퍼블릭이나 프라이빗 속성이 있는 건 아니고, 인터넷 게이트웨이와 연결된 라우팅 테이블을 가진 서브넷이 퍼블릭, 그렇지 않은 서브넷이 프라이빗입니다.
이런 구성을 할 때 CIDR 표기를 이해하지 못하면 IP 범위가 겹치거나 호스트 수가 부족한 문제가 생깁니다. VPC를 /16으로 잡아두면 서브넷을 충분히 쪼갤 수 있는 여유가 생기고, 서브넷은 /24 정도로 만들면 서브넷 하나당 251개의 호스트를 사용할 수 있습니다. AWS는 각 서브넷에서 5개의 IP를 예약하기 때문에 /24 서브넷의 실제 사용 가능한 호스트 수는 256에서 5를 뺀 251개입니다.
방화벽 설정에서의 CIDR
방화벽이나 보안 그룹 규칙을 설정할 때도 CIDR을 사용합니다.
AWS 보안 그룹에서 SSH 접속을 허용할 때 소스에 0.0.0.0/0을 넣으면 모든 IP에서 접속을 허용한다는 뜻입니다. /0은 네트워크 부분이 0비트이므로 모든 IP가 해당됩니다. 보안상 매우 위험하기 때문에 SSH는 내 IP만 허용하는 게 좋습니다.
내 IP가 203.0.113.50이라면 소스에 203.0.113.50/32를 넣으면 됩니다. /32는 정확히 그 IP 하나만을 의미합니다.
회사 네트워크 전체에서 접속을 허용하고 싶으면 회사 IP 대역을 CIDR로 넣습니다. 회사가 203.0.113.0부터 203.0.113.255까지의 IP를 사용한다면 203.0.113.0/24를 넣으면 됩니다.
이전 글에서 다뤘던 UFW 방화벽에서도 마찬가지입니다.
sudo ufw allow from 203.0.113.0/24 to any port 22
이 명령어는 203.0.113.0/24 대역에서 오는 SSH 접속만 허용한다는 뜻입니다.
사설 IP 대역과 CIDR
인터넷에서 사용하는 공인 IP와 별개로, 내부 네트워크에서만 사용하는 사설 IP 대역이 정해져 있습니다. 이 대역은 CIDR로 표현하면 세 가지입니다.
10.0.0.0/8은 10.0.0.0부터 10.255.255.255까지의 범위입니다. 가장 넓은 사설 IP 대역이고 대규모 네트워크에서 주로 사용합니다. AWS VPC의 기본 추천 대역이기도 합니다.
172.16.0.0/12는 172.16.0.0부터 172.31.255.255까지의 범위입니다. 중간 규모의 네트워크에서 사용합니다.
192.168.0.0/16은 192.168.0.0부터 192.168.255.255까지의 범위입니다. 가정이나 소규모 사무실에서 가장 흔하게 쓰이는 대역입니다. 집에서 공유기에 연결하면 보통 192.168.0.x나 192.168.1.x 주소를 받는 게 이 대역에 해당합니다.
VPC나 내부 네트워크를 구성할 때는 반드시 이 사설 IP 대역 안에서 CIDR을 지정해야 합니다. 공인 IP 대역을 사설 네트워크에 사용하면 해당 공인 IP로의 통신이 안 되는 문제가 생깁니다.
CIDR 계산이 헷갈릴 때
서브넷 계산이 익숙하지 않으면 직접 계산하는 것보다 도구를 사용하는 게 빠릅니다. 터미널에서 ipcalc라는 도구를 설치하면 CIDR에 대한 정보를 바로 확인할 수 있습니다.
sudo apt install ipcalc
ipcalc 192.168.1.0/24
실행하면 네트워크 주소, 브로드캐스트 주소, 사용 가능한 호스트 범위, 호스트 수를 전부 보여줍니다. 웹에서 “CIDR calculator”로 검색해도 온라인 계산기가 많이 나옵니다. 서브넷 설계를 할 때 이런 도구로 먼저 확인하고 설정하면 실수를 줄일 수 있습니다.
마무리
서브넷은 하나의 네트워크를 용도에 맞게 작은 네트워크로 나누는 개념이고, CIDR은 네트워크 범위를 슬래시와 숫자로 간결하게 표현하는 방법입니다. 슬래시 뒤의 숫자가 클수록 네트워크가 좁고 호스트 수가 적고, 숫자가 작을수록 네트워크가 넓고 호스트 수가 많습니다. 클라우드 환경에서 VPC와 서브넷을 만들 때, 방화벽 규칙에서 IP 범위를 지정할 때 이 개념이 바로 적용됩니다. 처음에는 이진수 계산이 복잡하게 느껴지지만 자주 쓰는 값들만 기억해두면 실무에서 크게 어려울 일은 없습니다. 다음 글에서는 DNS 레코드의 종류와 각각의 역할에 대해 자세히 다뤄보겠습니다.