2026年6月21日
2026年6月21日
サブネット計算の表記を変換するツール|プレフィックス長・サブネットマスク・ワイルドカード・範囲の相互変換
サブネットの表記変換は、Python の標準ライブラリ ipaddress か、Linux の ipcalc・sipcalc を使えば、手計算せずに正確に行えます。この記事では「/27 をサブネットマスクに」「サブネットマスクをワイルドカードマスクに」「開始と終了のアドレスを CIDR に」といった、設定作業で実際に必要になる変換を、ツールごとの使い方と結果の読み方つきで解説します。機器やクラウドの画面ごとに求められる表記が違っても、迷わず書き換えられるようになります。
どの表記がどこで使われるか
同じネットワークでも、使う場所によって求められる書き方が異なります。変換が必要になるのはこのためです。
- プレフィックス長(CIDR 表記):
192.168.10.32/27。Linux のipコマンド、クラウドの VPC・サブネット設定、多くのファイアウォールで使います。 - ドット区切りのサブネットマスク:
255.255.255.224。Windows のネットワーク設定や古い機器、Debian の /etc/network/interfaces のような従来形式の設定ファイルで目にします。 - ワイルドカードマスク:
0.0.0.31。Cisco 系機器のアクセスリストや OSPF の network 文などで使われ、サブネットマスクのビットを反転したものです。 - 16進表記のマスク:
0xffffffe0。macOS や BSD 系のifconfigの出力に現れます。 - 範囲(開始〜終了):
192.168.10.32 - 192.168.10.63。DHCP の払い出し範囲や、許可リストを範囲で渡された場合に出てきます。
Python の ipaddress で変換する
Python 3 があれば OS を問わず同じ結果になり、追加のインストールも不要です。結果をそのまま設定ファイル生成に使えるのも利点です。
プレフィックス長とマスクの相互変換
import ipaddress
n = ipaddress.ip_network("192.168.10.32/27")
print(n.netmask) # 255.255.255.224
print(n.hostmask) # 0.0.0.31(ワイルドカードマスク)
print(n.with_netmask) # 192.168.10.32/255.255.255.224
print(n.with_hostmask) # 192.168.10.32/0.0.0.31
print(n.num_addresses) # 32
# マスク表記からプレフィックス長へ
m = ipaddress.ip_network("192.168.10.32/255.255.255.224")
print(m.prefixlen) # 27
print(m.with_prefixlen) # 192.168.10.32/27
# 16進のマスクをドット表記へ
print(ipaddress.IPv4Address(0xffffffe0)) # 255.255.255.224
ip_network() はスラッシュの後ろにプレフィックス長・サブネットマスク・ワイルドカードマスクのどれを書いても受け付けます。そのため「手元にある表記で読み込み、必要な表記で出力する」という使い方ができます。
ホストのアドレスからネットワークを求める
設定画面に書かれているのが「192.168.10.45/27」のようなホストのアドレスの場合、ip_network() にそのまま渡すと、ホスト部が0でないためエラーになります。所属するネットワークを知りたいときは ip_interface() を使います。
import ipaddress
i = ipaddress.ip_interface("192.168.10.45/27")
print(i.network) # 192.168.10.32/27
print(i.network.broadcast_address) # 192.168.10.63
hosts = list(i.network.hosts())
print(hosts[0], hosts[-1]) # 192.168.10.33 192.168.10.62
ネットワークアドレス、ブロードキャストアドレス、ホストに割り当てられる最初と最後のアドレスが一度に分かります。ゲートウェイを先頭のアドレスにする、といった社内ルールの確認にも使えます。
範囲と CIDR の相互変換
開始と終了のアドレスで渡された範囲は、summarize_address_range() で最小個数の CIDR ブロックに分解できます。
import ipaddress
first = ipaddress.IPv4Address("192.168.10.10")
last = ipaddress.IPv4Address("192.168.10.40")
for net in ipaddress.summarize_address_range(first, last):
print(net)
# 192.168.10.10/31
# 192.168.10.12/30
# 192.168.10.16/28
# 192.168.10.32/29
# 192.168.10.40/32
1つの CIDR ブロックで表せない範囲は、このように複数に分かれます。ファイアウォールのルールに範囲指定が使えず CIDR しか書けない場合は、この出力をそのまま並べます。
必要なホスト数からプレフィックス長を求める
「50台つなげるサブネットは何ビットか」という逆算もよく行います。IPv4 ではネットワークアドレスとブロードキャストアドレスの2つを差し引くのが基本です。
import math
def prefix_for_hosts(hosts):
host_bits = math.ceil(math.log2(hosts + 2))
return 32 - host_bits
print(prefix_for_hosts(50)) # 26(ホスト62台分)
クラウドのサブネットでは、この2つ以外にも事業者が予約するアドレスがあるため、実際に使える台数はさらに少なくなります。予約数は事業者のドキュメントで確認してください。
コマンドラインツールで変換する
ipcalc
Linux でよく使われるのが ipcalc ですが、同じ名前で別のプログラムが配布されている点に注意が必要です。Debian・Ubuntu 系で apt install ipcalc で入るものと、Red Hat・Fedora 系に入っているものは、オプションも出力形式も異なります(2026年10月現在)。
# Debian/Ubuntu 系: アドレスとプレフィックス長を渡すと、
# マスク・ワイルドカード・ネットワーク・ホスト範囲・ブロードキャストを一覧表示
ipcalc 192.168.10.45/27
# Debian/Ubuntu 系: 範囲を CIDR ブロックに分解
ipcalc 192.168.10.10 - 192.168.10.40
Debian・Ubuntu 系の出力では、各値に2進表記が並んで表示されるため、どこまでがネットワーク部かを目で追えます。Red Hat 系の ipcalc では、求めたい項目をオプションで指定する形式です。どちらが入っているかは ipcalc --help の内容で見分けられます。
sipcalc
sipcalc は IPv4 と IPv6 の両方を扱え、マスクの各表記(ドット、16進、ビット数)を並べて表示します。IPv6 のアドレスを省略形と省略しない形(展開形)の間で変換したいときにも便利です。多くのディストリビューションでパッケージとして提供されています。
Windows で使う場合
Windows には ipcalc に相当するコマンドが標準で入っていません。Python をインストールして前述のスクリプトを使うか、WSL 上で ipcalc を使うのが手軽です。PowerShell の Get-NetIPAddress で表示される PrefixLength はプレフィックス長なので、マスク表記に直す場合は Python で変換します。
Web の計算サイトを使うときの注意
ブラウザで使えるサブネット計算サイトも多数あります。手軽ですが、社内ネットワークの構成図に相当する情報を外部に入力することになるため、組織のルールで外部サービスの利用が制限されていないか確認してください。また、重要な設定に使う値は、複数のツールで突き合わせるのが安全です。計算サイトによっては /31 や /32 のホスト数の表示が異なります。
変換でつまずきやすい点
- /31 と /32 の扱い: /31 は2台を直結する回線用に、ネットワークとブロードキャストを使わない運用が規定されています(RFC 3021)。ツールによって「ホスト0台」と表示したり「2台」と表示したりするため、結果を鵜呑みにせず用途で判断します。
- ワイルドカードマスクとサブネットマスクの取り違え: アクセスリストにサブネットマスクを書くと、意図と逆に近い範囲が対象になります。投入前に
hostmaskの値と見比べます。 - 連続しないマスク: 255.255.0.255 のようにビットが連続しないマスクは、通常のサブネットでは使いません。Python の ip_network() はこれをエラーにするので、入力ミスの検出にも役立ちます。
- ホストアドレスのままの入力: 192.168.10.45/27 をネットワークとして扱うツールと、エラーにするツールがあります。どちらの意味で入力したのかを意識します。
まとめ
- 表記は使う場所で異なり、プレフィックス長・サブネットマスク・ワイルドカードマスク・16進・範囲の5種類を相互に変換できると作業が速くなる
- Python の ipaddress は
netmask・hostmask・with_prefixlen・summarize_address_range()で主要な変換をすべて扱える - ホストのアドレスから所属ネットワークを求めるときは
ip_interface()を使う - ipcalc は配布元で中身が違うため、
--helpで確認してから使う - /31・/32 やワイルドカードマスクは、ツールの表示と用途を照らし合わせて判断する