Sven Rautenberg: PHP, MySQL und IPv6 Handling

Beitrag lesen

Moin!

Im Moment werden alle IPv4 als Long in einer MySQL DB gespeichert.

Für IPv6 gibt es jedoch keine native 2long Funktion. Ich habe im Web zwar eine Alternative gefunden, welche mir jedoch nicht zusagt.

Daher müsste ich die IPv6 entweder als Varchar oder als Varbinary (wenn ich inet_pton nutze) speichern. Ein Vergleich zwischen mehreren IPs oder eine Rangesuche wären auch mit diesen beiden Varianten möglich, jedoch nehmen diese Felder mehr Speicher ein und die Operationen gehen langsamer vonstatten. Aber das kann ich noch verkraften.
Liegt die IPv6 in der Netznotation vor, müsste ich aber eine Range speichern, wenn ich das richtig verstanden habe. Wobei ich mir nicht sicher bin, ob IPv6 Addressen in Netznotation überhaupt im Internet vertreten sind.

Ich bin mir also absolut nicht schlüssig wie ich mit der IPv6 Problematik umgehen soll.

Im Prinzip gibts nur zwei Wege:

VARCHAR, und die IPv6 dort als Text speichern. Ggf. inet_ntop(inet_pton()) als Normalisierung anwenden.

Oder BINARY (ggf. VARBINARY), und dort das Ergebnis von PHP's inet_pton() reinspeichern.

Die Frage, die du für weitergehende Variationen beantworten solltest: IP speichern wofür? Nur so als Gedankenanregung: Jeder IPv6-Teilnehmer hat vermutlich ein ganzes /64-Netz zur Verfügung, also einen IP-Adressraum von 4 Milliarden Internets (in IPv4). Sein Netzwerkinterface wird dabei standardmäßig mehrere IP-Adressen gleichzeitig verwenden (siehe z.B. Privacy Extensions). Es ist daher nicht praktikabel, die herkömmlichen IP-Sperren-Mechanik weiterzuverwenden, weil bei IPv6 einfach massenhaft neue IP-Adressen ohne Aufwand zur Verfügung stehen. Wenn man die Privacy-Extensions entsprechend konfigurieren will, könnte man beispielsweise jede Minute eine neue IP benutzen (für neu aufgebaute Verbindungen), und weiterhin hereinkommende Datenpakete für die alten IPs noch eine gewisse Zeit lang akzeptieren.

Die einfache Reaktion, jetzt also einfach /64-Netze zu sperren, ist auch keine sehr gute: Auch Anschlüsse mit nicht nur einem einzigen Nutzer, sondern auch große Subnetzwerke (Unternehmen) haben nur ein /64-Netz. Eine Sperre blockiert jetzt also nicht nur den einen bösen Nutzer, sondern gleich pauschal alle. :)

- Sven Rautenberg