From 61c486167cb7d5f5980121ea5695bc0dacde9d65 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Mon, 3 Aug 2026 07:02:31 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20nur=20noch=20=C3=BCber=20IPv4=20pr=C3=BC?= =?UTF-8?q?fen,=20hetzner=20hat=20kein=20funktionierendes=20IPv6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit hetzner hat eine globale IPv6-Adresse und eine Default-Route, aber keine Konnektivität — auch google.com und cloudflare.com laufen über IPv6 in den Timeout. Bei jeder Domain mit AAAA-Record wartete Python erst ~20s, bevor es auf IPv4 zurückfiel: vanityontour.de und wiki wurden mit über 20000ms statt ~180ms gemessen, und der Lauf überschritt das 5-Minuten-Cron-Intervall. Bisher war das verdeckt, weil ein /etc/hosts-Block auf hetzner die betroffenen Domains auf IPv4 pinnte. Der Block stammte aus der DNS-Migration im April, war überholt und enthielt für wiki.vanityontour.de eine tote IP (2.57.91.91) — daher der TLS-Fehler und das dauerhafte "down" des Wikis. Mit dem Entfernen des Blocks kam die latente IPv6-Störung zum Vorschein. Der Checker filtert getaddrinfo jetzt auf AF_INET. Das ist kein Workaround um die Störung herum, sondern beschreibt den Messpunkt korrekt: mehr als IPv4 kann hetzner derzeit nicht erreichen. Die IPv6-Störung selbst bleibt offen. --- scripts/check_status.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/scripts/check_status.py b/scripts/check_status.py index c498cb3..be1ada2 100644 --- a/scripts/check_status.py +++ b/scripts/check_status.py @@ -12,6 +12,22 @@ import urllib.request import urllib.error from datetime import datetime, timezone +# hetzner, von dem aus geprüft wird, hat zwar eine globale IPv6-Adresse und eine +# Default-Route, aber keine funktionierende IPv6-Konnektivität — jede Verbindung +# zu einem AAAA-Record läuft erst in einen ~20s-Timeout, bevor Python auf IPv4 +# zurückfällt. Das verfälscht die gemessenen Antwortzeiten massiv (20s statt +# 150ms) und zog den Lauf über das Cron-Intervall hinaus. Bis IPv6 auf hetzner +# repariert ist, wird hier ausschließlich über IPv4 geprüft — das entspricht +# ohnehin dem, was dieser Messpunkt tatsächlich erreichen kann. +_getaddrinfo_orig = socket.getaddrinfo + + +def _getaddrinfo_ipv4_only(*args, **kwargs): + return [ai for ai in _getaddrinfo_orig(*args, **kwargs) if ai[0] == socket.AF_INET] + + +socket.getaddrinfo = _getaddrinfo_ipv4_only + OUTPUT_FILE = "public/status.json" # Seit der VPN-Absicherung (Phase 2) antworten die Admin-Oberflächen auf ihren