f.zz.de
posts /

IP normalisierung und parsing

Posted Mon 19 Sep 2016 03:14:02 PM CEST Florian Lohoff
in

Es gibt für Perl diverse IP Adresse Normalisierungs oder Manipulations Module. Jedes ist auf seine Weise kaputt.

Normalerweise nehme ich gerne NetAddr::IP weil es einfach einen String konsumiert und mir eben den Host oder Network oder die Masklen zurückliefern kann. Dazu bekomme ich auch entsprechend die Normalisierte Schreibweise zurück - Gut um z.b. DNS Zonen zu schreiben. Heute war allerdings die Natur wieder besser. Es gibt Content da behauptet NetAddr::IP es sei eine ipv4 Adresse - wenn man es ausgibt kommt eine IPv6 Adresse bei raus. Jetzt muss Mutter Natur nur jemanden Produzieren der diesen Content da rein wirft - Aber auf Mutter Natur ist ja verlass:

libnetaddr-ip-perl: Parses number - version() == 4 - prints v6

Es gibt natürlich andere Module - Net::IP was aber Probleme in der Normalisierung hat. So ist der default bei Net::IP die IPv6 Adressen nicht in ihre Normalisierte shortform zu bringen wie es das RFC5952 verlangt.

perl -MNet::IP 
    -e '$i=new Net::IP("2001:DB8::/32") or die (Net::IP::Error());
        print $i->ip() ."\n";'
    2001:0db8:0000:0000:0000:0000:0000:0000

Also findet man ''$i->short()'' was funktioniert

perl -MNet::IP 
    -e '$i=new Net::IP("2001:DB8::/32") or die (Net::IP::Error());
        print $i->short() ."\n";'
2001:db8::

Nur macht das dann bei IPv4 ärger:

    perl -MNet::IP 
    -e '$i=new Net::IP("192.168.0.0/24") or die (Net::IP::Error());
        print $i->short() ."\n";'
192.168.0

Mal davon abgesehen das es nur Netze verarbeiten kann und sowas wie ''192.168.1.22/24'' komplett verschmäht.

Dann gibt es noch Data::Validate::IP was ich zugegebenermaßen noch nicht probiert habe. Da es aber auch keine Normalisierung hat löst das Modul auch nur die Hälfte der Probleme. Vielleicht sollte ich doch mal ein eigenes IP Parsing Modul & Validation Module schreiben. Wie kommt man an einen CPAN account?