IPv6 i rekordy PTR
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. ;)

Mimo, że python dla mnie to magia to łopatologiczny artykuł okazał się bardzo pomocny :)
Twoja ocena:
0
0
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:
0
0
@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:
0
0