Post

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 gre0 erstellen, zuweisen & aktivieren
  • OPNsense Firewall Gruppe DMZv6Pub erstellen
  • OPNsense Interface gre0 zur Gruppe DMZv6Pub hinzufügen
  • OPNsense Firewall Regeln für DMZv4Pirv, DMZv6Pub erstellen
  • Server GRE Tunnel tun0 konfigurieren

Voraussetzung

Mein Workaround setzt voraus, dass die OPNsense bereits betriebsbereit und via IPv4 erreichbar ist.

Topologie

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/128
    

    Ersetze 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:
ActionProtocolSourcePortDestinationPortGatewayDescription
AllowIPv4 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:
ActionProtocolSourcePortDestinationPortGatewayDescription
AllowIPv6 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 30
    

    Ohne 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 tun0 korrekt 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.

This post is licensed under CC BY 4.0 by the author.