IPv6 mit Rocky: Unterschied zwischen den Versionen
| Zeile 1: | Zeile 1: | ||
| − | =Workshop: Rocky Linux mit IPv6 - Webserver www.labXX.linuggs.de= | + | ==Workshop: Rocky Linux mit IPv6 - Webserver www.labXX.linuggs.de== |
==Ziel== | ==Ziel== | ||
Version vom 6. Oktober 2026, 15:32 Uhr
Workshop: Rocky Linux mit IPv6 - Webserver www.labXX.linuggs.de
Ziel
- Der Rocky-Linux-Host www.labXX.linuggs.de ersetzt den bisherigen Debian-Webserver
- Er hat bereits IPv4 und bekommt zusaetzlich eine statische IPv6-Adresse (Dual-Stack)
- Apache liefert per TLS eine Testseite aus, die anzeigt, ob der Besucher per IPv6 oder IPv4 kommt
- firewalld und SELinux bleiben aktiv
- Auf dem Client werden die Privacy Extensions eingeschaltet
- Alle Befehle werden als root ausgefuehrt
Adressen
| Parameter | Wert |
|---|---|
| Hostname | www.labXX.linuggs.de |
| IPv6-Adresse | 2a02:24d8:71:30XX+3::2/64 |
| Gateway | 2a02:24d8:71:30XX+3::1 |
| Nameserver | 2001:4860:4860::8888 |
| Zertifikat | /etc/ssl/own.crt |
| Schluessel | /etc/ssl/own.key |
Netzwerkverbindung ermitteln
- Zeigt alle Verbindungsprofile von NetworkManager mit Namen und Geraet
- nmcli connection show
- Zeigt alle Netzwerkgeraete und ihren Status
- nmcli device status
In den folgenden Beispielen heisst die Verbindung enp0s3. Den Namen an die eigene Ausgabe anpassen.
IPv6 mit nmcli konfigurieren
- Setzt Adresse, Gateway und Nameserver fuer IPv6
- nmcli connection modify enp0s3 ipv6.method manual ipv6.addresses 2a02:24d8:71:30XX+3::2/64 ipv6.gateway 2a02:24d8:71:30XX+3::1 ipv6.dns 2001:4860:4860::8888
- Aktiviert das Profil neu, damit die Aenderungen wirksam werden
- nmcli connection up enp0s3
| Option | Bedeutung |
|---|---|
| connection modify enp0s3 | Aendert das Verbindungsprofil enp0s3 |
| ipv6.method manual | Adresse wird statisch gesetzt (nicht per Router Advertisement) |
| ipv6.addresses | IPv6-Adresse mit Praefixlaenge |
| ipv6.gateway | Default-Gateway fuer IPv6 |
| ipv6.dns | Nameserver, wird in /etc/resolv.conf eingetragen |
| connection up enp0s3 | Aktiviert das Profil mit den neuen Werten |
Die IPv4-Konfiguration bleibt unveraendert.
Kontrolle mit ip
- Zeigt alle IPv6-Adressen des Interfaces
- ip -6 addr show dev enp0s3
Erwartet werden zwei Adressen:
| Adresse | scope | Bedeutung |
|---|---|---|
| 2a02:24d8:71:30XX+3::2/64 | global | Die gesetzte Adresse, im Internet routbar |
| fe80::.../64 | link | Link-Local-Adresse, entsteht automatisch, nur im lokalen Segment gueltig |
- Zeigt die IPv6-Routingtabelle, die Default-Route muss ueber das Gateway zeigen
- ip -6 route show
- Testet das Gateway
- ping -6 -c 3 2a02:24d8:71:30XX+3::1
- Zeigt den Neighbor-Cache (NDP, Gegenstueck zu ARP bei IPv4); das Gateway steht mit seiner MAC-Adresse (lladdr) darin
- ip -6 neigh show dev enp0s3
- Testet die Verbindung ins Internet
- ping -6 -c 3 2001:4860:4860::8888
- Zeigt den eingetragenen Nameserver
- cat /etc/resolv.conf
| Option | Bedeutung |
|---|---|
| -6 | Nur IPv6 |
| dev enp0s3 | Ausgabe auf dieses Interface beschraenken |
| -c 3 | Nur 3 Pakete senden |
Apache mit TLS installieren
- Installiert den Webserver und das TLS-Modul
- dnf install -y httpd mod_ssl
- -y beantwortet die Rueckfrage automatisch mit ja
Zertifikate und SELinux
Die Zertifikate own.crt und own.key liegen in /etc/ssl des alten Debian-Hosts.
- Kopiert die Zertifikate vom alten Host nach /root
- scp root@ALTER-HOST:/etc/ssl/own.* /root/
- Verschiebt die Dateien nach /etc/ssl
- mv /root/own.crt /root/own.key /etc/ssl/
- Zeigt den SELinux-Kontext der Dateien
- ls -Z /etc/ssl/own.*
Die Dateien haben den Kontext admin_home_t. mv behaelt den Kontext des Ursprungsorts bei. Apache darf diese Dateien nicht lesen und wuerde nicht starten.
- Setzt den Kontext auf den Standardwert fuer /etc/ssl
- restorecon -v /etc/ssl/own.*
- Kontrolle, jetzt muss cert_t angezeigt werden
- ls -Z /etc/ssl/own.*
- Nur root darf den Schluessel lesen
- chmod 600 /etc/ssl/own.key
| Option | Bedeutung |
|---|---|
| ls -Z | Zeigt zusaetzlich den SELinux-Kontext |
| restorecon -v | Setzt den Kontext laut Policy zurueck, -v zeigt jede Aenderung an |
| chmod 600 | Lesen und Schreiben nur fuer den Besitzer |
VirtualHost anlegen
- vim /etc/httpd/conf.d/www.labXX.linuggs.de.conf
<VirtualHost *:80>
ServerName www.labXX.linuggs.de
Redirect permanent / https://www.labXX.linuggs.de/
</VirtualHost>
<VirtualHost *:443>
ServerName www.labXX.linuggs.de
DocumentRoot /var/www/html
DirectoryIndex index.shtml
SSLEngine on
SSLCertificateFile /etc/ssl/own.crt
SSLCertificateKeyFile /etc/ssl/own.key
<Directory /var/www/html>
Options +Includes
AddOutputFilter INCLUDES .shtml
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
| Direktive | Bedeutung |
|---|---|
| VirtualHost *:80 | Gilt fuer Port 80 auf allen Adressen, IPv4 und IPv6 |
| ServerName | Name, auf den dieser VirtualHost antwortet |
| Redirect permanent | Leitet HTTP dauerhaft (301) auf HTTPS um |
| VirtualHost *:443 | Gilt fuer Port 443 auf allen Adressen, IPv4 und IPv6 |
| DocumentRoot | Verzeichnis mit den Webseiten |
| DirectoryIndex | Datei, die beim Aufruf von / ausgeliefert wird |
| SSLEngine on | Schaltet TLS fuer diesen VirtualHost ein |
| SSLCertificateFile | Zertifikat (own.crt enthaelt die komplette Kette) |
| SSLCertificateKeyFile | Privater Schluessel |
| Options +Includes | Erlaubt Server Side Includes (SSI) in diesem Verzeichnis |
| AddOutputFilter INCLUDES .shtml | Dateien mit Endung .shtml werden von SSI verarbeitet |
| SSLOptions +StdEnvVars | Stellt TLS-Variablen wie SSL_PROTOCOL fuer die Seite bereit |
Testseite
Die Seite zeigt die Adresse des Besuchers und ob er per IPv6 oder IPv4 kommt. Eine IPv6-Adresse wird am Doppelpunkt erkannt.
- vim /var/www/html/index.shtml
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>www.labXX.linuggs.de</title>
<style>
body { margin: 0; min-height: 100vh; display: flex; align-items: center; justify-content: center;
background: #0f172a; color: #e2e8f0; font-family: sans-serif; }
.card { background: #1e293b; padding: 40px 50px; border-radius: 16px; text-align: center;
box-shadow: 0 10px 40px rgba(0,0,0,0.5); max-width: 640px; }
h1 { margin: 0 0 20px 0; font-size: 1.6em; color: #94a3b8; }
.badge { display: inline-block; font-size: 4em; font-weight: bold; padding: 10px 40px;
border-radius: 12px; margin-bottom: 20px; }
.v6 { background: #16a34a; color: #fff; }
.v4 { background: #ea580c; color: #fff; }
table { margin: 20px auto 0 auto; border-collapse: collapse; text-align: left; }
td { padding: 6px 12px; border-bottom: 1px solid #334155; }
td.k { color: #94a3b8; }
td.v { font-family: monospace; font-size: 1.1em; }
</style>
</head>
<body>
<div class="card">
<h1>www.labXX.linuggs.de</h1>
<!--#if expr="%{REMOTE_ADDR} =~ /:/" -->
<div class="badge v6">IPv6</div>
<p>Sie sind per IPv6 verbunden.</p>
<!--#else -->
<div class="badge v4">IPv4</div>
<p>Sie sind per IPv4 verbunden.</p>
<!--#endif -->
<table>
<tr><td class="k">Ihre Adresse</td><td class="v"><!--#echo var="REMOTE_ADDR" --></td></tr>
<tr><td class="k">Server-Adresse</td><td class="v"><!--#echo var="SERVER_ADDR" --></td></tr>
<tr><td class="k">TLS-Version</td><td class="v"><!--#echo var="SSL_PROTOCOL" --></td></tr>
<tr><td class="k">Cipher</td><td class="v"><!--#echo var="SSL_CIPHER" --></td></tr>
</table>
</div>
</body>
</html>
| SSI-Element | Bedeutung |
|---|---|
| #if expr="%{REMOTE_ADDR} =~ /:/" | Bedingung: Adresse des Besuchers enthaelt einen Doppelpunkt, also IPv6 |
| #else / #endif | Alternative fuer IPv4 und Ende der Bedingung |
| #echo var="REMOTE_ADDR" | Adresse des Besuchers |
| #echo var="SERVER_ADDR" | Adresse des Servers, auf der die Anfrage angekommen ist |
| #echo var="SSL_PROTOCOL" | Ausgehandelte TLS-Version |
| #echo var="SSL_CIPHER" | Ausgehandelter Cipher |
Apache pruefen und starten
- Prueft die Konfiguration auf Syntaxfehler
- apachectl configtest
- Startet Apache und aktiviert ihn beim Booten
- systemctl enable --now httpd
- Zeigt den Status
- systemctl status httpd
Kontrolle mit ss
- Zeigt alle lauschenden TCP-Ports mit Prozess
- ss -tlnp | grep httpd
Apache lauscht auf *:80 und *:443. Der Stern bedeutet: alle Adressen, IPv4 und IPv6.
| Option | Bedeutung |
|---|---|
| -t | Nur TCP |
| -l | Nur lauschende Sockets |
| -n | Adressen und Ports numerisch anzeigen |
| -p | Prozess anzeigen, der den Socket benutzt |
firewalld
- Zeigt die aktive Zone und ihre Freigaben
- firewall-cmd --list-all
- Gibt HTTP und HTTPS dauerhaft frei
- firewall-cmd --permanent --add-service=http --add-service=https
- Laedt die dauerhafte Konfiguration
- firewall-cmd --reload
- Kontrolle
- firewall-cmd --list-services
Die Freigaben gelten automatisch fuer IPv4 und IPv6.
| Option | Bedeutung |
|---|---|
| --list-all | Zeigt alle Einstellungen der Standardzone |
| --permanent | Aenderung wird dauerhaft gespeichert, wirkt aber erst nach --reload |
| --add-service | Gibt einen vordefinierten Dienst frei |
| --reload | Uebernimmt die dauerhafte Konfiguration |
| --list-services | Zeigt die freigegebenen Dienste |
SELinux kontrollieren
- Muss Enforcing anzeigen
- getenforce
- Apache laeuft in der Domaene httpd_t
- ps -eZ | grep httpd
- Die Testseite hat den Kontext httpd_sys_content_t
- ls -Z /var/www/html/
| Option | Bedeutung |
|---|---|
| ps -e | Alle Prozesse |
| ps -Z | Zeigt den SELinux-Kontext der Prozesse |
Tests
- Installiert dig
- dnf install -y bind-utils
- Prueft den AAAA-Record des Webservers
- dig +short AAAA www.labXX.linuggs.de
- Verbindung per IPv6, zeigt Verbindungsaufbau und Zertifikatspruefung
- curl -6 -sv -o /dev/null https://www.labXX.linuggs.de
In der Ausgabe stehen die IPv6-Adresse nach Connected to und SSL certificate verify ok.
- Zeigt nur die HTTP-Header
- curl -6 -I https://www.labXX.linuggs.de
- Prueft die Umleitung von HTTP auf HTTPS
- curl -6 -I http://www.labXX.linuggs.de
- Gleicher Test per IPv4 zum Vergleich
- curl -4 -I https://www.labXX.linuggs.de
- Zeigt TLS-Version, Cipher und Zertifikat
- openssl s_client -6 -brief -connect www.labXX.linuggs.de:443 < /dev/null
- Zeigt die Zugriffe live, IPv6-Clients erscheinen mit ihrer IPv6-Adresse
- tail -f /var/log/httpd/access_log
| Option | Bedeutung |
|---|---|
| dig +short | Nur das Ergebnis ausgeben |
| AAAA | Abfrage des IPv6-Records |
| curl -6 / -4 | Nur IPv6 bzw. nur IPv4 verwenden |
| curl -s | Fortschrittsanzeige unterdruecken |
| curl -v | Verbindungsaufbau und TLS-Handshake anzeigen |
| curl -o /dev/null | Inhalt der Seite verwerfen |
| curl -I | Nur die HTTP-Header abrufen |
| s_client -6 | TLS-Testclient, nur IPv6 |
| -brief | Kurze Ausgabe |
| -connect host:port | Ziel der Verbindung |
| < /dev/null | Beendet die Verbindung sofort nach dem Handshake |
| tail -f | Neue Zeilen fortlaufend anzeigen |
Abschliessend die Seite im Browser oeffnen: https://www.labXX.linuggs.de
Privacy Extensions auf dem Client
Voraussetzung: Der Client bezieht seine IPv6-Adresse per SLAAC (ipv6.method auto).
Ohne Privacy Extensions benutzt der Client fuer alle Verbindungen dieselbe Adresse. Webserver koennen ihn darueber wiedererkennen. Mit Privacy Extensions erzeugt der Client zusaetzlich temporaere Adressen, die regelmaessig wechseln, und benutzt diese fuer ausgehende Verbindungen.
- Zeigt, wie die stabile Adresse gebildet wird
- nmcli -g ipv6.addr-gen-mode connection show enp0s3
| Wert | Bedeutung |
|---|---|
| stable-privacy | Standard. Interface-ID wird aus einem Hash gebildet, enthaelt keine MAC-Adresse, bleibt im selben Netz gleich |
| eui64 | Interface-ID wird aus der MAC-Adresse gebildet, Geraet ist ueber alle Netze hinweg erkennbar |
- Schaltet die Privacy Extensions ein und bevorzugt die temporaeren Adressen
- nmcli connection modify enp0s3 ipv6.ip6-privacy 2
- Aktiviert das Profil neu
- nmcli connection up enp0s3
| Wert ipv6.ip6-privacy | Bedeutung |
|---|---|
| 0 | Keine temporaeren Adressen |
| 1 | Temporaere Adressen werden erzeugt, ausgehend wird die stabile Adresse benutzt |
| 2 | Temporaere Adressen werden erzeugt und ausgehend bevorzugt |
- Zeigt die Adressen des Clients
- ip -6 addr show dev enp0s3
| Kennzeichnung | Bedeutung |
|---|---|
| temporary dynamic | Temporaere Adresse, wird fuer ausgehende Verbindungen benutzt |
| mngtmpaddr | Stabile Adresse, aus deren Praefix die temporaeren Adressen erzeugt werden |
| valid_lft / preferred_lft | Restliche Gueltigkeit, danach wird eine neue temporaere Adresse erzeugt |
- Kontrolle im Kernel, muss 2 anzeigen
- sysctl net.ipv6.conf.enp0s3.use_tempaddr
- Test
- Im Browser des Clients https://www.labXX.linuggs.de aufrufen
- Die Testseite zeigt als "Ihre Adresse" die temporaere Adresse, nicht die mngtmpaddr-Adresse
- Im access_log auf dem Webserver erscheint ebenfalls die temporaere Adresse