SLAAC
Modified EUI-64 RFC 4291
Windows:
- Windows 10 Powershell: Set-NetIPv6Protocol -RandomizeIdentifiers Disabled
- Windows 7 CMD: netsh interface ipv6 set global randomizeidentifiers=disabled
Linux:
In Network Manager gibt es die Variable addr-gen-mode, die ist per default “stable-privacy”. Kann man auf “eui-64” setzen. https://developer.gnome.org/NetworkManager/stable/nm-settings.html
Stable-Privacy Adresse (RFC 7217)
Die Stable-Privacy Adresse (RFC 7217) ist eine für jeden Präfix
(auch für den Link-Local Präfix fe80::
) zufällige IPv6 Adresse,
die im Gegensatz zu der Temporären Adresse (RFC 4941)
nicht periodisch gewechselt wird. Dabei wird für einen bestimmten Präfix
immer die selbe zufällige Interface ID (IID) generiert. Dadurch entstehen
stabile IPv6 Adressen, mit IID’s die nicht von der MAC-Adresse
abgeleitet wurden und für jeden Präfix unterschiedlich sind. Dadurch ist es,
wie bei Temporären Adresse (RFC 4941),
nicht mehr möglich einen Client, wegen der eindeutigen MAC-Adresse, dauerhaft
zuzuordnen. Auch bei unterschiedlicher Präfix.
Windows:
Sowohl Windows 7 als auch Windows 10 machen nicht standardmäßig EUI-64 sondern Stable-Privacy.
Linux:
Für die Generierung einer Stable-Privacy Adresse wird der stable_secret
Kernel-Parameter
verwendet. Auszug aus dem Kernel-Docu:
stable_secret - IPv6 address
This IPv6 address will be used as a secret to generate IPv6
addresses for link-local addresses and autoconfigured
ones. All addresses generated after setting this secret will
be stable privacy ones by default. This can be changed via the
addrgenmode ip-link. conf/default/stable_secret is used as the
secret for the namespace, the interface specific ones can
overwrite that. Writes to conf/all/stable_secret are refused.
It is recommended to generate this secret during installation
of a system and keep it stable after that.
By default the stable secret is unset.
Dieser ist jedoch standardmäßig leer:
$ sysctl net.ipv6.conf.enp0s25.stable_secret
Wobei enp0s25
das Interface ist, für dass eine Stable-Privacy Adresse benötigt wird.
In der Kernel-Docu findet man jedoch
direkt darunter addr_gen_mode
:
addr_gen_mode - INTEGER
Defines how link-local and autoconf addresses are generated.
0: generate address based on EUI64 (default)
1: do no generate a link-local address, use EUI64 for addresses generated
from autoconf
2: generate stable privacy addresses, using the secret from
stable_secret (RFC7217)
3: generate stable privacy addresses, using a random secret if unset
Da stable_secret
leer ist muss zuerst mit dem Wert 3
gestartet werden:
$ sysctl net.ipv6.conf.enp0s25.addr_gen_mode=3
net.ipv6.conf.enp0s25.addr_gen_mode = 3
Danach war für das enp0s25
Interface stable_secret
nicht mehr leer:
$ sysctl net.ipv6.conf.enp0s25.stable_secret
net.ipv6.conf.enp0s25.stable_secret = 1fce:5cb3:2f44:509a:78bb:c290:4a56:c43d
Danach muss das Interface neu gestartet werden.
Auswirkung:
Nach dem Neustart des Interfaces sieht die Ausgabe von ip a
wie folgt aus:
$ ip a
enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:19:99:f7:ce:a6 brd ff:ff:ff:ff:ff:ff
inet6 2001:7c0:100:1101:ebcc:8c19:19b1:6e2b/64 scope global dynamic mngtmpaddr stable-privacy
valid_lft 2591779sec preferred_lft 604579sec
inet6 fe80::24ab:b189:f1ac:d3e9/64 scope link stable-privacy
valid_lft forever preferred_lft forever
Sowohl beim Globalen IPv6 Adresse als auch bei der Link-Local Adresse ist nun stable-privacy
zu sehen.
Bei beiden Adressen ist die IID nicht von der MAC-Adresse abgeleitet wurden.
Dauerhafte Konfiguration:
Für die dauerhafte Konfiguration einer Stable-Privacy Adresse muss zum einen der Wert
aus net.ipv6.conf.enp0s25.stable_secret
unter /etc/sysctl.d/40-ipv6.conf
eingetragen werden
und zum anderen net.ipv6.conf.wlan0.addr_gen_mode
auf 2
gesetzt werden:
/etc/sysctl.d/40-ipv6.conf
# Enable IPv6 stable privacy mode for enp0s25 net.ipv6.conf.enp0s25.stable_secret = 1fce:5cb3:2f44:509a:78bb:c290:4a56:c43d net.ipv6.conf.enp0s25.addr_gen_mode = 2
Somit bleiben, auch nach einem Neustart, die IPv6 Stable-Privacy Adressen gleich.
Temporäre Adresse RFC 4941
Die Temporäre Adresse (RFC 4941) ist wie die Stable-Privacy Adress (RFC 7217) eine IPv6 Adresse bei der die Interface ID (IID) zufällig generiert wird. Die IID wird wie bei Stable-Privacy Adress (RFC 7217) nicht von der MAC-Adresse abgeleitet. Jedoch besitzen die Temporären Adressen einen Lifetime und werden nach ablaufen dieser Zeit neu generiert. Im Gegensatz zu Stable-Privacy Adress (RFC 7217) wirkt sich das nur auf *Global Adressen aus und zum Beispiel nicht auf die Link-Local Adresse. Die Idee dahinter ist, dass für die Kommunikation ein Clients die Temporären Adresse als Source Adresse nutzt und somit nicht eine Global Adresse dessen IID die MAC-Adresse beinhaltet. Somit ist es nicht mehr möglich einen Client, wegen der eindeutigen MAC-Adresse, dauerhaft zuzuordnen. Auch bei unterschiedlicher Präfix. Zusätzlich ist, durch die periodische Änderung, eine Zuordnung über eine Zeit länger als im Lifetime definiert, nicht möglich.
Linux:
Für die Generierung einer Temprären Adresse wird der use_tempaddr
Kernel-Parameter
verwendet. Auszug aus dem Kernel-Docu:
use_tempaddr - INTEGER
Preference for Privacy Extensions (RFC3041).
<= 0 : disable Privacy Extensions
== 1 : enable Privacy Extensions, but prefer public
addresses over temporary addresses.
> 1 : enable Privacy Extensions and prefer temporary
addresses over public addresses.
Default: 0 (for most devices)
-1 (for point-to-point devices and loopback devices)
Will man also für das Interface enp0s25
eine Temporäre Adresse konfigurieren sollte man den wert für
use_tempaddr
auf 2
setzen, damit der Client die Temporäre Adresse als Source Adresse nutzt.
$ sysctl net.ipv6.conf.enp0s25.use_tempaddr=2
net.ipv6.conf.enp0s25.use_tempaddr = 2
Der Kernel-Parameter temp_valid_lft
gibt in Sekunden an, wie lange eine Temporäre Adresse gültig ist und wann
eine neue generiert werden muss. Standardmäßig liegt der Wert bei 604800 Sekunden (7 Tage).
$ sysctl net.ipv6.conf.enp0s25.temp_valid_lft
net.ipv6.conf.enp0s25.temp_valid_lft = 604800
Zum Schluß muss das Interface neu gestartet werden
Auswirkung:
Nach dem Neustart des Interfaces sieht die Ausgabe von ip a
wie folgt aus:
$ip a
enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:19:99:f7:ce:a6 brd ff:ff:ff:ff:ff:ff
inet6 2001:7c0:100:1101:e17b:58f9:ceb8:a290/64 scope global temporary dynamic
valid_lft 604794sec preferred_lft 86297sec
inet6 2001:7c0:100:1101:219:99ff:fef7:cea6/64 scope global dynamic mngtmpaddr
valid_lft 2591994sec preferred_lft 604794sec
inet6 fe80::219:99ff:fef7:cea6/64 scope link
valid_lft forever preferred_lft forever
Zusätzlich zu der Global Adresse gibt es noch eine Temporäre Adresse (global temporary
) dessen
IID nicht von der MAC-Adresse abgeleitet wurde.
Dauerhafte Konfiguration:
Für die dauerhafte Konfiguration einer Temporären Adresse muss folgendes in /etc/sysctl.d/40-ipv6.conf
eingetragen werden:
/etc/sysctl.d/40-ipv6.conf
# Enable IPv6 Privacy Extensions for enp0s25 net.ipv6.conf.enp0s25.use_tempaddr = 2