「そのサブネット、本当にあっていますか?」―ネットワークの境界を読み解くビット演算の極意
ネットワークエンジニアとして現場を歩いていると、いまだに「なんとなく」でサブネットマスクを決めている設計に出くわすことがあります。クラウド時代になり、VPCやサブネットの設計は自動化が進みましたが、パケットがどの境界線を越え、どこでドロップされるのかという「論理的な地図」を描けないエンジニアは、ひとたび障害が起きると迷子になります。
今日は、Web APIの疎通トラブルやインフラ設計の根幹となる「サブネット計算」を、単なる暗記ではなく、現場で使える武器として解説します。
—
1. ビット演算という「境界線」の正体
IPアドレスは単なる数字の羅列ではありません。192.168.1.0/24 と書いたとき、そこには「どこまでが身内(同一ネットワーク)で、どこからが外部(ルーターを越える先)か」という強固な境界線が引かれています。
なぜビット演算が必要か
コンピュータは10進数を理解しません。すべては0と1の世界です。例えば 255.255.255.0(/24)というマスクは、32ビットのうち最初の24ビットが「ネットワーク部」であることを示しています。
もしネットワークアドレスを求めたいなら、IPアドレスとサブネットマスクで AND 演算を行います。これがルーターのルーティングテーブルの裏側で行われている「住所特定」のメカニズムです。
—
2. 実践:ホスト数計算とネットワーク境界の特定
設計時に必ず直面するのが「このCIDRで何台のホストが収まるのか?」という問いです。
計算式は非常にシンプルです。
- ホスト数 =
2^(32 - CIDR) - 2
なぜ -2 するのか? それは、ネットワークの先頭(ネットワークアドレス)と最後(ブロードキャストアドレス)をホストとして使えないからです。
Pythonで計算ツールを自作する
現場でサッと計算を確認したいとき、私はこんな小さなスクリプトを書いてコンテナ内で走らせます。
import ipaddress
def get_network_info(cidr):
# ipaddressモジュールを使えば手計算のミスを防げる
network = ipaddress.ip_network(cidr, strict=False)
print(f"ネットワークアドレス: {network.network_address}")
print(f"ブロードキャストアドレス: {network.broadcast_address}")
print(f"利用可能なホスト数: {network.num_addresses - 2}")
print(f"ホスト範囲: {list(network.hosts())[0]} - {list(network.hosts())[-1]}")
# 実行例: 10.0.0.0/27 の場合
get_network_info("10.0.0.0/27")
—
3. Web API設計におけるサブネットの勘所
APIサーバーを構築する際、セキュリティグループやACL(アクセスコントロールリスト)を絞ることは「ゼロトラスト」への第一歩です。しかし、境界の設定ミスは往々にして「なぜかAPIが叩けない」という悲劇を招きます。
curl で疎通確認をする際のTips
疎通確認を行う際、単に curl を叩くだけでなく、-v (verbose) オプションと --interface を併用して、意図したインターフェースからパケットが出ているかを確認しましょう。
# 特定のネットワークインターフェースを指定してAPIを叩く
# 意図しないサブネット経由になっていないか確認する重要な手順
curl -v --interface eth0 https://api.internal.example.com/health
もしここで Connection timed out が出るなら、それはパケットがサブネットの境界(ルーターやACL)で遮断されている可能性が高いです。その時こそ、先ほどの計算ロジックを思い出し、「この送信元IPは本当に許可されたネットワーク範囲内にあるか?」を確認してください。
—
4. 現場のシニアからのアドバイス:トラブルシューティングの作法
最後に、トラブルシューティングの現場で私が必ず守っている鉄則を伝授します。
1. 「デフォルトゲートウェイ」を疑え: ネットワークアドレスの計算が合っていても、ゲートウェイが間違っていればパケットは永遠に迷子になります。ip route コマンドでネクストホップを確認する癖をつけましょう。
2. バイナリで考える: 障害調査時、192.168.1.128/25 と 192.168.1.129/25 が同じネットワーク内にあるか即答できますか? これが即答できるエンジニアは、運用現場で圧倒的な信頼を得ます。
3. 自動化ツールを盲信しない: Terraformの cidrsubnet 関数などは非常に便利ですが、生成された結果が意図したセグメントに収まっているか、一度は手元で確認(検算)する余裕を持ってください。
ネットワークは「魔法」ではありません。すべてはパケットが辿る物理的・論理的なパスの積み重ねです。この基礎を疎かにせず、一つひとつのビットと向き合うことが、堅牢なシステムを作る唯一の道だと私は信じています。
皆さんの設計が、今日も完璧なルーティングでありますように。
コメント