Arp für IPv6 bzw. wie kann ich zu einer IPv6-Adresse die zugehörige IPv4-Adresse unter Windows ermitteln?


Wenn man unter aktuellen Windowsversionen z. B. Get-SmbOpenFile verwendet, um z. B. sehen zu können, welcher Benutzer auf welchem Rechner gerade welche Dateien geöffnet hat, so bekommt man dort einen ClientComputername angegeben. Leider wird dieser ClientComputername oft als IPv6-Adresse und nicht als IPv4-Adresse angegeben. Im Grunde ist es ja korrekt alles über IPv6 zu machen aber wir Menschen tun uns halt schwer mit den IPv6-Adressen.

Wie kann man nun aber zu einer IPv6-Adresse die zugehörige IPv4-Adresse im lokalen Netz ermitteln? Ein Aufruf von ARP.EXE zeigt gähnende Leere, denn es zeigt nur IPv4-Adressen an. Einen Parameter –6 oder ARP6.EXE gibt es nicht.

Nun könnte man NETSH.EXE das alte Universaltool rauskramen und mittels

netsh int ipv6 show neigh

die MAC-Adressen zu den MAC-Adressen von der ARP.EXE-Ausgabe in Beziehung setzen. Aber das artet schnell in Arbeit aus.

Hier hilft wie immer Powershell, denn dort gibt es das Get-NetNeighbor-Cmdlet und damit kommt man bei richtiger Anwendung ganz schnell zum Ziel:

PS> Get-NetNeighbor| Group-Object linklayeraddress | where count -eq 2 | select -ExpandProperty group

ifIndex IPAddress                 LinkLayerAddress 
——- ———                 —————- 
3       fe80::41dc:1d58:7d3b:c57b EC-A8-6B-D1-F5-46
3       192.168.100.72            EC-A8-6B-D1-F5-46
3       fe80::1e74:dff:feac:c8d0  1C-74-0D-AC-C8-D0
3       192.168.100.1             1C-74-0D-AC-C8-D0

Hier sieht man schön, dass die passenden IP-Adressen immer durch die MAC-Adresse beieinander gruppiert sind und so schön von der einen auf die andere geschlossen werden kann.

Da wir uns schon wieder bei Powershell befinden, ist es sicher sinnvoll daraus gleich eine Funktion zu machen, welche in Skripten verwendet werden kann.

Function Convert-IPAddress {
[CmdletBinding()]
Param(
  [IPAddress]$IPAdresse
)

$n=Get-NetNeighbor

# Alle IP-Adressen mit MAC-Adressen ermitteln:
$nip = $n|where linklayeraddress -ne ""| sort linklayeraddress

# MAC-Adresse zur gesuchten IP-Adresse ermitteln: 
$nMAC = $nip | where ipaddress -eq $IPAdresse.IPAddressToString
# alle IP-Adressen zur ermittelten MAC holen:
$rip = $nip | where linklayeraddress -eq $nmac.LinkLayerAddress

$rip = $rip| where ipaddress -ne $IPAdresse.IPAddressToString

If ([System.Net.Sockets.AddressFamily]::InterNetworkV6 -eq $IPAdresse.AddressFamily) {
  # von IPv6 nach IPv4, also nur IPv4 zurückgeben
  ($rip | where {([IPAddress]$_.IPAddress).AddressFamily -eq [System.Net.Sockets.AddressFamily]::InterNetwork}).IPAddress
} else {
  If ([System.Net.Sockets.AddressFamily]::InterNetwork -eq $IPAdresse.AddressFamily) {
   # von IPv4 nach IPv6, also nur IPv6 zurückgeben
   ($rip | where {([IPAddress]$_.IPAddress).AddressFamily -eq [System.Net.Sockets.AddressFamily]::InterNetworkV6}).IPAddress
  } 
}
}

Damit kann man nun ganz einfach die IP-Adresse konvertieren:

PS> Convert-IPAddress fe80::1e74:dff:feac:c8d0
192.168.100.1
PS> Convert-IPAddress 192.168.100.1
fe80::1e74:dff:feac:c8d0

Gibt man eine Adresse an, zu der es keine Entsprechung gibt, bekommt man einfach $Null zurück.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s


%d Bloggern gefällt das: