ipcalcコマンドでIPアドレスからネットマスク、ネットワークアドレス、ブロードキャストアドレス、ホスト数を算出する

Bash

はじめに

IPアドレス/CIDR ( ex: 192.168.1.16/27 ) のパターンから、特定のサブネットに所属するかを1つずつ確認する作業を行いました。

目視で1つずつ計算していたのですが、効率が悪いし何より疲れるため、かんたんにサブネットの計算ができないかと思っていたときに見つけたツールを紹介します。

検証環境

$ uname -moi
arm64 unknown Darwin

$ bash -version | head -n 1
GNU bash, バージョン 5.1.16(1)-release (aarch64-apple-darwin21.1.0)

IP アドレスと CIDR からネットワークに関する情報を算出する ipcalc コマンド

見つけたツールは、 IP アドレスと CIDR 表記の組み合わせ _( ex: MARKDOWN_HASH66c5f44d94714ab7ef718bffb267fba8MARKDOWNHASH ) からネットワークに関する情報を算出してくれる ipcalc と言うものです。

インストール

macOS の場合、 Homebrew でかんたんにインストールできました。

$ brew install ipcalc

Ubuntu 22.10 環境でも APT を使ってかんたんにインストールできました。

$ sudo apt install ipcalc

使い方

ipcalc コマンドの引数に IP アドレス (+CIDR) を指定すると、IP アドレスが存在するネットワークの情報を逆算してくれます。

IP アドレス/CIDR を指定

引数に IP アドレス/CIDR を指定します。

$ ipcalc 192.168.0.1/24
Address:   192.168.0.1          11000000.10101000.00000000. 00000001
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.0.0/24       11000000.10101000.00000000. 00000000
HostMin:   192.168.0.1          11000000.10101000.00000000. 00000001
HostMax:   192.168.0.254        11000000.10101000.00000000. 11111110
Broadcast: 192.168.0.255        11000000.10101000.00000000. 11111111
Hosts/Net: 254                   Class C, Private Internet

表示されている内容は書かれている通りですが、以下のとおりです。

  • ネットワークは 192.168.0.0/24
  • ホストが利用可能な IP アドレスは 192.168.0.1  〜 192.168.0.254
  • ブロードキャストアドレスは 192.168.0.255
  • ホストに割り当て可能な IP アドレスは 254 アドレス

デフォルトのカラーリングが表示に見やすいため、 スクリーンショットも貼っておきます。

以下のように、情報は見やすくカラーリングされています。

カラー説明
青緑IP アドレスの 「オクテット表記」
IP アドレスの 「ビット表記」
IP アドレスの 「ビット表記」 のうち、 「サブネット」
IP アドレスの所属する 「クラス」 ( A/B/C/D のいずれか )

/ の代わりにスペースでも問題なく動作します

$ ipcalc 192.168.0.1 24
Address:   192.168.0.1          11000000.10101000.00000000. 00000001
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.0.0/24       11000000.10101000.00000000. 00000000
HostMin:   192.168.0.1          11000000.10101000.00000000. 00000001
HostMax:   192.168.0.254        11000000.10101000.00000000. 11111110
Broadcast: 192.168.0.255        11000000.10101000.00000000. 11111111
Hosts/Net: 254                   Class C, Private Internet

IP アドレス/ネットマスク を指定

IP アドレス/ネットマスク の形式で引数を指定することもできます。

出力結果は先程と同様です。

$ ipcalc 192.168.0.1/255.255.128.0
Address:   192.168.0.1          11000000.10101000.0 0000000.00000001
Netmask:   255.255.128.0 = 17   11111111.11111111.1 0000000.00000000
Wildcard:  0.0.127.255          00000000.00000000.0 1111111.11111111
=>
Network:   192.168.0.0/17       11000000.10101000.0 0000000.00000000
HostMin:   192.168.0.1          11000000.10101000.0 0000000.00000001
HostMax:   192.168.127.254      11000000.10101000.0 1111111.11111110
Broadcast: 192.168.127.255      11000000.10101000.0 1111111.11111111
Hosts/Net: 32766                 Class C, Private Internet

