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 を参照できます。
| 判定したいこと | 見るべき項目 | 代表的な値 | ざっくり意味 |
|---|---|---|---|
| 手動(静的)か? | PrefixOrigin | Manual | 管理者が手動で設定 |
| DHCPv6で配布か? | PrefixOrigin | Dhcp | DHCPサーバー由来 |
| SLAAC(RA)で自動設定か? | PrefixOrigin | RouterAdvertisement | ルーター広告(RA)由来 |
| 一時アドレス(ランダム)か? | SuffixOrigin | Random | ホスト部がランダム生成 |
| リンクローカルなど“既知”か? | PrefixOrigin / SuffixOrigin | WellKnown | 予約・既知のプレフィックス/サフィックス |
手早く確認: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 | 手動で設定 | 管理者が固定アドレスを設定 | 「静的(手動)」とみなしてよい |
| Dhcp | DHCPサーバーから供給 | 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 | 手動で設定 | 固定のホスト部 | 厳密に「完全固定」に寄せたいときの判断材料 |
| OriginDhcp | DHCPから供給 | 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)”なら、リンクローカルは最初からフィルタしておくと判断がブレません。

コメント