IPv6-MySQL-Stolperfalle

Eben bin ich über eine kleine IPv6-Falle gestolpert.

Für einen Server mit einer MySQL-Datenbank (nennen wir ihn mal “db”) wurde ein AAAA-Record im DNS eingetragen. Im Hintergrund läuft u.a. ein SSH-Tunnel von einem anderen Server aus (”foo”) zu dieser MySQL-Datenbank:

foo:~> ssh -L 3308:db:3306 -C -N -f -g kk@db

Sobald der neue AAAA-Eintrag im DNS aktiv war, klappte keine MySQL-Verbindung mehr von “foo” auf “db”. Die Fehlermeldung auf “foo” lautete:

channel 1: open failed: connect failed: Connection refused

Erst auf den zweiten Blick war klar was passiert ist: der Name “db” wurde ja bisher auf die externe IPv4-Adresse des db-Servers aufgelöst. Nun scheint der Server beim Vorhandensein der IPv6-Adresse standardmäßig eine IPv6-Verbindung am Ende des SSH-Tunnels aufzubauen. Da über die MySQL-Berechtigungstabelle aber nur Zugriffe aus dem lokalen IPv4-Netz erlaubt sind, wurde die Verbindung von MySQL abgelehnt…

Workaround: entweder den SSH-Tunnel explizit zur IPv4-IP des Zielhosts aufbauen (-L 3308:192.168.0.1:3306) oder die IPv6-Adressen in die entsprechenden Tabellen aufnehmen (mysql.hosts / mysql.user).

3 Bemerkungen zu “IPv6-MySQL-Stolperfalle”

  1. Jonas

    Wie alle Unix/Linux Programme macht ssh ein Ipv6-Force. Wenn also Ipv6 vorhanden ist, wird v6 genutzt.

    Einfacher als die IP-Adresse zu nutzen:

    foo:~> ssh -4 -L 3308:db:3306 -C -N -f -g kk@db

    -4: Forces ssh to use IPv4 addresses only.

    Die Switches -4 und -6 sind bei sehr vielen Programmen vorhanden…

  2. Klaus Keppler

    Danke für die Info! :-)

  3. ur

    Ich hatte auf Ubuntu 10.4 das Problem, dass Anwendungen wie ISPConfig, Froxlor, ehcp etc. sich nicht bei Mysql anmelden konnten, obwohl der Host stimmte und die mysql Verbindung auch ordnungsgemäß gestartet war gemäß /etc/init.d/mysql und Kontrolle über lsof -i
    Die Fehlermeldung bezog sich auf den Socket. Der im Pfad angegebene war nicht verwendbar und im tmp keiner zu finden (nicht generiert). Ich vermute, dass die Einrichtung der IPv6 verhindert hat, dass mysql den Unix-eigenen Sockettreiber verwendet - weil der aber funktioniert, wurde kein anderer generiert. So stand mysql dann ohne Treiber da. Die Installationsanweisungen für den PDO im Manual finde ich nicht brauchbar, da ich keinen Sourcecode finden kann, den man mit –with… kompilieren könnte. Bei apt-get erkennt mein Ubu aber das –with.. nicht als irgendwie gültige Option an. jetzt hoffe ich, dass postgresql mit der entsprechenden Admin-Oberfläche das Problem nicht hat. Bisher ist die Installation geglückt - dort sind auch schon entsprechende Eintraguungen für Unix und IPv6 vorgenommen worden. Dagegen lesen sich die Bemerkungen auf der mysql Seite so, als wäre das IPv6 “Problem” erst gelöst mit mysql 7.0 (Cluster), also jenseits der Open Source Unix Unterstützung.

Einen Kommentar schreiben