IPv6 i rekordy PTR

Autor , 21.06.2009 14:36

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/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ę:

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

przez

1
2
3
4
    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. ;)

Komentarze do wpisu: “IPv6 i rekordy PTR”

  1. cancer pisze:

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

    Twoja ocena: Dobre 0 Słabe 0

  2. klęku pisze:

    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

    Twoja ocena: Dobre 0 Słabe 0

    • Piotr pisze:

      @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. ;)

      Twoja ocena: Dobre 0 Słabe 0

Skomentuj wpis

Panorama Theme by Themocracy