IPv6 einrichten: Dual-Stack Setup für Linux-Server
IPv6 auf dem Linux-Server konfigurieren: Dual-Stack-Betrieb, Subnetting, ip6tables-Firewall und Fallstricke beim Umstieg – der praktische Guide für Admins.
IPv6 ist längst keine Zukunftsmusik mehr – die Adressen im IPv4-Pool sind erschöpft, und immer mehr Provider, Cloud-Anbieter und Endnutzer setzen auf das neue Protokoll. Wer einen Linux-Server betreibt, kommt um eine saubere IPv6-Konfiguration nicht mehr herum. Dieser Guide zeigt Schritt für Schritt, wie du einen Dual-Stack-Betrieb einrichtest, Subnetze korrekt aufteilst, die ip6tables-Firewall absicherst und typische Fallstricke beim Umstieg vermeidest.
Warum Dual-Stack statt reinem IPv6?
Ein reiner IPv6-Betrieb klingt verlockend, ist aber in der Praxis selten umsetzbar. Viele Clients, APIs und externe Dienste kommunizieren nach wie vor ausschließlich über IPv4. Dual-Stack löst dieses Problem, indem beide Protokolle parallel auf demselben Interface laufen. Dein Server ist damit sowohl über seine IPv4- als auch über seine IPv6-Adresse erreichbar – ohne Tunneling, ohne NAT64 und ohne Kompatibilitätsprobleme.
Voraussetzungen prüfen
Bevor du loslegst, stelle sicher, dass dein Kernel IPv6 unterstützt und das Modul geladen ist:
# Prüfen, ob IPv6 im Kernel aktiviert ist
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
# Ausgabe 0 = aktiviert, 1 = deaktiviert
# Falls deaktiviert, temporär aktivieren
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=0
Für eine permanente Aktivierung trägst du die Werte in /etc/sysctl.conf ein:
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
Danach ein sudo sysctl -p, und der Kernel akzeptiert IPv6-Pakete auf allen Interfaces.
IPv6-Adresse statisch konfigurieren
Die meisten Hosting-Provider weisen dir ein /64-Subnetz zu – das ist der Standard für ein einzelnes Netzwerksegment. Die Konfiguration unterscheidet sich je nach Distribution.
Netplan (Ubuntu 20.04+)
# /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
eth0:
addresses:
- 203.0.113.10/24
- "2001:db8:1::10/64"
routes:
- to: default
via: 203.0.113.1
- to: "::/0"
via: "2001:db8:1::1"
nameservers:
addresses:
- 8.8.8.8
- "2001:4860:4860::8888"
sudo netplan apply
Klassisch mit ifupdown (Debian)
# /etc/network/interfaces
iface eth0 inet6 static
address 2001:db8:1::10
netmask 64
gateway 2001:db8:1::1
NetworkManager (RHEL/AlmaLinux)
sudo nmcli connection modify eth0 ipv6.addresses "2001:db8:1::10/64"
sudo nmcli connection modify eth0 ipv6.gateway "2001:db8:1::1"
sudo nmcli connection modify eth0 ipv6.method manual
sudo nmcli connection up eth0
Nach der Konfiguration überprüfst du die Zuweisung:
ip -6 addr show dev eth0
ping6 -c 4 2001:4860:4860::8888
IPv6-Subnetting richtig umsetzen
Dein Provider gibt dir ein /48- oder /56-Präfix? Dann kannst du daraus eigene /64-Subnetze bilden. Die Logik ist dabei einfacher als bei IPv4, weil du keine Subnetzmasken-Tabellen brauchst.
| Zugewiesenes Präfix | Verfügbare /64-Subnetze | Beispiel-Subnetz |
|---|---|---|
| /48 | 65.536 | 2001:db8:1:0001::/64 |
| /56 | 256 | 2001:db8:1:01::/64 |
| /64 | 1 | 2001:db8:1:0::/64 |
Für Container oder VMs auf demselben Host legst du einfach weitere Adressen aus deinem Subnetz auf das Interface:
sudo ip -6 addr add 2001:db8:1::20/64 dev eth0
sudo ip -6 addr add 2001:db8:1::30/64 dev eth0
Wichtig: Vergib pro Dienst oder Container eine eigene IPv6-Adresse. Das macht Firewall-Regeln granularer und das Monitoring übersichtlicher.
ip6tables-Firewall einrichten
Hier lauert einer der größten Fallstricke beim Umstieg: Deine bestehenden iptables-Regeln greifen nicht für IPv6-Traffic. Du brauchst ein separates Regelwerk mit ip6tables. Wer das vergisst, betreibt seinen Server mit einer weit offenen IPv6-Flanke.
Grundlegendes Regelwerk
#!/bin/bash
# /root/ip6tables-setup.sh
# Bestehende Regeln löschen
ip6tables -F
ip6tables -X
# Standardpolicies: Alles droppen
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT
# Loopback erlauben
ip6tables -A INPUT -i lo -j ACCEPT
# Bestehende Verbindungen erlauben
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# ICMPv6 ist essentiell – NICHT komplett blocken!
ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
# SSH (Port 22)
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
# HTTP und HTTPS
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
# Regeln speichern
ip6tables-save > /etc/iptables/rules.v6
chmod +x /root/ip6tables-setup.sh
sudo bash /root/ip6tables-setup.sh
Warum ICMPv6 niemals komplett blocken
Bei IPv4 war es üblich, ICMP großflächig zu sperren. Bei IPv6 ist das fatal. ICMPv6 übernimmt Aufgaben, die bei IPv4 noch ARP und andere Protokolle erledigten:
- Neighbor Discovery (ND) – das Äquivalent zu ARP
- Path MTU Discovery – verhindert Fragmentierungsprobleme
- Router Advertisements – für SLAAC (Stateless Address Autoconfiguration)
Blockierst du ICMPv6 komplett, verliert dein Server die Fähigkeit, sein Gateway zu finden, und die Konnektivität bricht zusammen.
Dienste für Dual-Stack konfigurieren
Nginx
Standardmäßig lauscht Nginx nur auf IPv4. Für Dual-Stack passt du die listen-Direktive an:
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com;
# ...
}
SSH
In der /etc/ssh/sshd_config stellst du sicher, dass SSH auf beiden Protokollen lauscht:
AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::
Nach der Änderung: sudo systemctl restart sshd
DNS-Einträge setzen
Vergiss nicht den AAAA-Record in deiner DNS-Zone:
example.com. IN A 203.0.113.10
example.com. IN AAAA 2001:db8:1::10
Ohne AAAA-Record erreichen IPv6-Clients deinen Server schlicht nicht über den Hostnamen.
Typische Fallstricke und Troubleshooting
Problem: IPv6-Konnektivität funktioniert lokal, aber nicht von außen.
Prüfe, ob dein Provider das IPv6-Routing korrekt eingerichtet hat. Manche Hoster erfordern eine explizite Aktivierung im Kundenportal.
Problem: Dienste antworten nicht auf IPv6.
Kontrolliere mit ss -6 -tlnp, ob der Dienst tatsächlich auf [::] lauscht. Viele Anwendungen binden sich standardmäßig nur an 0.0.0.0.
Problem: Verbindungsabbrüche bei großen Paketen.
Fast immer ein Zeichen für blockiertes ICMPv6 (Path MTU Discovery). Überprüfe deine ip6tables-Regeln.
# Schnelldiagnose
ip -6 route show default
ip -6 neigh show
curl -6 -v https://ipv6.google.com
traceroute6 example.com
Problem: Privacy Extensions erzeugen zufällige Quelladressen.
Auf Servern solltest du Privacy Extensions deaktivieren, damit ausgehende Verbindungen immer die statische Adresse verwenden:
# /etc/sysctl.conf
net.ipv6.conf.eth0.use_tempaddr = 0
Fazit
Ein sauberes Dual-Stack Setup auf dem Linux-Server ist kein Hexenwerk – erfordert aber Aufmerksamkeit an Stellen, die bei IPv4 nie ein Thema waren. Die wichtigsten Punkte zusammengefasst: IPv6 parallel zu IPv4 aktivieren, statische Adressen sauber konfigurieren, ip6tables als eigenständiges Firewall-Regelwerk pflegen und ICMPv6 niemals komplett blockieren. Wer zusätzlich seine Dienste explizit auf Dual-Stack konfiguriert und die passenden DNS-Einträge setzt, betreibt einen zukunftssicheren Server, der für beide Protokollwelten bereit ist. Der Aufwand lohnt sich: Immer mehr Traffic läuft über IPv6, und wer jetzt sauber umstellt, spart sich später hektisches Nachbessern unter Zeitdruck.