IPv6 mit Rocky: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
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==
Zeile 8: Zeile 8:
 
*Auf dem Client werden die Privacy Extensions eingeschaltet
 
*Auf dem Client werden die Privacy Extensions eingeschaltet
 
*Alle Befehle werden als root ausgefuehrt
 
*Alle Befehle werden als root ausgefuehrt
−
 
−
==Zertifkate besorgen==
 
−
*get-cert.sh
 
  
 
==Adressen==
 
==Adressen==
Zeile 96: Zeile 93:
 
*dnf install -y httpd mod_ssl
 
*dnf install -y httpd mod_ssl
 
;-y beantwortet die Rueckfrage automatisch mit ja
 
;-y beantwortet die Rueckfrage automatisch mit ja
 +
;Entfernt die Rocky-Testseite. Sie ersetzt jeden 403-Fehler auf / durch eine Begruessungsseite und verdeckt damit Fehler, z.B. wenn SELinux den Zugriff auf die Startseite verweigert
 +
*rm /etc/httpd/conf.d/welcome.conf
 +
;Ersetzt die mitgelieferte ssl.conf durch das Noetigste. Ihr Standard-VirtualHost verweist auf /etc/pki/tls/certs/localhost.crt, das erst beim ersten Start von httpd erzeugt wird - apachectl configtest wuerde vorher abbrechen
 +
*echo "Listen 443 https" > /etc/httpd/conf.d/ssl.conf
  
 
==Zertifikate und SELinux==
 
==Zertifikate und SELinux==
−
Die Zertifikate own.crt und own.key liegen in /etc/ssl des alten Debian-Hosts.
+
;Zertifikate besorgen, legt own.crt und own.key in /etc/ssl ab
−
 
+
*get-cert.sh
−
;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
 
;Zeigt den SELinux-Kontext der Dateien
 
*ls -Z /etc/ssl/own.*
 
*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.
+
Die Dateien haben den Kontext '''cert_t'''. Neue Dateien in /etc/ssl bekommen automatisch den Kontext, den die Policy fuer dieses Verzeichnis vorsieht. Apache darf sie damit lesen.
  
−
;Setzt den Kontext auf den Standardwert fuer /etc/ssl
+
;Setzt den Kontext auf den Standardwert fuer /etc/ssl, falls eine Datei mit falschem Kontext dort gelandet ist (z.B. per mv aus /root)
 
*restorecon -v /etc/ssl/own.*
 
*restorecon -v /etc/ssl/own.*
−
;Kontrolle, jetzt muss cert_t angezeigt werden
 
−
*ls -Z /etc/ssl/own.*
 
 
;Nur root darf den Schluessel lesen
 
;Nur root darf den Schluessel lesen
 
*chmod 600 /etc/ssl/own.key
 
*chmod 600 /etc/ssl/own.key
Zeile 369: Zeile 364:
 
|-
 
|-
 
| eui64 || Interface-ID wird aus der MAC-Adresse gebildet, Geraet ist ueber alle Netze hinweg erkennbar
 
| eui64 || Interface-ID wird aus der MAC-Adresse gebildet, Geraet ist ueber alle Netze hinweg erkennbar
 +
|-
 +
| default || Profil uebernimmt den globalen Standard von NetworkManager (stable-privacy)
 +
|-
 +
| default-or-eui64 || Globaler Standard, falls gesetzt, sonst eui64
 
|}
 
|}
  

Aktuelle Version vom 6. Oktober 2026, 17:21 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
Entfernt die Rocky-Testseite. Sie ersetzt jeden 403-Fehler auf / durch eine Begruessungsseite und verdeckt damit Fehler, z.B. wenn SELinux den Zugriff auf die Startseite verweigert
  • rm /etc/httpd/conf.d/welcome.conf
Ersetzt die mitgelieferte ssl.conf durch das Noetigste. Ihr Standard-VirtualHost verweist auf /etc/pki/tls/certs/localhost.crt, das erst beim ersten Start von httpd erzeugt wird - apachectl configtest wuerde vorher abbrechen
  • echo "Listen 443 https" > /etc/httpd/conf.d/ssl.conf

Zertifikate und SELinux

Zertifikate besorgen, legt own.crt und own.key in /etc/ssl ab
  • get-cert.sh
Zeigt den SELinux-Kontext der Dateien
  • ls -Z /etc/ssl/own.*

Die Dateien haben den Kontext cert_t. Neue Dateien in /etc/ssl bekommen automatisch den Kontext, den die Policy fuer dieses Verzeichnis vorsieht. Apache darf sie damit lesen.

Setzt den Kontext auf den Standardwert fuer /etc/ssl, falls eine Datei mit falschem Kontext dort gelandet ist (z.B. per mv aus /root)
  • restorecon -v /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

In der Ausgabe stehen die IPv6-Adresse nach Connected to und SSL certificate verify ok.

Zeigt nur die HTTP-Header
Prueft die Umleitung von HTTP auf HTTPS
Gleicher Test per IPv4 zum Vergleich
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
default Profil uebernimmt den globalen Standard von NetworkManager (stable-privacy)
default-or-eui64 Globaler Standard, falls gesetzt, sonst eui64
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