IP・ネットワーク計算
省略されたIPv6は同じアドレス?範囲も確認したい
使うツール
IPv6は長い数字が並ぶため、違う文字列を見ると別の接続先に見えます。しかし、先頭の0や連続する0の省略によって、同じアドレスが大きく違う見た目になることがあります。ログの検索漏れや設定差分を調べるときは、目で一文字ずつ追う前に、IPv6表記変換で同じ形へそろえてみましょう。
長い表記と短い表記を入れ替えてみる
2001:0db8:0000:0000:0000:0000:0000:0001
2001:db8::1一つずつIPv6表記変換へ入れると、完全表記も数値も同じ結果になります。IPv6は16bitごとの八つの組で表され、各組を16進数で書きます。0db8の先頭の0を省いてdb8と書いても値は同じです。::は連続した0の組を補うための表記で、単なる二つの区切り記号ではありません。
英字の大文字・小文字も数値を変えません。2001:DB8::1と2001:db8::1を文字列としてそのまま比較すると差が出ても、アドレスとしては同じです。監視の照合や設定のレビューで表記の違いを扱う場合は、元の文字列と正規化後の値を分けて考えます。元のログ自体を書き換える必要はありません。
::で何組省いたかは、全体で八組になるよう読む
2001:db8:0:1::1
2001:0db8:0000:0001:0000:0000:0000:0001短い方には2001、db8、0、1、最後の1という五組が見えるので、::が三組の0000を表します。省略があると、左から四番目に見える数字と、128bit上の位置を混同しやすくなります。/64の境界などを読むときは、いったん八組へ展開してから前半と後半を分けると理解しやすくなります。
::を二か所へ入れると、それぞれ何組を補うか一意に決まりません。2001::db8::1のような入力はエラーになります。文字を短くするために都合のよい場所でコロンを追加・削除するのではなく、完全表記へ戻せる規則として省略を扱います。各組に16進数以外の文字があったり、桁数が多すぎたりする場合も、別の有効なアドレスとして補正されると期待しないでください。
省略候補が二つあっても、同じ形へそろえる
2001:db8:0:0:1:0:0:1には、同じ長さの0の連続が二つあります。この例のツール出力は2001:db8::1:0:0:1です。最も長い0の連続を使い、同じ長さなら左側を選ぶという標準的な読みやすい表記にそろえます。別の有効な省略形を見つけたからといって、数値が違うとは限りません。
設定差分の目的が『接続先のアドレスが変わったか』なら、完全表記や整数値の一致を確認します。一方、『出力形式が規約どおりか』を調べるなら、文字列の形そのものも確認対象です。同じ数値なら何でもよい処理と、表示形式を統一したい処理を分けると、不要な変更通知を減らせます。
アドレスの省略と、/64の範囲は別の話
2001:db8:1::1234は一つのアドレスです。2001:db8:1::1234/64は、そのアドレスが属するプレフィックスの範囲を表します。IPv6/CIDR計算へ入れると、ネットワークは2001:db8:1::、終端は2001:db8:1:0:ffff:ffff:ffff:ffffです。::で文字数を減らしても、ビット数や範囲が小さくなるわけではありません。
/64の総数は2の64乗で、18,446,744,073,709,551,616です。すべてのアドレスを表示して確認する大きさではありません。包含や差分を知りたい場合はCIDR比較で範囲として扱います。また、IPv6にはIPv4と同じブロードキャストの考え方を持ち込まず、総数から機械的に二つを引きません。
末尾がIPv4に見えても、IPv6表現の場合がある
::ffff:192.0.2.1
::ffff:c000:201
0000:0000:0000:0000:0000:ffff:c000:0201この例では、末尾の192.0.2.1が16進数のc000:0201に対応します。ツールは短縮表記を::ffff:c000:201として出力します。見慣れたIPv4の部分だけを抜き出して比較すると、元がIPv6の文脈で表された値であることを落とす場合があります。アプリケーションのログやAPIがどの表現を使うかを確認し、変換規則を決めてから照合します。
この形式を解析できることは、IPv4とIPv6の通信経路を自動的に接続できるという意味ではありません。表記変換はトンネルや変換装置を設定せず、相手へも接続しません。値の読み取りと、ネットワーク機能の有効化を区別してください。
読み取れたことと、使えることを分ける
この記事では2001:db8::/32の説明用アドレスを使っています。実際の接続先を示すものではありません。アドレスが形式として有効でも、その相手が存在するか、経路があるか、通信が許可されるかは別です。SheepDevのネットワークツールは入力された値だけを計算し、DNS照会やポート確認を行いません。
ログの二つの値が同じかを調べるなら、まず完全表記と整数値を比較します。範囲が同じかならCIDR計算へ、範囲の中に入るかならCIDR比較へ進みます。アドレスに付随するポート、インターフェースの指定、URLの構文などは別の情報です。入力文字列に何が含まれるかを確認し、必要な部分だけを適切なツールへ渡してください。
URLの中にあるIPv6は、括弧も役割を持つ
https://[2001:db8::1]:8443/pathというURLを見ると、IPv6のコロンとポートを区切るコロンが同居しています。角括弧はホスト部分を区切るURLの構文で、IPv6アドレスの一部ではありません。アドレス表記変換へ渡すのは2001:db8::1の部分です。URL全体を調べたいならURL分解を使い、ホスト、ポート、パスを分けて読みます。文字列のコロンで単純に分割すると、IPv4のホスト名とポートを扱うときには動いても、IPv6で誤った切り分けになることがあります。
短縮形を元の八組へ展開すると、見落としやすいゼロの位置を照合しやすくなります。しかし、展開した文字列が長いからといって別のアドレスになったわけではありません。台帳とログで表記が違う場合、両方を同じ表記へそろえて比較します。逆に、似た接頭部分があるだけで同じネットワークだと判断するにはプレフィックス長が必要です。アドレスの同一性と範囲の所属は別の疑問なので、表記確認の後に必要ならIPv6/CIDR計算や包含比較へ進みます。
計算例に使う2001:db8::のアドレスは説明用です。この値を正常に解析できたことから、インターネット上の機器へ接続できるとは判断しません。実アドレスを扱う場合も、表記の正しさ、割当ての正しさ、ルーティング、アクセス制御は別々に確認する事項です。まず文字列の読み違いをなくし、そこから先の問題を切り分けるために使います。大量のIPv6アドレスを列挙するのではなく、128bitの値とプレフィックスの関係で考えることが、巨大な範囲でも扱える理由です。