IPv6

Der grösste Unterschied zwischen IPv4 und IPv6 liegt im Adressraum: über die 128 Bit langen IPv6-Adressen lassen sich - ganz ohne Tricks wie NAT & Co. - unvorstellbare 340 Sextillionen Geräte und Dienste individuell ansprechen, was einer Vergrösserung um den Faktor 2^96 gegenüber den 3.7 Milliarden nutzbarer Adressen in IPv4 entspricht. Theoretisch könnte man damit jedem Sandkorn auf der Erde mehrere Internetadressen zuweisen.

Geräte erhalten bereits dann eine IPv6-Adresse, wenn sie noch gar nicht am Netzwerk angebunden sind, da IPv6 von sich aus bereits Mechanismen zur automatischen Konfiguration beherrscht (ein DHCPv6 ist in kleinen Netzen unnötig) - die so genannte Link-Local-Adresse, die zur Kommunikation im eigenen Subnetz Verwendung findet und niemals den Router verlässt.

IPv4 versus IPv6 im Überblick:

  • Adresslänge:
    IPv4: 4 Bytes (32 Bits)
    IPv6: 16 Bytes (128 Bits)
  • Link-Local-Adressen zur Adressierung von Nodes in abgeschlossenen Netzwerksegmenten sowie zur Autokonfiguration oder Neighbour-Discovery:
    IPv4: 169.254.0.0/16
    IPv6: fe80::/64 (Link-Local Adressen können wie normale Adressen auch von anderen Hosts auf dem gleichen Link genutzt werden)
  • Site Local Unicast, standortlokale Adressen:
    IPv4: 192.168.x.x
    IPv6: veraltet, keine zukünftige Entsprechung
  • Unique Local Unicast als Nachfolger der standortlokalen Adressen:
    IPv4: -
    IPv6: fc00::/7 (derzeit nur mit Präfix fd zu verwenden. Beispiel: fd9e:21a7:a92c:2323::1)
  • Verbieten von ICMP:
    IPv4: üblich
    IPv6: nicht durchführbar, da z.B. das Neighbor Discovery Protocol (NDP), welches ARP ersetzt, auf ICMPv6 basiert

Umgang mit IPv6 in diversen Tools:

ping6 fe80::250:56ff:febc:6930%ens32
ssh fe80::250:56ff:febc:6930%ens32
ip -6 route list

Darstellung

Aufbau der 16 Bytes / 128 Bit-Adressen:

XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX

Verkürzung einer Adresse am Beispiel:

2001:0000:1234:0000:0000:c1c0:abcd:0876

Führende Nullen werden zusammengestrichen:

2001:0:1234:0:0:c1c0:abcd:876

Die längste Kette zusammenhängender Nullen wird einfach mit „::“ abgekürzt:

2001:0:1234::c1c0:abcd:876

Die localhost-Adresse wird mit ::1 abgekürzt angegeben.

CDIR-Notation

Die ersten 64 Bit bilden das Netzwerk-Präfix, die restlichen den Interface Identifier („Host“). Die Adressen werden in 16-Bit-Blöcken durch Doppelpunkt getrennt und im Gegensatz zu IPv4 nicht dezimal, sondern hexadezimal notiert.

Die Adresse 1080:6809:8086:6502/64 beispielsweise gibt ab, dass die ersten 64 Bits unveränderbar sind. Bei 2001:db8:1:/48 sind die ersten 48 Bits statisch, die folgenden 16 Bits aber frei wählbar, so dass sich 2^16 = 65’563 Netze bilden lassen.

Der Interface Identifier wird meist aus der MAC-Adresse abgeleitet. Aus 00:50:56:bc:13:01 macht RHEL beispielsweise ein fe80::250:56ff:febc:6930.

Eine Site besitzt in der Regel ein 48 bit langes Prefix. Solch ein Netzwerk wird von Providern verwaltet und besitzt 1’208’925’819’614’629’174’706’176 Adressen.

In einer URL mit Port-Angabe wird eine IPv6 wie folgt verwendet:

https://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443/...

Eine 2002::/16-Adresse weist auf eine 6to4-Tunnel-Adresse hin.

IPv6 im Netz

Ist eine Netzwerkverbindung vorhanden, sendet RHEL eine „Neighbor Solicitation Message“ über ICMPv6 an die generierte Link-Local-Adresse, um zu prüfen, ob die Adresse bereits verwendet wird („Duplicate Address Detection“). Erhält es eine „Neighbor Advertisment Message“, wird die Adresse bereits verwendet; die Wahrscheinlichkeit dafür ist aber äusserst gering.

