модуль ipaddress и обратный указатель IPv6 - PullRequest
1 голос
/ 03 июня 2019

я попытаюсь объяснить мою проблему с примерами: когда я использую ipv6calc для создания обратного домена, это то, что я хочу получить:

$ ipv6calc --out revnibbles.arpa 2001:0db8:85a3::/48
No input type specified, try autodetection...found type: ipv6addr
3.a.5.8.8.b.d.0.1.0.0.2.ip6.arpa.
.

Вот пример без заданного префикса (128 по умолчанию), чтобы увидеть разницу

$  ipv6calc --out revnibbles.arpa 2001:0db8:85a3::
No input type specified, try autodetection...found type: ipv6addr
0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.a.5.8.8.b.d.0.1.0.0.2.ip6.arpa.

теперь я пытаюсь построить обратный домен в python с модулем ipaddress и с заданным префиксом, как указано выше (важно)

import ipaddress
print(ipaddress.IPv6Network(u"2001:0db8:85a3::/48").reverse_pointer)

вывод

8.4./.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.a.5.8.8.b.d.0.1.0.0.2.ip6.arpa

Похоже, модуль не учел это. Я также попробовал модуль IPy, но он глючит до чертиков и не пригоден для использования на мой взгляд. У кого-нибудь есть идеи, как это решить? Я бы предпочел один без использования команд оболочки (ipv6calc).

Заранее спасибо

1 Ответ

0 голосов
/ 04 июня 2019

reverse_pointer реализован следующим образом:

    def _reverse_pointer(self):
        """Return the reverse DNS pointer name for the IPv6 address.
        This implements the method described in RFC3596 2.5.
        """
        reverse_chars = self.exploded[::-1].replace(':', '')
        return '.'.join(reverse_chars) + '.ip6.arpa'

Таким образом, он явно не будет учитывать префикс.Обратите внимание, что в нем конкретно говорится об IPv6 адресе , а не о сети / префиксе.

Сначала вы получите лучший ответ, выполнив:

print(ipaddress.IPv6Network(u"2001:0db8:85a3::/48").network_address.reverse_pointer)

, что дает: 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.a.5.8.8.b.d.0.1.0.0.2.ip6.arpa которая является верной версией, даже если это не то, что вам нужно.

Вам нужно либо создать подкласс IPv6Network и переписать _reverse_pointer для вашей ссылки, либо напрямую изменить текущий результат, как показано ниже, это может работать, ноимеет крайние случаи:

print(ipaddress.IPv6Network(u"2001:0db8:85a3::/48").network_address.reverse_pointer[(2*(128-48)/4):])
3.a.5.8.8.b.d.0.1.0.0.2.ip6.arpa

, потому что полный результат - 32 полубайта (шестнадцатеричная цифра), разделенных точкой (кроме конечного .ip6.arpa), а 128-48 - количество битов для префиксачасть, и так как предыдущий в битах, вам нужно посчитать байты в шестнадцатеричном формате, так что /4, но *2, потому что каждый клев присутствует со следующей точкой.

...