IPv6 i rekordy PTR

21/06/2009

O ile w przypadku adresów IPv4 tworzenie wpisów revDNS było i jest dość trywialne (większość administratorów jest w stanie przetłumaczyć sobie w locie 212.180.240.5 na 5.240.180.212.in-addr.arpa) o tyle pojawienie sie adresów IPv6 wprowadziło w to nudnawe zagadnienie coś w rodzaju ducha przygody.

Chyba każdy, kto zapragnął szybko wpisać do strefy rekord PTR dla adresu IPv6 mógł przez chwilę poczuć się niczym średniowieczny mnich – kopista. Mozolne przeklepywanie cyferek dla adresu np. 2001:4c30:100:2:2d0:b7ff:fed3:9a aby finalnie osiągnąć coś zbliżonego do a.9.0.0.3.d.e.f.f.f.7.b.0.d.2.0.2.0.0.0.0.0.1.0.0.3.c.4.1.0.0.2.ip6.arpa dostarcza zajęcia równie żmudnego. Choć pewnie mniej satysfakcjonującego.

Ponieważ uważam, że komputery powstały by rozwiązywać za nas problemy, których nie byłoby, gdyby nie było komputerów, dlatego postanowiłem uprościć sobie to niewdzięczne zadanie. Z pomocą przyszła mi pythonowska biblioteka ipaddr-py – ma ona stać się standardowym modułem począwszy od Pythona 2.7. Użytkownicy wcześniejszych wersji interpretera będą musieli pobrać ją sobie i zainstalować w dowolnie wybranym miejscu.

Przed instalacją, prawdopodobnie, zajdzie potrzeba nałożenia malutkiej łaty która nieco ujednolici wyniki przez metodę ip_ext_full (uzasadnienie znajduje się pod powyższym odnośnikiem). Łatkę należy pobrać do katalogu biblioteki i zaaplikować poleceniem:

patch < plik.z.latka.diff

Po połataniu dokonujemy instalacji, na przykład w ten sposób:

./setup.py install --install-lib=/usr/local/lib/python2.5/site-packages/

Pamietajmy, że musimy mieć prawa zapisu do docelowego katalogu!

Potem możemy wykorzystać prosty program:

#!/usr/bin/python -tt

import ipaddr
import sys
import os

def rev_ipv6(addr, net_length=128) :
    chars = (128 - net_length) / 4
    suffix = '.ip6.arpa' if net_length == 128 else ''
    return ipaddr.IPv6(addr).ip_ext_full.replace(':','')[-chars:][::-1].replace('','.').strip('.') + suffix

if __name__ == "__main__":
    if len(sys.argv) < 2 :
        print("Usage: %s ipv6_addr" % sys.argv[0])
        sys.exit(os.EX_USAGE)


    print("128: %s" % rev_ipv6(sys.argv[1]))
    print(" 48: %s" % rev_ipv6(sys.argv[1], 48))
    print(" 64: %s" % rev_ipv6(sys.argv[1], 64))

Użytkownicy Pythona poniżej 2.5 będą musieli zastąpić linijkę:

    suffix = '.ip6.arpa' if net_length == 128 else ''

przez

    if net_length == 128 :
        suffix = '.ip6.arpa'
    else :
        suffix = ''

Całą robotę odwala za nas procedurka rev_ipv6 przyjmująca jako argument adres IPv6 i, opcjonalną, ilość bitów podsieci. Drugi parametr wprowadziłem ponieważ u siebie wykonałem delegacje dla podsieci /64, jednak nie każdy musi hołdować tej zasadzie.

A program działa tak:

$ ./bin/gen_ptr.sh 2001:4c30:100:2:2d0:b7ff:fed3:9a
128: a.9.0.0.3.d.e.f.f.f.7.b.0.d.2.0.2.0.0.0.0.0.1.0.0.3.c.4.1.0.0.2.ip6.arpa
48: a.9.0.0.3.d.e.f.f.f.7.b.0.d.2.0.2.0.0.0
64: a.9.0.0.3.d.e.f.f.f.7.b.0.d.2.0

Teraz wystarczy zaznaczyć sobie odpowiedni fragment, szybciutko wkleić i już nie tracić więcej cennego czasu. ;)

  1. 22/06/2009 o 08:16

    Mimo, że python dla mnie to magia to łopatologiczny artykuł okazał się bardzo pomocny :)

  2. klęku
    07/07/2009 o 21:25

    aleś gościu namiśkował… patche, jakieś cuda a można

    $ host 2001:6a0:112:0:bad:1337:ca11:911
    Host 1.1.9.0.1.1.a.c.7.3.3.1.d.a.b.0.0.0.0.0.2.1.1.0.0.a.6.0.1.0.0.2.ip6.arpa not found: 3(NXDOMAIN)

    proste jak dupczenie

    • 08/07/2009 o 09:22

      @klęku
      Pozwolę sobie zacytować swoją wcześniejszą odpowiedź na podobny zarzut.

      PS. Jeśli czyjeś życie seksualne jest równie proste i przyjemne jak liczenie cyferek w komunikacie błędu narzędzia ‚host’ to sugerowałbym jednak odrobinę wyrafinowania. Naprawdę warto. ;)

  1. No trackbacks yet.
Możliwość komentowania jest wyłączona.
%d blogerów lubi to: