SLAAC

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