IPv6 verzichtet aufgrund des riesigen Adressraums auf Broadcasts und verwendet Multicasts, um Netzwerkgeräte mit speziellen Eigenschaften zu ermitteln. Per Multicast an FF02::1 melden sich beispielsweise alle aktiven Rechner, Router antworten bei einem Multicast an FF02::2. Eine Anwendung kann beliebige (selbstdefinierte) Multicast-Gruppen abonnieren, um über weitere Netzteilnehmer benachrichtigt zu werden.

Für den Zugang ins Internet wird ein IPv6-fähiger Router benötigt. Entweder verteilt dieser die Zugangsinformationen (Gateway-Adresse, globales IPv6-Netzwerk-Präfix des Internet-Providers, IPv6-DNS) per ICMPv6 an „sein“ internes Netz, oder sie werden vom Client per „Router Solicitation“-Nachricht über ICMPv6 angefordert, die mit einem „Router Advertisment“ beantwortet wird. Mit den erhaltenen Informationen wird eine weitere IPv6-Adresse für den Zugang zum Internet generiert, die derzeit mit einer 2 beginnt. Aus fe80::250:56ff:febc:6930 wird damit zum Beispiel 2001:db8:1:1:250:56ff:febc:6930. Zudem erhält der Rechner die benötigten Routen, die sich per ip -6 route list einsehen lassen.

Aus Gründen der Sicherheit und zum Schutz der Privatsphäre ist die leicht rückverfolgbare automatische Adressvergabe um die „Privacy Extensions for Stateless Address Autoconfiguration“ erweitert worden, die die Adresse stärker „randomisiert“. Unter RHEL muss man das von Hand aktivieren (im Beispiel heisst das Netzwerk-Interface ens32), anschliessend wird die Adresse darüber hinaus alle 24h erneuert:

/etc/sysctl.conf
net.ipv6.conf.ens32.use_tempaddr = 2
sysctl -p

Um die IPv6-Adresse zu einem Hostnamen zu ermitteln, hilft dig:

dig -t AAAA www.example.com

IPv6 abschalten

Falls benötigt schaltet man IPv6 wie folgt ab. Im laufenden System:

echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6
echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6

Dauerhaft:

/etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
sysctl -p

Website in einem vDC per IPv6 anbieten

(internal only)

  • Zuerst muss die zentrale Firewall eine IPv6-Adresse bekommen.

  • Damit IPv6 überhaupt funktioniert, muss man ICMPv6 erlauben. Dazu im Fwbuilder:

    • die Policy der VM auswählen, links unten „Rule set“ auf „IPv4 and IPv6“.

    • dem Interface der VM eine IPv6-Adresse geben. Diese sollte man im Webinterface vom Provider finden.

    • folgende Regel (Rule 1) anlegen mit „stateless“ Option erstellen:

    ../../_images/fwb-ipv6-rule.png
  • Damit man vom Provider die IPv6-Adresse und Routen bekommt, muss zuerst IPv6 im NetworkManager aktiviert werden. Dazu muss in den network_connections ipv6_disabled: false und auto6: true gesetzt werden und die network-Rolle ausgeführt werden.

  • Adresse und Routen anzeigen lassen:

# Adresse mit "scope global"
ip -6 a

# gateway
ip -6 r | grep default
  • Basierend darauf kann nun die network_connections angepasst werden, zB:

network_connections:
  - name: 'eth0'
    type: 'ethernet'
    autoconnect: true
    ip:
      address:
        - '195.15.242.241/32'
        - '2001:1600:10:100::700/128'
      dhcp4: false
      auto6: false
      gateway4: '195.15.242.1'
      gateway6: 'fe80::f816:3eff:fea8:e6b4'
      auto_gateway: true
      dns:
        - '1.1.1.1'
        - '1.0.0.1'
    state: 'up'
  • Meistens muss auch die Provider-Firewall angepasst werden, um IPv6-Traffic zu erlauben. Z.B. bei Infomaniak:

infomaniak_vm__security_group_rules:
  # ipv6
  - direction: 'ingress'
    protocol: 'tcp'
    port_range_min: 80
    port_range_max: 80
    ethertype: 'IPv6'
  - direction: 'ingress'
    protocol: 'tcp'
    port_range_min: 443
    port_range_max: 443
    ethertype: 'IPv6'

Was jetzt noch fehlt, ist entweder irgendein NAT (was mit IPv6 eigentlich nicht empfohlen ist), oder alle VMs dahinter muessen auch eine IPv6-Adresse bekommen. (tbd)

eventuell hilfreich: https://www.internetsociety.org/deploy360/ipv6/security/ oder https://oglimmer.medium.com/hosting-a-website-at-home-behind-a-fritzbox-with-ipv6-enabled-9aa725cebb76

Built on 2023-01-27