cidrsubnet 함수
cidrsubnet 함수
cidrsubnet 함수는 주어진 IP 네트워크 주소 프리픽스 안에서 서브넷 주소를 계산해요. newbits는 프리픽스를 확장할 추가 비트 수이고, netnum은 프리픽스에 추가되는 비트를 채우는 데 사용되는 정수예요. 이 함수는 IPv6와 IPv4 프리픽스를 모두 받을 수 있어요.
출처: 문서
본문
cidrsubnet은 주어진 IP 네트워크 주소 프리픽스 안에서 서브넷 주소를 계산해요.
cidrsubnet(prefix, newbits, netnum)
prefix는 RFC 4632 section 3.1에 정의된 CIDR 표기법으로 주어져야 해요. newbits는 프리픽스를 확장할 추가 비트 수예요. 예를 들어 /16으로 끝나는 프리픽스와 4라는 newbits 값이 주어지면 결과 서브넷 주소의 길이는 /20이 돼요. netnum은 newbits 이진 자릿수를 넘지 않는 정수이며, 프리픽스에 추가된 비트를 채우는 데 사용돼요.
이 함수는 IPv6와 IPv4 프리픽스를 모두 받을 수 있고, 결과는 항상 주어진 프리픽스와 동일한 주소 체계를 사용해요.
관련 함수인 cidrsubnets와 달리 cidrsubnet은 사용할 특정 네트워크 번호를 직접 지정할 수 있어요. cidrsubnets는 여러 네트워크 주소를 한 번에 할당할 수 있지만, 번호를 0부터 자동으로 매겨요.
참고: 역사적인 이유로 이 함수는 앞에 0이 붙은 IPv4 주소 옥텟을 10진수로 해석해요. 이는 일부 다른 시스템이 8진수로 해석하는 것과 반대예요. 우리는 하위 호환성을 위해 이 동작을 유지했지만, 이 동작에 의존하는 것은 권장하지 않아요.
예시
> cidrsubnet("172.16.0.0/12", 4, 2)
172.18.0.0/16
> cidrsubnet("10.1.2.0/24", 4, 15)
10.1.2.240/28
> cidrsubnet("fd00:fd12:3456:7890::/56", 16, 162)
fd00:fd12:3456:7800:a200::/72
Netmasks and Subnets (넷마스크와 서브넷)
cidrsubnet을 사용하려면 몇 가지 네트워크 주소 지정 개념을 알아야 해요. 가장 중요한 아이디어는 IP 주소(IPv4든 IPv6든)가 기본적으로 이진 숫자로 구성된다는 점이에요. 관례적으로는 IPv4의 경우 4개의 10진수 옥텟으로, IPv6의 경우 16비트 16진수 시퀀스로 표현하지만요.
위의 cidrsubnet("10.1.2.0/24", 4, 15) 예제를 들면, 함수는 먼저 주어진 IP 주소 문자열을 동등한 이진 표현으로 변환해요:
10 . 1 . 2 . 0
00001010 00000001 00000010 | 00000000
network | host
프리픽스 문자열 끝의 /24는 주소의 처음 24비트(즉 처음 3개 옥텟)가 네트워크를 식별하고 나머지 비트(이 경우 32 - 24 = 8비트)가 네트워크 안의 호스트를 식별한다는 것을 지정해요.
CLI 도구인 ipcalc는 CIDR 프리픽스를 이진수로 시각화하는 데 유용해요. 같은 프리픽스 문자열을 ipcalc에 넘겨서 위 변환을 확인할 수 있어요:
$ ipcalc 10.1.2.0/24
Address: 10.1.2.0 00001010.00000001.00000010. 00000000
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111. 00000000
Wildcard: 0.0.0.255 00000000.00000000.00000000. 11111111
=>
Network: 10.1.2.0/24 00001010.00000001.00000010. 00000000
HostMin: 10.1.2.1 00001010.00000001.00000010. 00000001
HostMax: 10.1.2.254 00001010.00000001.00000010. 11111110
Broadcast: 10.1.2.255 00001010.00000001.00000010. 11111111
Hosts/Net: 254 Class A, Private Internet
이것은 추가 정보를 제공할 뿐 아니라 (조금 다른 표기법을 사용해) 10진수에서 이진수로의 변환을 확인하고 이 네트워크에서 가능한 호스트 주소 범위를 보여줘요.
cidrhost가 단일 호스트 IP 주소를 계산하게 해주는 반면, cidrsubnet은 주어진 네트워크 프리픽스 안에서 새 네트워크 프리픽스, 즉 서브넷을 만드는 데 사용돼요.
cidrsubnet을 호출할 때 우리는 newbits와 netnum이라는 두 개의 추가 인자도 함께 넘겨요. newbits는 결과 프리픽스가 비트 단위로 얼마나 더 길어질지 결정해요. 여기 예제에서는 4를 지정했는데, 이는 결과 서브넷의 프리픽스 길이가 24 + 4 = 28비트가 된다는 뜻이에요. 이 비트들이 다음과 같이 나뉜다고 상상해 볼 수 있어요:
10 . 1 . 2 . ? 0
00001010 00000001 00000010 | XXXX | 0000
parent network | netnum | host
원래 "호스트 번호"였던 8비트 중 4비트가 이제 서브넷 번호로 용도가 바뀌었어요. 네트워크 프리픽스가 더 이상 정확한 옥텟 경계에 맞지 않으므로, 사실상 IP 주소의 마지막 10진수를 두 부분으로 나눠 절반은 서브넷 번호, 나머지 절반은 호스트 번호로 사용하게 돼요.
netnum 인자는 이 4개의 새 서브넷 비트에 어떤 숫자 값을 인코딩할지 결정해요. 지금 예제에서는 15를 전달했는데, 이는 이진수로 1111로 표현되므로 위의 XXXX 세그먼트를 채울 수 있어요:
10 . 1 . 2 . 15 0
00001010 00000001 00000010 | 1111 | 0000
parent network | netnum | host
이 변환을 다시 일반적인 10진수 표기법으로 되돌리려면 마지막 옥텟의 두 부분을 합쳐야 해요. 11110000을 이진수에서 10진수로 변환하면 240이 되고, 이 값을 새 프리픽스 길이 28과 결합하면 결과 10.1.2.240/28을 얻을 수 있어요. 이 프리픽스 문자열을 ipcalc에 넘겨 다시 시각화할 수도 있어요:
$ ipcalc 10.1.2.240/28
Address: 10.1.2.240 00001010.00000001.00000010.1111 0000
Netmask: 255.255.255.240 = 28 11111111.11111111.11111111.1111 0000
Wildcard: 0.0.0.15 00000000.00000000.00000000.0000 1111
=>
Network: 10.1.2.240/28 00001010.00000001.00000010.1111 0000
HostMin: 10.1.2.241 00001010.00000001.00000010.1111 0001
HostMax: 10.1.2.254 00001010.00000001.00000010.1111 1110
Broadcast: 10.1.2.255 00001010.00000001.00000010.1111 1111
Hosts/Net: 14 Class A, Private Internet
새 서브넷은 호스트 번호 지정에 4비트를 쓸 수 있어서, 네트워크 자체 주소와 브로드캐스트 주소를 빼면 할당 가능한 호스트 주소가 14개 있어요. 따라서 cidrhost 함수에 1에서 14 사이의 값을 넘겨 그 호스트 주소들을 계산할 수 있어요:
> cidrhost("10.1.2.240/28", 1)
10.1.2.241
> cidrhost("10.1.2.240/28", 14)
10.1.2.254
CIDR 표기법과 서브넷팅에 대한 더 자세한 정보는 Classless Inter-domain Routing을 참고해요.
관련 함수
cidrhost- 주어진 네트워크 주소 프리픽스 안에서 단일 호스트의 IP 주소를 계산해요.cidrnetmask- CIDR 표기법의 IPv4 네트워크 프리픽스를 넷마스크 표기법으로 변환해요.cidrsubnets- 프리픽스 아래 여러 개의 연속된 주소를 한 번에 자동으로 번호를 매기며 할당할 수 있어요.
더 알아보기 (Learn more)
- cidrhost 함수 - 호스트 IP 주소를 계산하는 함수예요.
- cidrsubnets 함수 - 여러 개의 연속된 주소 범위를 한 번에 할당해요.
- Terraform 함수 목록 - 모든 함수를 확인해 보세요.