WindowsでIPv6アドレスが静的(手動)か動的(自動取得)か判別する方法|PowerShell PrefixOrigin/SuffixOriginとC#

Windowsクライアントで「IPv6アドレスが静的(手動設定)か/動的(自動取得)か」を判別したいとき、IPv4のように“DHCPかどうか”を1つの真偽値で断定できず悩みがちです。結論から言うと、IPv6はアドレスごとの取得元(Origin)を見て判定するのが最も確実です。

目次

Windowsで「IPv6が静的/動的」を一発判定しにくい理由

IPv4では、PCが持つIPv4アドレスが基本的に「手動設定」か「DHCP」かのどちらかに寄りやすく、.NETでも IPv4InterfaceProperties.IsDhcpEnabled のように“DHCP利用か否か”を大づかみにできます。

一方IPv6は、同じインターフェイスに複数のIPv6アドレスが同時に共存するのが普通です。たとえば代表例だけでも次のような組み合わせが起こります。

  • リンクローカル(fe80::/64):ほぼ必ず付く
  • グローバル/ULA:ルーター広告(SLAAC)やDHCPv6、または手動で付く
  • 一時アドレス(プライバシー拡張):同じプレフィックスでも“追加で”付くことがある

つまり「このNICは静的か?」ではなく、実務上は「このNIC上の、どのIPv6アドレスが、何由来で付いているか?」を見ないと誤判定しやすい、というのがポイントです。

結論:判定の軸は“アドレスごとの取得元(Origin)”

Windowsでは、IPv6アドレスの“取得元”を表す情報が用意されています。PowerShellなら Get-NetIPAddress の PrefixOrigin / SuffixOrigin を見ます。アプリ(.NET)側でも同じ考え方で UnicastIPAddressInformation.PrefixOrigin / SuffixOrigin を参照できます。

判定したいこと見るべき項目代表的な値ざっくり意味
手動(静的)か?PrefixOriginManual管理者が手動で設定
DHCPv6で配布か?PrefixOriginDhcpDHCPサーバー由来
SLAAC(RA)で自動設定か?PrefixOriginRouterAdvertisementルーター広告(RA)由来
一時アドレス(ランダム)か?SuffixOriginRandomホスト部がランダム生成
リンクローカルなど“既知”か?PrefixOrigin / SuffixOriginWellKnown予約・既知のプレフィックス/サフィックス

手早く確認:netshで一覧を出して目視する(即席チェック)

今すぐPC上で確認したいだけなら、コマンドプロンプトで次を実行して、インターフェイスごとのIPv6アドレス一覧を表示します。

netsh interface ipv6 show address

出力にはアドレスの種類や状態に関する情報が含まれ、そこから「手動で追加したもの」「自動で付いたもの」をおおよそ見分けられます。Microsoft Q&Aでもこのコマンドが案内されています。

注意点として、netsh の表示はWindowsのバージョンや表示レベルで列名・表現が微妙に異なることがあります。また、IPv6は“同じNICに複数アドレスが同居”しやすいので、目視だけだと「どれを判定対象にするか」で迷いやすいです。運用やプログラムできちんと判定したいなら、次のPowerShell方式をおすすめします。

おすすめ:PowerShellでPrefixOrigin/SuffixOriginを確認する(確実・自動化向き)

PowerShellでは Get-NetIPAddress を使うと、IPv6アドレスごとに取得元を確認できます。

まずは全IPv6アドレスを一覧表示

Get-NetIPAddress -AddressFamily IPv6

ただしこのままだと列が多いので、判定に必要な列だけに絞ると読みやすくなります。

Get-NetIPAddress -AddressFamily IPv6 |
  Select-Object InterfaceAlias, IPAddress, PrefixLength, AddressState, Type, PrefixOrigin, SuffixOrigin, PolicyStore |
  Sort-Object InterfaceAlias, IPAddress |
  Format-Table -AutoSize

「手動(静的)」だけを抽出

Get-NetIPAddress -AddressFamily IPv6 |
  Where-Object { $_.PrefixOrigin -eq 'Manual' } |
  Select-Object InterfaceAlias, IPAddress, PrefixLength, PrefixOrigin, SuffixOrigin, PolicyStore |
  Format-Table -AutoSize

「DHCPv6」だけを抽出

Get-NetIPAddress -AddressFamily IPv6 |
  Where-Object { $_.PrefixOrigin -eq 'Dhcp' } |
  Select-Object InterfaceAlias, IPAddress, PrefixLength, PrefixOrigin, SuffixOrigin |
  Format-Table -AutoSize

「SLAAC(ルーター広告)」だけを抽出

Get-NetIPAddress -AddressFamily IPv6 |
  Where-Object { $_.PrefixOrigin -eq 'RouterAdvertisement' } |
  Select-Object InterfaceAlias, IPAddress, PrefixLength, PrefixOrigin, SuffixOrigin |
  Format-Table -AutoSize

