Hetzner Cloud Networks IPv6
Mit diesem Workaround sind meine Server im Hetzer Cloud Netzwerk an einer OPNsense auch per IPv6 erreichbar.
Einleitung
Im Hetzner Netzwerk für Cloud Server wird nur IPv4 unterstützt und kein IPv6 (Stand: September 2024).
Meine Cloud Server sind nicht direkt mit dem öffentlichen Netzwerk verbunden, sondern über das Hetzner Netzwerk mit einer OPNsense. Damit meine Server hinter der OPNsense trotzdem via IPv6 erreichbar sind, nutze ich als Workaround einen GRE Tunnel.
OPNsense Version: 24.7.4_1
Ubuntu Version: 24.04.1
Übersicht der Config-Schritte:
- Hetzner Netzwerk erstellen
- OPNsense
WAN&Hetzner (LAN)Interface prüfen - OPNsense GRE Interface
gre0erstellen, zuweisen & aktivieren - OPNsense Firewall Gruppe
DMZv6Puberstellen - OPNsense Interface
gre0zur GruppeDMZv6Pubhinzufügen - OPNsense Firewall Regeln für
DMZv4Pirv,DMZv6Puberstellen - Server GRE Tunnel
tun0konfigurieren
Voraussetzung
Mein Workaround setzt voraus, dass die OPNsense bereits betriebsbereit und via IPv4 erreichbar ist.
Topologie
Vereinfachte Darstellung des Aufbaus
Hetzner
Die Einrichtung des Hetzner Netzwerks ist in diesem Tutorial beschrieben.
Achte darauf, dass im Hetzner Netzwerk eine Default Route zur OPNsense eingerichtet ist.
Ziel:0.0.0.0/0, Gateway:10.80.0.3
OPNsense
WAN Interface prüfen
Hetzner vergibt pro Cloud Server 1 kostenloses IPv6 Prefix mit einer /64 Maske.
Um diesen Prefix auch auf Servern hinter der OPNsense nutzen zu können, vergibt man dem OPNsense WAN Interface eine ::1/128 Adresse.
Menü: [Interfaces / WAN]
Stelle sicher, dass dein WAN Interface die korrekte Adresse & Maske eingestellt hat:
WAN: Enable = true IPv6 Configuration Type = Static IPv6 IPv6 Address = 2a01::1/128Ersetze den Prefix
2a01::mit dem dir von Hetzner zugeteilten Prefix!
Hetzner Interface prüfen
Das Interface welches mit dem Hetzner Netzwerk verbunden ist, habe ich DMZv4Priv benannt.
Menü: [Interfaces / DMZv4Priv]
Stelle sicher, dass dein Hetzner Interface eine Adresse via DHCP bezieht:
DMZv4Priv: Enable = true IPv4 Configuration Type = DHCP
GRE Interface erstellen
Das Interface DMZv4Priv nutze ich für den GRE Tunnel, dort werden die Pakete gesendet/empfangen.
Menü: [Interfaces / Other Types / GRE]
Erstelle das GRE Interface:
gre0: Local Address = DMZv4Priv (10.80.0.3) Remote Adress = 10.80.0.4 (Server IP / Tunnel Endpoint) Tunnel local address = 2a01::3 Tunnel remote address = 2a01::4 Tunnel netmask/prefix = 127
GRE Interface zuweisen
Damit das gre0 Interface genutzt werden kann, muss dieses zugewiesen und aktiviert werden.
Menü: [Interfaces / Assignments]
Ordne das Interface zu:
Device = gre0 Description = Tun0
Menü: [Interfaces / Tun0]
Aktiviere das Interface:
Enable: [x] Enable Interface
Firewall Gruppe erstellen
Menü: [Firewall / Groups]
In der Gruppe DMZv6Pub werden später die Firewall Regeln erstellt. Sollten zukünftig weitere GRE Tunnel hinzugefügt werden, muss kein neues Regelwerk geschrieben werden. Das neue GRE Interface wird zur Gruppe hinzugefügt und somit wird auch das vorhandene Regelwerk angewandt.
Erstelle die Gruppe und füge das Interface hinzu:
Name = DMZv6Pub Members = Tun0
Firewall Regelwerk
Menü: [Firewall / Rules / DMZv4Priv]
Dieses Regelwerk steuert die IPv4 Kommunikation deiner Server.
- Erstelle die Regel, damit der GRE Tunnel erlaubt ist:
| Action | Protocol | Source | Port | Destination | Port | Gateway | Description |
|---|---|---|---|---|---|---|---|
| Allow | IPv4 GRE | * | * | DMZv4Priv address | * | * | GRE Tunnel Allowed |
Menü: [Firewall / Rules / DMZv6Pub]
Dieses Regelwerk steuert die IPv6 Kommunikation deiner Server.
- Erstelle die Regel, damit ein Ping in Richtung Internet erlaubt ist:
| Action | Protocol | Source | Port | Destination | Port | Gateway | Description |
|---|---|---|---|---|---|---|---|
| Allow | IPv6 IPV6-ICMP | * | * | * | * | * | Ping Allowed |
Server
Interface Config
Zur Konfiguration des Server Interfaces nutze ich Netplan.
Das Tool ist ein Renderer zur Abstraktion der Netzwerkkonfiguration.
Erstelle die beiden Netplan Konfigurationsdateien und passe diese auf deine Parameter an:
1 2 3 4 5 6 7 8 9 10 11
network: version: 2 ethernets: ens10: # <- dein Interface Name angeben dhcp4: true nameservers: addresses: - 1.1.1.1 # <- DNS IP routes: - to: default via: 10.80.0.1 # <- IP des Hetzner "Switches"
Nutze den MTU Calculator um für deine Umgebung die korrekte MTU zu ermitteln.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
network: version: 2 tunnels: tun0: mode: gre mtu: "1426" # <- 1450 (Hetzner Network) - 20 (IPv4 Header) - 4 (GRE Header) optional: true # <- damit der Server beim booten nicht auf dieses Interface wartet remote: 10.80.0.3 # <- OPNsense IPv4 Adresse (DMZv4Priv Interface) local: 10.80.0.4 # <- Server IPv4 Adresse (wird per DHCP von Hetzner vergeben) addresses: - "2a01::4/127" # <- dein öffentlicher IPv6 Prefix bzw. die IPv6 die dein Server bekommen soll routes: - to: default via: "2a01::3" # <- OPNsense IPv6 Adresse (DMZv6Pub Interface)
Führe den Befehl aus, um die Netzwerk Config erstellen zu lassen:
1
netplan generate
Führe den Befehl aus, um die Netzwerk Config zu übernehmen:
1
netplan try -timeout 30Ohne anschließende Bestätigung des Befehls, wird die Netzwerk Config zurück gerollt.
Sehr hilfreich, falls die Netzwerkverbindung durch einen Konfigurationsfehler unterbrochen wird.Nach dem die Konfiguration übernommen wurde, prüfe ob die Adressen auf dem Interface
tun0korrekt sind:1 2 3 4 5 6
user@server:~$ ip address show dev tun0 tun0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1426 qdisc noqueue state UNKNOWN group default qlen 1000 link/gre 10.80.0.4 peer 10.80.0.3 inet6 2a01::4/127 scope global valid_lft forever preferred_lft forever
Funktionstest
Ein erster Test mit ping zeigt, der Server kann nun via IPv6 kommunizieren.
1
2
3
4
5
6
7
8
9
10
user@server:~$ ping -6 google.com
PING google.com (2a00:1450:4001:82a::200e) 56 data bytes
64 bytes from fra24s07-in-x0e.1e100.net (2a00:1450:4001:82a::200e): icmp_seq=1 ttl=56 time=4.16 ms
64 bytes from fra24s07-in-x0e.1e100.net (2a00:1450:4001:82a::200e): icmp_seq=2 ttl=56 time=4.31 ms
64 bytes from fra24s07-in-x0e.1e100.net (2a00:1450:4001:82a::200e): icmp_seq=3 ttl=56 time=4.26 ms
64 bytes from fra24s07-in-x0e.1e100.net (2a00:1450:4001:82a::200e): icmp_seq=4 ttl=56 time=4.39 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 4.162/4.279/4.387/0.081 ms
Zusammenfassung
Solltest du weitere Server in der Hetzner Cloud bereitstellen, musst du für jeden Server einen neuen GRE Tunnel konfigurieren.
Es gibt noch die Möglichkeit VXLAN zu nutzen, jedoch war mir der Config-Overhead zu hoch. Da im Hetzner Netzwerk kein Multicast unterstützt wird, muss für jeden Server ein VXLAN angelegt werden und dann auf eine Bridge gelegt werden.
Für mich hat sich der GRE Tunnel Workaround als “einfachste” IPv6 Lösung herausgestellt.
