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
| Merkmal | IPv4 | IPv6 | |---------|------|------| | Adresslänge | 32 Bit | 128 Bit | | Notation | Dezimal (192.168.1.1) | Hexadezimal (2001:db8::1) | | Adressen | ~4,3 Milliarden | ~340 Sextillionen | | NAT | Üblich | Nicht nötig | | Checksumme | Im Header | Keine | | Broadcast | Ja | Nein (Multicast) | | IPsec | Optional | Integriert |
Adressformat
IPv4: 192.168.1.100
└─┬─┘ └─┬─┘
Netz Host
IPv6: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
└────┬────┘ └────┬────┘ └────────┬────────┘
Präfix Subnetz Interface IDIPv6-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
| Typ | Präfix | Verwendung | |-----|--------|------------| | Global Unicast | 2000::/3 | Öffentliche Adressen | | Link-Local | fe80::/10 | Lokale Kommunikation | | Unique Local | fc00::/7 | Private Netzwerke | | Loopback | ::1/128 | Localhost |
Beispiele
# Global Unicast (öffentlich)
2001:db8:1234:5678::1
# Link-Local (automatisch)
fe80::1
# Unique Local (privat)
fd00:1234:5678::1
# Loopback
::1IPv6 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_ipv6Statische 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::8888netplan applyInterfaces-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::1CentOS/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::1Dual-Stack
Konzept
Dual-Stack = IPv4 + IPv6 gleichzeitig
Server lauscht auf beiden Protokollen
Clients verbinden über bevorzugtes ProtokollWebserver 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::10DNS-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::20Reverse 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 443iptables/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 ACCEPTnftables (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
| Typ | Name | Funktion | |-----|------|----------| | 128 | Echo Request | Ping | | 129 | Echo Reply | Ping-Antwort | | 133 | Router Solicitation | Router suchen | | 134 | Router Advertisement | Router ankündigen | | 135 | Neighbor Solicitation | Nachbarn suchen | | 136 | Neighbor Advertisement | Nachbar 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 ACCEPTTroubleshooting
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 -tnpHä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.confIPv6 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 = 0sysctl -pServer-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 md5Nginx
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 einrichtenTesten
# 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
| Merkmal | IPv4 | IPv6 | |---------|------|------| | Format | 192.168.1.1 | 2001:db8::1 | | Bits | 32 | 128 | | Private | 192.168.x.x | fd00::/8 | | Loopback | 127.0.0.1 | ::1 | | Broadcast | Ja | Nein |
| Konfiguration | IPv4 | IPv6 | |---------------|------|------| | Netplan | addresses: - 192.168.1.1/24 | addresses: - 2001:db8::1/64 | | Firewall | iptables | ip6tables | | Ping | ping | ping6 | | DNS | A Record | AAAA Record |
| Dienst | IPv6-Listen | |--------|-------------| | Nginx | listen [::]:80; | | Apache | Listen [::]:80 | | SSH | ListenAddress :: | | MySQL | bind-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.