IPv4 und IPv6 sind die beiden Internet-Protokolle für die Adressierung von Geräten. IPv6 löst das Adressknappheitsproblem von IPv4 und bringt zusätzliche Verbesserungen.

Grundlegende Unterschiede

Übersicht

MerkmalIPv4IPv6
Adresslänge32 Bit128 Bit
NotationDezimal (192.168.1.1)Hexadezimal (2001:db8::1)
Adressen~4,3 Milliarden~340 Sextillionen
NATÜblichNicht nötig
ChecksummeIm HeaderKeine
BroadcastJaNein (Multicast)
IPsecOptionalIntegriert

Adressformat

IPv4: 192.168.1.100
       └─┬─┘ └─┬─┘
       Netz   Host

IPv6: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
      └────┬────┘ └────┬────┘ └────────┬────────┘
       Präfix      Subnetz     Interface ID

IPv6-Kurzschreibweise

Volle Adresse:    2001:0db8:0000:0000:0000:0000:0000:0001
Führende Nullen:  2001:db8:0:0:0:0:0:1
Doppel-Kolon:     2001:db8::1

Regeln:
- Führende Nullen pro Block weglassen
- Zusammenhängende 0-Blöcke durch :: ersetzen (nur einmal)

IPv6-Adresstypen

Unicast-Adressen

TypPräfixVerwendung
Global Unicast2000::/3Öffentliche Adressen
Link-Localfe80::/10Lokale Kommunikation
Unique Localfc00::/7Private Netzwerke
Loopback::1/128Localhost

Beispiele

# Global Unicast (öffentlich)
2001:db8:1234:5678::1

# Link-Local (automatisch)
fe80::1

# Unique Local (privat)
fd00:1234:5678::1

# Loopback
::1

IPv6 auf Linux konfigurieren

Status prüfen

# IPv6-Adressen anzeigen
ip -6 addr show

# IPv6-Routing
ip -6 route show

# Kernel-Modul
sysctl net.ipv6.conf.all.disable_ipv6

Statische IPv6-Adresse

# Temporär
ip -6 addr add 2001:db8::1/64 dev eth0
ip -6 route add default via 2001:db8::ffff

# Permanent (Debian/Ubuntu mit Netplan)

Netplan-Konfiguration

# /etc/netplan/01-netcfg.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses:
        - 192.168.1.10/24
        - 2001:db8::10/64
      routes:
        - to: default
          via: 192.168.1.1
        - to: default
          via: 2001:db8::1
      nameservers:
        addresses:
          - 8.8.8.8
          - 2001:4860:4860::8888
netplan apply

Interfaces-Datei (Debian)

# /etc/network/interfaces

auto eth0
iface eth0 inet static
    address 192.168.1.10
    netmask 255.255.255.0
    gateway 192.168.1.1

iface eth0 inet6 static
    address 2001:db8::10
    netmask 64
    gateway 2001:db8::1

CentOS/RHEL

# /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes

# IPv4
IPADDR=192.168.1.10
PREFIX=24
GATEWAY=192.168.1.1

# IPv6
IPV6INIT=yes
IPV6_AUTOCONF=no
IPV6ADDR=2001:db8::10/64
IPV6_DEFAULTGW=2001:db8::1

Dual-Stack

Konzept

Dual-Stack = IPv4 + IPv6 gleichzeitig

Server lauscht auf beiden Protokollen
Clients verbinden über bevorzugtes Protokoll

Webserver Dual-Stack

# Nginx
server {
    listen 80;
    listen [::]:80;

    listen 443 ssl;
    listen [::]:443 ssl;

    server_name example.com;
    # ...
}
# Apache
<VirtualHost *:80>
    ServerName example.com
</VirtualHost>

<VirtualHost [::]:80>
    ServerName example.com
</VirtualHost>

SSH auf beiden Protokollen

# /etc/ssh/sshd_config

ListenAddress 0.0.0.0
ListenAddress ::

# Oder spezifisch
ListenAddress 192.168.1.10
ListenAddress 2001:db8::10

DNS-Konfiguration

A und AAAA Records

; Zone file
example.com.    IN    A       192.168.1.10
example.com.    IN    AAAA    2001:db8::10

www             IN    A       192.168.1.10
www             IN    AAAA    2001:db8::10

mail            IN    A       192.168.1.20
mail            IN    AAAA    2001:db8::20

Reverse DNS

; IPv4 Reverse (in-addr.arpa)
10.1.168.192.in-addr.arpa.    IN    PTR    server.example.com.

; IPv6 Reverse (ip6.arpa)
0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.    IN    PTR    server.example.com.

Firewall

UFW

# IPv6 aktivieren in UFW
# /etc/default/ufw
IPV6=yes

# Regeln (gelten für beide)
ufw allow 22
ufw allow 80
ufw allow 443