このように「静的/動的」を雑に1ビットで扱うのではなく、アドレス単位でOriginを見て分類するのがIPv6では堅い設計です。

PrefixOriginの意味:手動/DHCPv6/SLAAC/WellKnown を見分ける

PrefixOrigin は“ネットワーク部(プレフィックス)がどこから来たか”を表します。代表的な値は次の通りです。

PrefixOrigin意味よくある例判定のヒント
Manual手動で設定管理者が固定アドレスを設定「静的(手動)」とみなしてよい
DhcpDHCPサーバーから供給DHCPv6で配布「動的(DHCPv6)」
RouterAdvertisementルーター広告(RA)から供給SLAACで自動設定「動的(SLAAC)」
WellKnown既知のプレフィックスリンクローカルや特殊用途業務上は判定対象から除外しやすい
Other上記以外特殊なスタック/VPN等環境依存。補助情報(Type/PolicyStore)も見る

特に重要なのは Manual / Dhcp / RouterAdvertisement の3つです。IPv6の「自動取得」にはDHCPv6だけでなくSLAAC(RA)も普通に使われるので、PrefixOriginを見れば“何の自動化で付いたか”まで分解できます。

SuffixOriginの意味:一時アドレス(プライバシー拡張)を見分ける

SuffixOrigin は“ホスト部(サフィックス)がどう作られたか”を表します。IPv6ではプライバシー保護のために一時アドレスを追加で作ることがあり、この判別に役立ちます。

SuffixOrigin意味よくある例実務での使いどころ
Manual手動で設定固定のホスト部厳密に「完全固定」に寄せたいときの判断材料
OriginDhcpDHCPから供給DHCPv6がホスト部まで供給DHCPv6の利用確認に使える
LinkLayerAddressリンク層(MAC等)由来EUI-64等で生成「機器固有っぽいアドレス」の傾向把握に
Randomランダム生成一時アドレス(プライバシー拡張)ログや資産管理で“追跡対象にしない”判断に
WellKnown既知のサフィックスリンクローカル等通常は判定対象外として扱うことが多い
Other上記以外特殊ケースVPNや仮想化などを疑う

「静的アドレスを入れたのに、別のIPv6が勝手に増える」という相談の多くは、RouterAdvertisement + Random の組み合わせ(SLAAC+一時アドレス)が同居しているケースです。静的設定が無効になっているわけではなく、単に“追加で”自動アドレスが付いているだけ、ということがよくあります。

判定で迷いがちなケースと、現場で使えるルール例

ここからは、PrefixOrigin/SuffixOriginを踏まえて「どう判定ルールに落とすか」を整理します。目的(資産管理/トラブルシュート/アプリの送信元選択)によって最適解が変わるので、ありがちな落とし穴を避ける方向でルール例を提示します。

まず“何を判定対象にするか”を固定する

IPv6判定で最初にやるべきは「対象アドレスのスコープ」を決めることです。おすすめは次の順です。

  • 業務で到達性を確認したい:グローバル/ULAのユニキャストだけ(リンクローカルは除外)
  • 設定監査(静的を入れたか):PrefixOrigin=Manual を持つアドレスの有無
  • 通信ログの突合:SuffixOrigin=Random を除外して“安定しやすい”アドレスを優先

よくあるパターン早見表

状況観測されやすいOriginどう判断するか補足
手動で固定アドレスを設定PrefixOrigin=Manual(+ SuffixOrigin=Manual)静的(手動)PolicyStoreがActiveStore/PersistentStoreかも併せて確認すると安心
SLAACのみの一般的なクライアントPrefixOrigin=RouterAdvertisement(+ SuffixOrigin=Random が混在)動的(SLAAC)一時アドレスが複数見えるのは正常なことが多い
DHCPv6で割り当てPrefixOrigin=Dhcp(+ SuffixOrigin=OriginDhcp)動的(DHCPv6)ネットワーク設計によりRAと併用される場合もある
リンクローカルしかないWellKnown が中心判定対象外(未設定/未取得の可能性)IPv6疎通はリンクローカルだけでは完結しないことが多い
VPN/仮想NICで独自付与Other が出ることがある例外扱いで別ルールInterfaceAliasやType、製品仕様を確認

資産管理・ログ収集に便利なPowerShell例(そのままコピペ可)

大量の端末で「静的IPv6が入っている端末だけ拾いたい」「一時アドレスを除外して一覧化したい」といった用途では、集計用の出力形式を決めておくと楽です。

リンクローカルを除外し、グローバル/ULAっぽいものだけ表示

Get-NetIPAddress -AddressFamily IPv6 |
  Where-Object {
    $_.IPAddress -notlike 'fe80:*' -and
    $_.IPAddress -ne '::1'
  } |
  Select-Object InterfaceAlias, IPAddress, PrefixLength, PrefixOrigin, SuffixOrigin, AddressState, PolicyStore |
  Sort-Object InterfaceAlias, IPAddress |
  Format-Table -AutoSize

“手動設定が1つでもあるNIC”を抽出(監査向け)

