Diese leicht verständliche Anleitung beschreibt, wie man eine Website auf der Hetzner Cloud mit Debian oder Ubuntu Linux unter Verwendung einer IPv6-Adresse hostet. Sie enthält Beispiele für sowohl den nginx- als auch den apache2-Webserver. Außerdem wird erklärt, wie man DNS-Einträge erstellt und wie man ein SSL-Zertifikat mit Let's Encrypt generiert.
Dieser Blogpost wurde von einer Maschine aus dem Englischen übersetzt. Die Originalversion finden Sie hier: Using an IPv6 Address or Subnet with a Hetzner Cloud Servers to Host a Website
Bitte kontaktieren Sie uns , wenn etwas nicht klar beschrieben ist, nicht funktioniert, inkorrekt erscheint oder wenn Sie Unterstützung benötigen.
Bevor Sie mit IPv6 beginnen, sollten Sie überprüfen, ob Ihr Internet-Dienstanbieter (ISP) IPv6 unterstützt. Sie können dies ganz einfach tun, indem Sie ipv6.google.com aufrufen. Dies ist die Google-Suchseite, aber über IPv6 statt IPv4. Wenn dies bei Ihnen funktioniert, können Sie den Artikel weiterlesen. Falls nicht, beschweren Sie sich bei Ihrem ISP über die Einrichtung von IPv6 oder beginnen Sie, ein VPN wie mullvad.net zu verwenden, das Ihnen den Zugriff auf IPv6 ermöglicht.
Zum Zeitpunkt dieses Artikels (April 2024) unterstützt etwa die Hälfte des Internets IPv6 , wobei Frankreich und Deutschland die beste Abdeckung mit etwa 75% haben, die USA haben nur etwa 45% .
Für das Hosting öffentlicher Websites sind dies keine besonders glänzenden Zahlen, aber für das Hosting von Websites hinter Content Delivery Networks (CDN) wie cloudflare ist dies irrelevant, da Cloudflare IPv6 unterstützt und auf Ihren Backend-Webserver über seine IPv6-Adresse zugreifen kann.
Bei Blunix weisen wir auch gerne ausschließlich IPv6-Adressen Servern zu, die nicht öffentlich zugänglich sein sollen, sondern nur über ein internes Firmen-VPN. Für diese firmenintern genutzten Server verwenden wir eine (kostenlose) IPv6-Adresse für administrative Zwecke, wobei alle WebUIs und andere Dienste nur über das firmeninterne VPN zugänglich sind.
Erstellen Sie einen neuen Server und stellen Sie sicher, dass IPv6 aktiviert ist. Sie können wählen, nur eine IPv6-Adresse für Ihren Server zu verwenden, um etwas Geld zu sparen. Für diesen Blog-Beitrag haben wir uns entschieden, dem Server keine IPv4-Adresse zuzuweisen. So gut wie alle modernen Computer und Mobilgeräte verstehen inzwischen IPv6, sodass Sie eigentlich keine IPv4-Adresse mehr benötigen.
Nach der Erstellung des Cloud- oder physischen Servers zeigt Ihnen die Hetzner Cloud WebUI das IPv6-Subnetz an, das dem Server zugewiesen wurde. Zum Zeitpunkt dieses Artikels wird jedem Server ein /64-Subnetz zugewiesen. Fun Fact: Ein /64-IPv6-Subnetz enthält 18,45 Trillionen, oder 18.446.744.073.709.551.616, oder 18,45 * 10^18 nutzbare IPv6-Adressen. Das sollte ausreichen, um ein paar Websites zu hosten. Weitere Informationen finden Sie in der RIPE-Net-Dokumentation zum Verständnis von IP-Adressierung und CIDR-Charts .
Wenn Ihr Subnetz 2a01:4f8:1c1c:dd6::/64 ist, können Sie sich über SSH mit dem Hetzner Cloud Server verbinden, indem Sie am Ende eine 1 hinzufügen:
ssh root@2a01:4f8:1c1c:dd6::1
The authenticity of host '2a01:4f8:1c1c:dd6::1 (2a01:4f8:1c1c:dd6::1)' can't be established.
ED25519 key fingerprint is SHA256:WBp/Jd5omTEuFOKI6tRfV5AwtBd9y+iS0de1cRr88B8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '2a01:4f8:1c1c:dd6::1' (ED25519) to the list of known hosts.
Linux ipv6-blogpost 6.1.0-18-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@ipv6-blogpost:~#
Lassen Sie uns die Netzwerkschnittstelle so konfigurieren, dass sie auf mehr als einer IPv6-Adresse erreichbar ist.
Um schnell eine neue IPv6-Adresse zu Ihrem Server hinzuzufügen, verwenden Sie den folgenden Befehl:
ip address add 2a01:4f8:1c1c:dd6::3 dev eth0
Um zu überprüfen, ob dies funktioniert, führen Sie den folgenden Befehl von Ihrer Workstation aus:
ping6 2a01:4f8:1c1c:dd6::3
Sie können jede Adresse zwischen dem Minimal- und Maximalwert im zugewiesenen Subnetz wählen. Denken Sie daran, dass IPv6-Adressen in hexadezimalen Werten geschrieben werden: “0-9” und “a-f”.
Niedrigste mögliche Adresse: 2a01:4f8:1c1c:dd6:0000:0000:0000:0000
Höchste mögliche Adresse: 2a01:4f8:1c1c:dd6:ffff:ffff:ffff:ffff
Weitere Beispiele:
ip address add 2a01:4f8:1c1c:dd6:0000:0000:0000:1000 dev eth0
ip address add 2a01:4f8:1c1c:dd6:0000:0000:0815:0000 dev eth0
ip address add 2a01:4f8:1c1c:dd6:af9c:1c59:91a5:1d63 dev eth0
Wenn Sie nur ip address add verwenden, geht die Konfiguration nach dem nächsten Neustart verloren. Siehe den nächsten Abschnitt, wie Sie diese Konfigurationen neustart-sicher machen.
Sie können den Server auch so konfigurieren, dass er auf jede IP-Adresse im gesamten /64-Subnetz lauscht:
ip route add local 2a01:4f8:1c1c:dd6::/64 dev eth0
Die IPv6-Adresse, unter der Ihr Server nach seiner Erstellung erreichbar war, ist in /etc/network/interfaces.d/50-cloud-init konfiguriert:
cat /etc/network/interfaces.d/50-cloud-init
# This file is generated from information provided by the datasource. Changes
# to it will not persist across an instance reboot. To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
# control-alias eth0
iface eth0 inet6 static
address 2a01:4f8:1c1c:dd6::1/64
dns-nameservers 2a01:4ff:ff00::add:1 2a01:4ff:ff00::add:2
gateway fe80::1
Kopieren Sie den relevanten Abschnitt und erstellen Sie eine neue Datei /etc/network/interfaces.d/99-custom. Fügen Sie für jede IPv6-Adresse, unter der der Server erreichbar sein soll, einen Konfigurationsblock wie diesen hinzu. Beachten Sie, dass wenn Sie ein ganzes Subnetz konfigurieren, der Server nicht für alle IPs im Subnetz erreichbar sein wird - der obige Block macht den Server nur unter 2a01:4f8:1c1c:dd6::1 erreichbar, nicht unter jeder IP in 2a01:4f8:1c1c:dd6::1/64! Weitere Informationen finden Sie in diesem serverfault.com-Thread
.
Denken Sie daran, dass die normalisierte Version von 2a01:4f8:1c1c:dd6::1 2A01:04F8:1C1C:0DD6:0000:0000:0000:0001 ist, und dass die Angabe eines /128-Subnetzes in IPv6 wie die Angabe eines /32-Subnetzes in IPv4 ist - es bezieht sich auf eine einzelne IP-Adresse.
cat /etc/network/interfaces.d/99-custom
# app1.blunix.com
iface eth0 inet6 static
address 2a01:4f8:1c1c:dd6:ffff:ffff:ffff:fff0/128
dns-nameservers 2a01:4ff:ff00::add:1 2a01:4ff:ff00::add:2
gateway fe80::1
# app2.blunix.com
iface eth0 inet6 static
address 2a01:4f8:1c1c:dd6:1234:5678:90ab:cdef/128
dns-nameservers 2a01:4ff:ff00::add:1 2a01:4ff:ff00::add:2
gateway fe80::1
Um Änderungen an Konfigurationsdateien unter /etc/network/interfaces.d/ anzuwenden, führen Sie den folgenden Befehl aus. Dies startet das Netzwerk Ihres Servers neu und der Server ist für etwa zwei bis drei Sekunden nicht erreichbar. In dieser Zeit hängt Ihre SSH-Sitzung, was normal ist.
systemctl restart networking
Um eine neustart-sichere Konfiguration zu erstellen, die den Server unter allen IPs im Subnetz erreichbar macht, fügen Sie einfach die Routen-Befehle am Ende hinzu:
cat /etc/network/interfaces.d/99-custom
# Erreichbar für alle IPs im /64
iface eth0 inet6 static
address 2a01:4f8:1c1c:dd6::1/64
dns-nameservers 2a01:4ff:ff00::add:1 2a01:4ff:ff00::add:2
gateway fe80::1
# Einrichtung, um auf jede Adresse im Subnetz zu antworten
post-up ip -6 route add local 2a01:4f8:1c1c:dd6::1/64 dev eth0
pre-down ip -6 route del local 2a01:4f8:1c1c:dd6::1/64 dev eth0
Für jede IPv6-Adresse, die Sie für das Hosting einer Website oder eines anderen Dienstes verwenden möchten, konfigurieren Sie einen DNS-Eintrag vom Typ AAAA. In der Hetzner DNS-Verwaltungs-WebUI kann dies folgendermaßen geschehen:
Um zu überprüfen, ob Sie den DNS-Eintrag korrekt eingerichtet haben, können Sie einfach die neue Domain anpingen. Stellen Sie sicher, dass Sie ping6 anstelle von ping verwenden:
ping6 -c 3 ipv6-blogpost.blunix.com
PING ipv6-blogpost.blunix.com(ipv6-blogpost.blunix.com (2a01:4f8:1c1c:dd6:1234:5678:90ab:cdef)) 56 data bytes
64 bytes from ipv6-blogpost.blunix.com (2a01:4f8:1c1c:dd6:1234:5678:90ab:cdef): icmp_seq=1 ttl=52 time=106 ms
64 bytes from ipv6-blogpost.blunix.com (2a01:4f8:1c1c:dd6:1234:5678:90ab:cdef): icmp_seq=2 ttl=52 time=206 ms
64 bytes from ipv6-blogpost.blunix.com (2a01:4f8:1c1c:dd6:1234:5678:90ab:cdef): icmp_seq=3 ttl=52 time=125 ms
Sie können auch /etc/hosts-Einträge für IPv6-Adressen auf genau die gleiche Weise einrichten, wie Sie IPv4-Einträge einrichten würden:
cat << EOF | sudo tee -a /etc/hosts
2a01:4f8:1c1c:dd6:1234:5678:90ab:cdef ipv6-blogpost.blunix.com
Es gibt nichts Besonderes bei der Generierung von Let’s Encrypt-Zertifikaten für IPv6-Domains. Im folgenden Beispiel stimmen wir automatisch den Nutzungsbedingungen zu (--agree-tos), starten einen eigenständigen Webserver (--standalone) und verweigern die Angabe einer E-Mail-Adresse, was nur bedeutet, dass wir nicht per E-Mail zwei Wochen vor Ablauf der Domain benachrichtigt werden (--register-unsafely-without-email).
certbot certonly --agree-tos --standalone --register-unsafely-without-email --domain ipv6-blogpost.blunix.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Account registered.
Requesting a certificate for ipv6-blogpost.blunix.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/ipv6-blogpost.blunix.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/ipv6-blogpost.blunix.com/privkey.pem
This certificate expires on 2024-07-23.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Der folgende Beispiel-Nginx-vHost ist so konfiguriert, dass er SSL für alle 18,45 Trillionen IPv6-Adressen bereitstellt. Beachten Sie, dass wir für jede IP AAAA-DNS-Einträge erstellen und sie in /etc/network/interfaces.d/ wie oben beschrieben konfigurieren müssen, damit die IP funktioniert.
Die folgende SSL-Konfiguration ist nur ein Beispiel - um eine ordnungsgemäße Konfiguration zu erstellen, schauen Sie sich den Mozilla SSL-Konfigurationsgenerator für Webserver an. Die folgenden Befehle lassen Sie Ihre Nginx- und OpenSSL-Version ermitteln:
nginx -v
nginx version: nginx/1.22.1
openssl version
OpenSSL 3.0.11 19 Sep 2023 (Library: OpenSSL 3.0.11 19 Sep 2023)
Hier ist die Nginx-vHost-Konfiguration für das Hosting einer Website mit einer IPv6-Adresse auf der Hetzner Cloud. Beachten Sie die zwei Listen-Direktiven, eine für localhost (127.0.0.1) und eine für eine oder alle möglichen IPv6-Adressen:
server {
server_name ipv6-blogpost.blunix.com;
listen 127.0.0.1:80;
listen [::]:80;
return 301 https://ipv6-blogpost.blunix.com$request_uri;
}
server {
server_name ipv6-blogpost.blunix.com;
listen 127.0.0.1:443 ssl http2;
listen [::]:443 ssl http2;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
ssl_certificate /etc/letsencrypt/live/ipv6-blogpost.blunix.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ipv6-blogpost.blunix.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
}
Um Nginx so zu konfigurieren, dass er nur auf einer bestimmten IPv6-Adresse lauscht, geben Sie einfach die Adresse in eckigen Klammern an:
listen [2a01:4f8:1c1c:dd6:1234:5678:90ab:cdef]:80;
listen [2a01:4f8:1c1c:dd6:1234:5678:90ab:cdef]:443 ssl http2;
Bei Verwendung öffentlicher IP-Adressen gibt es hierfür keinen guten Anwendungsfall. Normalerweise sollten Sie nur eine öffentliche IP pro Website verwenden. Bei Verwendung einer öffentlichen sowie einer internen (privaten) IP kann dies jedoch sinnvoll sein.
Damit Nginx einen vHost auf mehreren IP-Adressen verfügbar macht, können Sie einfach mehrere Listen-Direktiven angeben, um einen Nginx-vHost auf mehreren IPv6-Adressen verfügbar zu machen:
listen [2a01:4f8:1c1c:dd6:1234:5678:90ab:cdef]:80;
listen [2a01:4f8:1c1c:dd6:0000:0000:0000:1234]:80;
listen [2a01:4f8:1c1c:dd6:1234:5678:90ab:cdef]:443 ssl http2;
listen [2a01:4f8:1c1c:dd6:0000:0000:0000:1234]:443 ssl http2;
Nginx bietet keine Option, auf ein ganzes Subnetz zu lauschen, weder IPv4 noch IPv6. Sie können Nginx so konfigurieren, dass er auf allen eingehenden IPv6-Verkehr lauscht:
listen [::]:443 ssl http2;
Und dann einfach Ihre Firewall verwenden, um nur die Adressen durchzulassen, die Sie zulassen möchten.
Der folgende Beispiel-Apache2-vHost ist so konfiguriert, dass er SSL für alle 18,45 Trillionen IPv6-Adressen bereitstellt. Beachten Sie, dass wir für jede IP AAAA-DNS-Einträge erstellen und sie in /etc/network/interfaces.d/ wie oben beschrieben konfigurieren müssen, damit die IP funktioniert.
Die folgende SSL-Konfiguration ist nur ein Beispiel - um eine ordnungsgemäße Konfiguration zu erstellen, schauen Sie sich den Mozilla SSL-Konfigurationsgenerator für Webserver an. Die folgenden Befehle lassen Sie Ihre Apache2- und OpenSSL-Version ermitteln:
apache2 -v
Server version: Apache/2.4.59 (Debian)
Server built: 2024-04-05T12:02:26
openssl version
OpenSSL 3.0.11 19 Sep 2023 (Library: OpenSSL 3.0.11 19 Sep 2023)
Aktivieren Sie zuerst die Apache2-SSL- und Headers-Module:
a2enmod ssl headers
Hier ist die Apache2-vHost-Konfiguration für das Hosting einer Website mit einer IPv6-Adresse auf der Hetzner Cloud. Beachten Sie die zwei Listen-Direktiven, eine für localhost (127.0.0.1) und eine für eine oder alle möglichen IPv6-Adressen:
<VirtualHost [::]:80>
ServerName ipv6-blogpost.blunix.com
DocumentRoot /var/www/html
Redirect permanent / https://ipv6-blogpost.blunix.com
</VirtualHost>
<VirtualHost [::]:443>
ServerName ipv6-blogpost.blunix.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/ipv6-blogpost.blunix.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ipv6-blogpost.blunix.com/privkey.pem
Protocols h2 http/1.1
Header always set Strict-Transport-Security "max-age=63072000"
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
SSLHonorCipherOrder off
SSLSessionTickets off
</VirtualHost>
Um Apache2 so zu konfigurieren, dass er nur auf einer bestimmten IPv6-Adresse lauscht, geben Sie einfach die Adresse in eckigen Klammern an:
listen [2a01:4f8:1c1c:dd6:1234:5678:90ab:cdef]:80;
listen [2a01:4f8:1c1c:dd6:1234:5678:90ab:cdef]:443 ssl http2;
Während Sie mehrere IPv4- oder IPv6-Adressen in /etc/apache2/ports.conf wie folgt angeben können:
Listen [2a01:4f8:1c1c:dd6:1234:5678:90ab:0000]:443
Listen [2a01:4f8:1c1c:dd6:1234:5678:90ab:1111]:443
Listen [2a01:4f8:1c1c:dd6:1234:5678:90ab:2222]:443
Aber Sie sind immer noch auf eine einzelne IP in jeder VirtualHost-Konfiguration beschränkt:
<VirtualHost [2a01:4f8:1c1c:dd6:1234:5678:90ab:0815]:443>
Die Sie so einstellen können, dass sie auf alle möglichen IPs lauscht:
<VirtualHost [::]:443>
Von dort aus müssen Sie die ServerName-Direktive verwenden, um die eingehenden Anfragen zu sortieren:
ServerName ipv6-blogpost.blunix.com
Apache2 bietet keine Option, auf ein ganzes Subnetz zu lauschen, weder IPv4 noch IPv6. Sie können Apache2 so konfigurieren, dass er auf allen eingehenden IPv6-Verkehr lauscht:
listen [::]:443 ssl http2;
Und dann einfach Ihre Firewall verwenden, um nur die Adressen durchzulassen, die Sie zulassen möchten.
Ihre Website sollte jetzt konfiguriert und über ihre IPv6-Adresse(n) erreichbar sein. Zeit zu überprüfen, ob sie korrekt funktioniert.
Geben Sie einfach die URL in Ihren Browser ein:
Sie können auch curl verwenden, um zu überprüfen, ob die Website online ist:
curl -6 --head --location http://ipv6-blogpost.blunix.com
HTTP/1.1 301 Moved Permanently
Server: nginx/1.22.1
Date: Wed, 24 Apr 2024 11:03:53 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://ipv6-blogpost.blunix.com/
HTTP/2 200
server: nginx/1.22.1
date: Wed, 24 Apr 2024 11:03:54 GMT
content-type: text/html
content-length: 615
last-modified: Wed, 24 Apr 2024 09:20:47 GMT
etag: "6628ceef-267"
strict-transport-security: max-age=63072000
accept-ranges: bytes
Suchen Sie
Linux Notfallunterstützung,
Linux-Beratung für Projekte,
Linux Managed Hosting,
Qubes OS Beratung und Support oder
Online- und Vor-Ort-Schulungen?