ipaddress模块​​和IPv6反向指针

时间:2019-06-03 14:28:55

标签: python dns ipv6

我将尝试通过示例来说明我的问题: 当我使用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.

现在我正在尝试使用ipaddress模块​​和具有上述前缀(重要)的给定前缀在python中构建反向域

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模块,但是它的问题就像地狱一样,在我看来不可用。有谁知道如何解决这个问题?我希望使用一个不使用Shell命令(ipv6calc)的计算机。

提前谢谢

1 个答案:

答案 0 :(得分:0)

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为单位,因为每个半字节都带有一个后接点。