iptables/ip6tables

# IPv4
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# IPv6 (separater Befehl!)
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT

nftables (kombiniert)

#!/usr/sbin/nft -f

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;

        # Loopback
        iif lo accept

        # Established
        ct state established,related accept

        # ICMPv6 (wichtig!)
        meta l4proto ipv6-icmp accept

        # SSH, HTTP, HTTPS
        tcp dport { 22, 80, 443 } accept
    }
}

ICMPv6

Wichtige Typen

TypNameFunktion
128Echo RequestPing
129Echo ReplyPing-Antwort
133Router SolicitationRouter suchen
134Router AdvertisementRouter ankündigen
135Neighbor SolicitationNachbarn suchen
136Neighbor AdvertisementNachbar ankündigen

Firewall-Regeln

# ICMPv6 NICHT komplett blocken!
# Mindestens diese Typen erlauben:

ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-reply -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT

Troubleshooting

Konnektivität testen

# Ping IPv6
ping6 2001:db8::1
ping -6 google.com

# Traceroute
traceroute6 google.com

# DNS-Auflösung
dig AAAA example.com
host -t AAAA example.com

# Verbindung testen
curl -6 https://ipv6.google.com
curl -6 http://[2001:db8::1]/

Probleme diagnostizieren

# IPv6-Routing prüfen
ip -6 route

# Neighbor Cache
ip -6 neigh show

# Listening Ports
ss -6 -tlnp

# Verbindungen
ss -6 -tnp

Häufige Probleme

# IPv6 deaktiviert?
sysctl net.ipv6.conf.all.disable_ipv6
# 0 = aktiv, 1 = deaktiviert

# Aktivieren
sysctl -w net.ipv6.conf.all.disable_ipv6=0
sysctl -w net.ipv6.conf.default.disable_ipv6=0

# Permanent
echo "net.ipv6.conf.all.disable_ipv6 = 0" >> /etc/sysctl.conf

IPv6 Privacy Extensions

Konzept

Standard IPv6: Interface ID basiert auf MAC-Adresse
Privacy Extensions: Zufällige, temporäre Adressen

Für Server meist deaktivieren (stabile Adresse gewünscht)

Deaktivieren

# /etc/sysctl.conf

net.ipv6.conf.all.use_tempaddr = 0
net.ipv6.conf.default.use_tempaddr = 0
sysctl -p

Server-Anwendungen

MySQL/MariaDB

# /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
bind-address = ::
-- Benutzer für IPv6
CREATE USER 'user'@'2001:db8::%' IDENTIFIED BY 'password';
GRANT ALL ON db.* TO 'user'@'2001:db8::%';

PostgreSQL

# /etc/postgresql/15/main/postgresql.conf
listen_addresses = '*'

# /etc/postgresql/15/main/pg_hba.conf
host    all    all    2001:db8::/32    md5

Nginx

server {
    listen [::]:80;
    listen [::]:443 ssl;

    # IPv6 only (kein Dual-Stack)
    # Oder mit ipv6only=on
    listen [::]:80 ipv6only=on;
}

Apache

Listen 80
Listen [::]:80

<VirtualHost *:80 [::]:80>
    ServerName example.com
</VirtualHost>

Migration zu IPv6

Schritt-für-Schritt

1. IPv6-Adresse vom Provider erhalten
2. DNS AAAA-Records hinzufügen
3. Firewall-Regeln anpassen
4. Dienste für IPv6 konfigurieren
5. Testen mit IPv6-only Clients
6. Monitoring einrichten

Testen

# IPv6-Test-Websites
curl -6 https://ipv6-test.com/api/myip.php
curl -6 https://test-ipv6.com/

# Von außen prüfen
# https://ipv6-test.com/
# https://ready.chair6.net/

Zusammenfassung

MerkmalIPv4IPv6
Format192.168.1.12001:db8::1
Bits32128
Private192.168.x.xfd00::/8
Loopback127.0.0.1::1
BroadcastJaNein
KonfigurationIPv4IPv6
Netplanaddresses: - 192.168.1.1/24addresses: - 2001:db8::1/64
Firewalliptablesip6tables
Pingpingping6
DNSA RecordAAAA Record
DienstIPv6-Listen
Nginxlisten [::]:80;
ApacheListen [::]:80
SSHListenAddress ::
MySQLbind-address = ::

Fazit

IPv6 ist die Zukunft des Internets und sollte auf jedem Server aktiviert sein. Dual-Stack ermöglicht Kompatibilität mit beiden Protokollen. Die Konfiguration ist etwas komplexer als bei IPv4, aber gut dokumentiert. ICMPv6 darf nicht komplett geblockt werden, da es für grundlegende Netzwerkfunktionen erforderlich ist. Privacy Extensions sollten auf Servern deaktiviert werden.