Barungar
Well-known member
Es ist wieder mal Zeit für einen neuen Beitrag aus der Rubrik Barungar's IPv6 Fundgrube.
Heute möchte ich mir einmal dem Thema "Stabile IPv6-Adresse im Heimnetz mit FritzBox und Windows 10 oder 11" widmen.
Wer braucht / möchte überhaupt stabile IPv6-Adressen in seinem Heimnetz haben?
Grundsätzlich sind das die Anwender, die einen Dienst per IPv6 im Internet anbieten wollen.
Das kann eine Freigabe für ein Multiplay-Spiel, eine Freigabe für einen BitTorrent-Client oder was man halt sonst so auf einem Windows 10/11 PC "freigeben" möchte.
Die ideale, öffentliche und stabile IPv6-Adresse...
ist für die meisten Heim-Anwender nicht erreichbar, weil Ihnen das stabile Präfix fehlt. Die Internet-Provider, obwohl sie genug Präfixe besitzen, "lieben" Dynamik, bei jedem Verbindungsaufbau erhaltet Ihr daher von Eurem Provider ein neues IPv6-Präfix.
Dagegen hilft nur die Buchung eines festen IPv6-Präfixes. Wenn der Provider dies anbietet verlangt er sehr oft dafür einen Aufpreis oder verweist Euch direkt auf teurere Business-Tarife.
Ist hier also schon Schluss? Jein... denn Adressdynamik sind Heimanders bereits seit Jahrzehnten gewöhnt, dafür gibt es DynDNS-Dienste... auch im IPv6-Zeitalter.
DynDNS heilt also alle Probleme...?
Nein, bei IPv6-Freigaben in Verbindung mit einem Home-Router, wie einer FritzBox, und Windows 10/11 leider nicht. Denn es gibt da noch zwei weitere Hürden. Einerseits nutzt Windows 10/11 IPv6 Privacy Extensions, aber anderersdeits unterstützt Windows 10/11 keine IPv6 SLAAC nach EUI-64 mehr. Das hat Microsoft komplett rausgepatcht!
Seit dem generiert Windows 10/11 ausschließlich IPv6 SLAAC ausschließlich nach RFC 7217. Mit diesem Verfahren kann zwar eine verschleierte, stabile IPv6 per SLAAC erzeugt werden, aber die Adresse ist nur dann stabil, wenn unter anderem auch das Präfix stabil ist. Da wir aber schon festgestellt haben, dass Heimanwender in der Regel kein stabiles Präfix haben, "raubt" Microsoft den Windows 10/11 Anwendern nun auch noch die stabile InterfaceID.
Die stabile InterfaceID mit wechselndem Präfix ist aber die Voraussetzung um eine stabile IPv6-Freigabe in der FritzBox anlegen zu können. Die FritzBox "erwartet" grundsätzlich, dass stabile InterfaceIDs per EUI-64 bestimmt werden, in diesem Fall "erkennt" die FritzBox die InterfaceID sogar selbst. Falls eine von EUI-64 abweichende, stabile InterfaceID verwendet wird, kann man diese in der FritzBox manuell anpassen.
Ist DHCPv6 die Rettung...?
Die FritzBox beherrscht ja auch DHCPv6. Kann uns das an dieser Stelle weiterbringen auf der Mission eine stabile InterfaceID bei wechselndem Präfix zu erhalten?!
Schauen wir uns dazu kurz und oberflächlich an, wie DHCPv6 eine Adresse bestimmt.
DHCPv6 bestimmt die IPv6, die es dem Client zuweist aus verschiedenen Komponenten. Die wichtigsten Teile sind dabei das IPv6-Präfix und die DUID des Clients. Als Ergebnis erhält man eine IPv6 vom DHCPv6-Server, die im jeweiligen IPv6-Subnet gültig ist. Dabei erhält man bei wechselndem Präfix und stabiler DUID aber auch keine stabile InterfaceID. Generell kann man sagen, dass DHCPv6 keinen Wert auf stabile Adressen legt. Im Gegensatz zu DHCPv4 bei dem das "statische Lease" noch ein sehr verbreitetes Feature ist. DHCPv6 kennt zwar auch (noch) das statische Lease, aber selbst die DUID des Clients ist bei IPv6 viel zu volatil.
Fazit
Wir können also konstatieren, dass es ist von Microsoft nicht erwünscht ist, dass Windows 10/11 stabile IPv6-Adressen erzeugt! Denn sonst hätte man EUI-64 nicht komplett aus dem TCP/IP-Stack von Windows 10/11 herausgepatcht.
Auf Grund des Designs von DHCPv6 ist es auch grundsätzlich nicht geeinigt stabile IPv6-Adressen zu liefern, es liefert bestenfalls pseudo-stabile IPv6 in Abhängigkeit von Präfix und DUID.
Die einzige Möglichkeit, die ein Anwender noch hat, wenn er eine IPv6-Freigabe auf seinem Windows 10/11 über seine FritzBox machen möchte, ist sich mittels Skript zu helfen.
Ein mögliches Skript
Anbei ein kleines Skript, das diese Aufgaben erledigen kann. Es prüft ob es bereits eine "manuell zugewiesene" IPv6-Adresse auf der Netzwerkkarte gibt, falls nein, so erstellt es sie. Falls ja, dann prüft es gegen die anderen GA-Adressen, ob diese noch gültig sind und aktualisiert diese bei bedarf. Das Skript kann man zeitgesteuert im Hintergrund laufen lassen, es braucht jedoch Admin-Rechte. Weil ein einfacher User nicht die IPv6-Konfiguration ändern darf.
Heute möchte ich mir einmal dem Thema "Stabile IPv6-Adresse im Heimnetz mit FritzBox und Windows 10 oder 11" widmen.
Wer braucht / möchte überhaupt stabile IPv6-Adressen in seinem Heimnetz haben?
Grundsätzlich sind das die Anwender, die einen Dienst per IPv6 im Internet anbieten wollen.
Das kann eine Freigabe für ein Multiplay-Spiel, eine Freigabe für einen BitTorrent-Client oder was man halt sonst so auf einem Windows 10/11 PC "freigeben" möchte.
Die ideale, öffentliche und stabile IPv6-Adresse...
ist für die meisten Heim-Anwender nicht erreichbar, weil Ihnen das stabile Präfix fehlt. Die Internet-Provider, obwohl sie genug Präfixe besitzen, "lieben" Dynamik, bei jedem Verbindungsaufbau erhaltet Ihr daher von Eurem Provider ein neues IPv6-Präfix.
Dagegen hilft nur die Buchung eines festen IPv6-Präfixes. Wenn der Provider dies anbietet verlangt er sehr oft dafür einen Aufpreis oder verweist Euch direkt auf teurere Business-Tarife.
Ist hier also schon Schluss? Jein... denn Adressdynamik sind Heimanders bereits seit Jahrzehnten gewöhnt, dafür gibt es DynDNS-Dienste... auch im IPv6-Zeitalter.
DynDNS heilt also alle Probleme...?
Nein, bei IPv6-Freigaben in Verbindung mit einem Home-Router, wie einer FritzBox, und Windows 10/11 leider nicht. Denn es gibt da noch zwei weitere Hürden. Einerseits nutzt Windows 10/11 IPv6 Privacy Extensions, aber anderersdeits unterstützt Windows 10/11 keine IPv6 SLAAC nach EUI-64 mehr. Das hat Microsoft komplett rausgepatcht!
Seit dem generiert Windows 10/11 ausschließlich IPv6 SLAAC ausschließlich nach RFC 7217. Mit diesem Verfahren kann zwar eine verschleierte, stabile IPv6 per SLAAC erzeugt werden, aber die Adresse ist nur dann stabil, wenn unter anderem auch das Präfix stabil ist. Da wir aber schon festgestellt haben, dass Heimanwender in der Regel kein stabiles Präfix haben, "raubt" Microsoft den Windows 10/11 Anwendern nun auch noch die stabile InterfaceID.
Die stabile InterfaceID mit wechselndem Präfix ist aber die Voraussetzung um eine stabile IPv6-Freigabe in der FritzBox anlegen zu können. Die FritzBox "erwartet" grundsätzlich, dass stabile InterfaceIDs per EUI-64 bestimmt werden, in diesem Fall "erkennt" die FritzBox die InterfaceID sogar selbst. Falls eine von EUI-64 abweichende, stabile InterfaceID verwendet wird, kann man diese in der FritzBox manuell anpassen.
Ist DHCPv6 die Rettung...?
Die FritzBox beherrscht ja auch DHCPv6. Kann uns das an dieser Stelle weiterbringen auf der Mission eine stabile InterfaceID bei wechselndem Präfix zu erhalten?!
Schauen wir uns dazu kurz und oberflächlich an, wie DHCPv6 eine Adresse bestimmt.
DHCPv6 bestimmt die IPv6, die es dem Client zuweist aus verschiedenen Komponenten. Die wichtigsten Teile sind dabei das IPv6-Präfix und die DUID des Clients. Als Ergebnis erhält man eine IPv6 vom DHCPv6-Server, die im jeweiligen IPv6-Subnet gültig ist. Dabei erhält man bei wechselndem Präfix und stabiler DUID aber auch keine stabile InterfaceID. Generell kann man sagen, dass DHCPv6 keinen Wert auf stabile Adressen legt. Im Gegensatz zu DHCPv4 bei dem das "statische Lease" noch ein sehr verbreitetes Feature ist. DHCPv6 kennt zwar auch (noch) das statische Lease, aber selbst die DUID des Clients ist bei IPv6 viel zu volatil.
Fazit
Wir können also konstatieren, dass es ist von Microsoft nicht erwünscht ist, dass Windows 10/11 stabile IPv6-Adressen erzeugt! Denn sonst hätte man EUI-64 nicht komplett aus dem TCP/IP-Stack von Windows 10/11 herausgepatcht.
Auf Grund des Designs von DHCPv6 ist es auch grundsätzlich nicht geeinigt stabile IPv6-Adressen zu liefern, es liefert bestenfalls pseudo-stabile IPv6 in Abhängigkeit von Präfix und DUID.
Die einzige Möglichkeit, die ein Anwender noch hat, wenn er eine IPv6-Freigabe auf seinem Windows 10/11 über seine FritzBox machen möchte, ist sich mittels Skript zu helfen.
Ein mögliches Skript
Anbei ein kleines Skript, das diese Aufgaben erledigen kann. Es prüft ob es bereits eine "manuell zugewiesene" IPv6-Adresse auf der Netzwerkkarte gibt, falls nein, so erstellt es sie. Falls ja, dann prüft es gegen die anderen GA-Adressen, ob diese noch gültig sind und aktualisiert diese bei bedarf. Das Skript kann man zeitgesteuert im Hintergrund laufen lassen, es braucht jedoch Admin-Rechte. Weil ein einfacher User nicht die IPv6-Konfiguration ändern darf.
Code:
# ---------------------------------------------------------
# In diese beiden Variablen bitte Wunsch-InterfaceID
# und Windows Netzwerkkarten-Name eintragen.
# Das Präfix bitte vollständig ausschreiben!
# Im Beispiel heißt die Netzwerkkarte Main in Windows
# und das Wunschpräfix ist ::affe.
# ---------------------------------------------------------
# ---------------------------------------------------------
# Wunsch-InterfaceID und Windows Netzwerkkarten-Name
# ---------------------------------------------------------
$UserFixInterface = "0000:0000:0000:affe"
$UserNIC = "Main"
# ---------------------------------------------------------
# Funktionssammlung
# ---------------------------------------------------------
function Get-IPv6Global {
param(
[Parameter(Mandatory=$true)]
[string]$Interface
)
netsh interface ipv6 show addresses $Interface |
Where-Object { $_ -like "*Adresse*" } |
ForEach-Object {
if ($_ -match 'Adresse\s+([0-9a-f:]+[%0-9]*)') {
$Matches[1]
}
} |
Where-Object {
($_ -notmatch '^(fe80|fd00|fc00)') # Filter: Link-Local + ULA
}
}
function Expand-IPv6 {
param(
[Parameter(Mandatory=$true)]
[string]$IPv6
)
$clean = $IPv6 -replace '%\d+$',''
if ($clean -contains "::") {
$parts = $clean -split "::"
$left = $parts[0].Split(":", [System.StringSplitOptions]::RemoveEmptyEntries)
$right = $parts[1].Split(":", [System.StringSplitOptions]::RemoveEmptyEntries)
$missing = 8 - ($left.Count + $right.Count)
$middle = @("0" * $missing)
$blocks = $left + $middle + $right
}
else {
$blocks = $clean.Split(":")
}
$blocks = $blocks | ForEach-Object {
$_.PadLeft(4, "0")
}
return $blocks
}
function Get-IPv6Prefix64 {
param(
[Parameter(Mandatory=$true)]
[string]$IPv6
)
$blocks = Expand-IPv6 $IPv6
return ($blocks[0..3] -join ':')
}
function Get-IPv6InterfaceID {
param(
[Parameter(Mandatory=$true)]
[string]$IPv6
)
$blocks = Expand-IPv6 $IPv6
return ($blocks[4..7] -join ':')
}
function Normalize-IPv6 {
param([string]$IPv6)
try {
return ([System.Net.IPAddress]::Parse($IPv6)).ToString()
}
catch {
return $null
}
}
# ---------------------------------------------------------
# 1) Alle globalen IPv6-Adressen holen und NORMALISIEREN
# ---------------------------------------------------------
$GlobalIPs = Get-IPv6Global -Interface $UserNIC | ForEach-Object { Normalize-IPv6 $_ }
$Prefixes = $GlobalIPs | ForEach-Object { Get-IPv6Prefix64 $_ } | Sort-Object -Unique
$Existing = $GlobalIPs | Where-Object { (Get-IPv6InterfaceID $_) -eq $UserFixInterface }
# ---------------------------------------------------------
# 2) Für jedes Präfix sicherstellen, dass genau eine Wunsch-IPv6 existiert
# ---------------------------------------------------------
foreach ($prefix in $Prefixes) {
$ExpectedIPv6 = "$($prefix):$UserFixInterface"
$ExpectedIPv6Norm = Normalize-IPv6 $ExpectedIPv6
if ($GlobalIPs -contains $ExpectedIPv6Norm) {
continue
}
netsh interface ipv6 add address $UserNIC $ExpectedIPv6Norm
}
# ---------------------------------------------------------
# 3) Alte Wunsch-IPv6 löschen, deren Präfix nicht mehr existiert
# ---------------------------------------------------------
foreach ($old in $Existing) {
$oldPrefix = Get-IPv6Prefix64 $old
if ($Prefixes -notcontains $oldPrefix) {
netsh interface ipv6 delete address $UserNIC $old
}
}