- OpenTofu言語
- 関数
- cidrsubnet
cidrsubnet
関数
cidrsubnet
は、指定されたIPネットワークアドレスプレフィックス内のサブネットアドレスを計算します。
cidrsubnet(prefix, newbits, netnum)
prefix
は、RFC 4632 セクション 3.1で定義されているように、CIDR表記で指定する必要があります。
newbits
は、プレフィックスを拡張するために追加するビット数です。例えば、/16
で終わるプレフィックスとnewbits
値が4
の場合、結果のサブネットアドレスの長さは/20
になります。
netnum
は、newbits
個以下のバイナリ桁で表現できる整数で、プレフィックスに追加されたビットを埋めるために使用されます。
この関数はIPv6とIPv4のプレフィックスの両方をサポートし、結果は常に指定されたプレフィックスと同じアドレススキームを使用します。
関連する関数cidrsubnets
とは異なり、cidrsubnet
では使用する特定のネットワーク番号を指定できます。cidrsubnets
は複数のネットワークアドレスを一度に割り当てることができますが、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
ネットマスクとサブネット
cidrsubnet
を使用するには、いくつかのネットワークアドレス指定の概念を理解する必要があります。
最も重要なのは、IPアドレス(IPv4とIPv6の両方)は、慣習的に4つの10進オクテット(IPv4の場合)または16ビットの16進数のシーケンス(IPv6の場合)として表される場合でも、基本的にバイナリ桁で構成されているということです。
上記の例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プレフィックスを2進数で視覚化するのに役立ちます。上記変換を確認するには、同じプレフィックス文字列を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進数から2進数への変換(わずかに異なる表記法を使用)が確認され、このネットワークで可能なホストアドレスの範囲が表示されます。
cidrhost
は単一のホストIPアドレスの計算を可能にする一方、cidrsubnet
は与えられたネットワークプレフィックスの内部に新しいネットワークプレフィックスを作成します。言い換えれば、サブネットを作成します。
cidrsubnet
を呼び出す際には、newbits
とnetnum
という2つの追加引数も渡します。newbits
は、結果のプレフィックスがビット数でどれだけ長くなるかを決定します。ここでの例では4
を指定したので、結果のサブネットのプレフィックス長は24 + 4 = 28ビットになります。これらのビットは次のように分割されると考えられます。
10 . 1 . 2 . ? 0
00001010 00000001 00000010 | XXXX | 0000
parent network | netnum | host
元々は「ホスト番号」だった8ビットのうち4ビットが、サブネット番号として再利用されるようになりました。ネットワークプレフィックスは正確なオクテット境界に合わなくなるため、実際にはIPアドレスの最後の10進数を2つの部分に分割し、その半分をサブネット番号、もう半分をホスト番号として表すことになります。
netnum
引数は、これらの4つの新しいサブネットビットにエンコードする数値を決定します。現在の例では15
を渡しました。これは2進数で1111
と表され、上記のXXXX
セグメントを埋めることができます。
10 . 1 . 2 . 15 0
00001010 00000001 00000010 | 1111 | 0000
parent network | netnum | host
これを通常の10進表記に戻すには、最終オクテットの2つの部分を再結合する必要があります。11110000
を2進数から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
は、プレフィックスの下で複数の連続したアドレスを一度に割り当て、自動的に番号を付けます。