CIDR の部分で説明したのと同じように、 / の代わりにスペースでも問題なく動作します

$ ipcalc 192.168.0.1 255.255.128.0

IP アドレス/ネットマスク(16進数) を指定

IP アドレス/ネットマスク(16進数) の形式で引数を指定しても動作しました。

$ ipcalc 192.168.0.1/0xffffff00
Address:   192.168.0.1          11000000.10101000.00000000. 00000001
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.0.0/24       11000000.10101000.00000000. 00000000
HostMin:   192.168.0.1          11000000.10101000.00000000. 00000001
HostMax:   192.168.0.254        11000000.10101000.00000000. 11111110
Broadcast: 192.168.0.255        11000000.10101000.00000000. 11111111
Hosts/Net: 254                   Class C, Private Internet

こちらもやはり / の代わりにスペースでも問題なく動作します

$ ipcalc 192.168.0.1 0xffffff00
Address:   192.168.0.1          11000000.10101000.00000000. 00000001
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.0.0/24       11000000.10101000.00000000. 00000000
HostMin:   192.168.0.1          11000000.10101000.00000000. 00000001
HostMax:   192.168.0.254        11000000.10101000.00000000. 11111110
Broadcast: 192.168.0.255        11000000.10101000.00000000. 11111111
Hosts/Net: 254                   Class C, Private Internet

IP アドレス/ネットマスク(否定) を指定

ネットマスクは通常 255.255.255.0 のように、2 進数表記で左から 1 が連続する表現となります( 11111111.11111111.11111111.00000000 ) 。

ネットマスクを否定した表現、つまり右から 1 が連続する表現も可能です。

255.255.255.0 を指定した場合と 0.0.0.255 を指定した場合の結果は同じになります。

カバーするホスト数の上限が見えている場合はこちらの表現が楽かもしれません

$ ipcalc 192.168.0.1/0.0.0.255
WILDCARD
Address:   192.168.0.1          11000000.10101000.00000000. 00000001
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.0.0/24       11000000.10101000.00000000. 00000000
HostMin:   192.168.0.1          11000000.10101000.00000000. 00000001
HostMax:   192.168.0.254        11000000.10101000.00000000. 11111110
Broadcast: 192.168.0.255        11000000.10101000.00000000. 11111111
Hosts/Net: 254                   Class C, Private Internet

CIDR、ネットマスクを指定しなかった場合は?

CIDR やネットマスクを指定しなかった場合には、現在自分が所属しているネットワークのネットマスクが自動的に適用されます。

# ネットマスクは /24 ( 255.255.255.0 ) となっている
$ ipcalc 192.168.0.1
Address:   192.168.0.1          11000000.10101000.00000000. 00000001
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.0.0/24       11000000.10101000.00000000. 00000000
HostMin:   192.168.0.1          11000000.10101000.00000000. 00000001
HostMax:   192.168.0.254        11000000.10101000.00000000. 11111110
Broadcast: 192.168.0.255        11000000.10101000.00000000. 11111111
Hosts/Net: 254                   Class C, Private Internet

# 現在所属しているネットワークのネットマスクが 0xffffff00 = /24 = 255.255.255.0 となっている
$ ifconfig en0 | grep -i netmask
        inet 192.168.1.13 netmask 0xffffff00 broadcast 192.168.1.255

誤った IP アドレス、CIDR、ネットマスクを指定するとエラーを吐いてくれる

IP アドレス、CIDR、ネットマスクの指定に誤りがあった場合には、エラーで教えてくれます。

$ ipcalc 192.168.256.1/0.0.0.15
WILDCARD
INVALID ADDRESS: 192.168.256.1

$ ipcalc 192.168.0.1/33
INVALID MASK1:   33

$ ipcalc 192.168.0.1/0.0.0.32
WILDCARD
INVALID NETMASK
INVALID MASK1:   0.0.0.32

ひとこと

エンジニアとしてこのあたりの計算をぱぱっとできればかっこいいのでしょうが、僕は計算に時間がかかってしまいますし何より間違えそうなのでツールに頼ることにしました。

Bash