本文へスキップ

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から始まる自動番号付けを行います。

コードブロック
> 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を呼び出す際には、newbitsnetnumという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は、プレフィックスの下で複数の連続したアドレスを一度に割り当て、自動的に番号を付けます。