Bar

PowerShell でIPv6のModified EUI-64(インターフェースID)を生成するスクリプト

IPv6を理解する一環として、PowerShellを使ってIPv6のEUI-64(インターフェースID)を生成するスクリプトを書いてみました。
ビット演算、初めて使ったかも。

Modified EUI-64の生成方法

サンプル スクリプト


function ConvertTo-NetIPv6Eui64{

<#
.SYNOPSIS
    Calculate EUI64 from MAC address.

.DESCRIPTION
    EUI64 is IPv6 Interface ID.

.PARAMETER mac
    Network-Card MAC address. 

.EXAMPLE
    c:PS>xxx.ps1 -mac "00:11:22:AA:BB:CC"
    > 211:22FF:FEAA:BBCC

.EXAMPLE
    c:PS>xxx.ps1 -mac "00-11-22-AA-BB-CC"
    > 211:22FF:FEAA:BBCC

.INPUTS
    None. 

.OUTPUTS
    None. 

.NOTES
    Author: Satoru Nasu.

.LINK
    http://nasunoblog.blogspot.com/

#>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$True,Position=1)]
        [string]$mac
    )

    $addMac = "FF:FE"
    $delimiter = ":"
    $delimiterSub = "-"

    # 正規表現でMACアドレスをチェック
    # [0-9A-Fa-f]{2}[:-])を{5}回繰り返し、最後に[0-9A-Fa-f]{2}[:-])
    if(($mac -match "^([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}$") -eq $false){
        return $false
    }

    # MACアドレスの区切り文字を:へ変換
    if($mac.IndexOf($delimiterSub) -gt 0){
        $mac = $mac -replace $delimiterSub, $delimiter
    }

    # $macを$delimiterで分割
    $x = $mac -split $delimiter

    # InterfaceID生成用配列
    $r = $x[0..2] + ($addMac -split $delimiter) + $x[3..5]

    # 16進数→10進数 & 先頭7bit目を反転
    $a = [Convert]::ToInt32($r[0],16) -bxor 2

    # 10進数→16進数
    $r[0] = ([convert]::ToString($a, 16)).ToUpper()

    return @(($r[0..1] -join ""), ($r[2..3] -join ""), ($r[4..5] -join ""), ($r[6..7] -join "")) -join $delimiter
}

WindowsはインターフェースIDをランダムに生成

IPv6 アドレスが割り当てられたWindows 10でインターフェースIDを確認すると全く違う値になっています。
当初「計算方法が違っているのか?」と思いましたが、実はWindowsの仕様でした。
Windowx XP時代の古いドキュメントですが、RFC 3401の技術仕様によるもの。
まだまだ知らない事ばかりです。精進精進...
https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/sag_ip_v6_imp_addr7.mspx?mfr=true