Get-NetIPAddress -AddressFamily IPv6 |
  Where-Object { $_.PrefixOrigin -eq 'Manual' } |
  Group-Object InterfaceAlias |
  Select-Object Name, Count

一時アドレス(Random)を除外して一覧化(ログ突合向け)

Get-NetIPAddress -AddressFamily IPv6 |
  Where-Object { $_.SuffixOrigin -ne 'Random' } |
  Select-Object InterfaceAlias, IPAddress, PrefixOrigin, SuffixOrigin, AddressState |
  Sort-Object InterfaceAlias, IPAddress |
  Format-Table -AutoSize

CSVにエクスポート(資産管理台帳に取り込み)

Get-NetIPAddress -AddressFamily IPv6 |
  Select-Object InterfaceAlias, IPAddress, PrefixLength, PrefixOrigin, SuffixOrigin, AddressState, Type, PolicyStore |
  Export-Csv -NoTypeInformation -Encoding UTF8 -Path .\ipv6_addresses.csv

ポイントは、“静的か動的か”を単純化しすぎないことです。監査では「Manualが存在するか」、運用では「SLAACやDHCPv6が混在していないか」、ログでは「Randomをどう扱うか」…のように、目的別のフィルタを用意しておくと破綻しません。

.NET(C#)で判定する:UnicastIPAddressInformationを使う

Windows上の.NETアプリで判定したい場合は、ネットワークインターフェイスのユニキャストアドレスを列挙し、各アドレスの PrefixOrigin / SuffixOrigin を見て分類します。PowerShellでやっていることをアプリ内に持ち込むイメージです。

using System;
using System.Linq;
using System.Net.Sockets;
using System.Net.NetworkInformation;

public static class Ipv6OriginInspector
{
    public static void PrintIpv6Origins()
    {
        foreach (var nic in NetworkInterface.GetAllNetworkInterfaces())
        {
            // Down/Loopbackなどは必要に応じて除外
            if (nic.OperationalStatus != OperationalStatus.Up) continue;

            var props = nic.GetIPProperties();
            var v6Unicast = props.UnicastAddresses
                .Where(u => u.Address.AddressFamily == AddressFamily.InterNetworkV6);

            if (!v6Unicast.Any()) continue;

            Console.WriteLine($"[{nic.Name}] {nic.Description}");
            foreach (var u in v6Unicast)
            {
                Console.WriteLine($"  {u.Address}");
                Console.WriteLine($"    PrefixOrigin : {u.PrefixOrigin}");
                Console.WriteLine($"    SuffixOrigin : {u.SuffixOrigin}");
                Console.WriteLine($"    DAD State    : {u.DuplicateAddressDetectionState}");
            }
            Console.WriteLine();
        }
    }
}

この方式のメリットは、GUIやPowerShellに依存せずにアプリ内で「どのアドレスを使うか」を判断できる点です。たとえば、送信元アドレスを選ぶ際に一時アドレス(SuffixOrigin=Random)を避ける、あるいは手動設定(PrefixOrigin=Manual)を優先するといった実装が可能になります。

“静的にしたいのに勝手に増える”ときの考え方

運用現場でよくあるのが「固定IPv6を入れたのに、別のIPv6が増え続ける」というケースです。これは設定ミスというより、IPv6の仕様・OSの挙動として自然な場合があります。

  • 固定アドレス(Manual):管理者が意図して入れた“基準”
  • SLAACアドレス(RouterAdvertisement):ネットワークがRAを出していれば“追加で”自動設定されることがある
  • 一時アドレス(SuffixOrigin=Random):プライバシー拡張で“さらに追加”されることがある

このときの対処は「増えないようにする」よりも先に、運用で“どれを正とみなすか”を決めるのが安全です。たとえば台帳にはManualのみを載せ、監視はSLAACも含める、ログ突合はRandomを除外する、といった分離が現実的です。

よくある質問(誤判定を防ぐための補足)

ipconfig /all では静的/動的が分かりにくいのはなぜ?

ipconfig /all はトラブルシュートに便利ですが、IPv6の“Origin”を分類する目的には情報が足りないことがあります。IPv6は複数アドレスが共存する前提なので、判定ロジックを組むなら Get-NetIPAddress のようにOriginが明示される情報源が向いています。

「動的=不安定」ではない?

IPv6では「動的(自動取得)」でも、結果として長く同じアドレスが使われるケースがあります(例:SLAACで安定的に同じプレフィックスが配られている等)。逆に、手動で固定していても一時アドレスが併存し、見た目は“変わっている”ように見えることもあります。だからこそ、静的/動的の二択ではなく、Originを分解して扱うのが重要です。

リンクローカルは静的?動的?

リンクローカルはIPv6の基本機能としてほぼ常に存在し、実務では「判定対象から除外」されることが多いです。監査したいのが“業務ネットワークで使うIPv6(グローバル/ULA)”なら、リンクローカルは最初からフィルタしておくと判断がブレません。

参考リンク

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次