Python IP地址模块和IPv6反向指针

Python IP地址模块和IPv6反向指针,python,dns,ipv6,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

我将试着用例子来解释我的问题: 当我使用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模块和如上所述的给定前缀(重要)

输出为

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模块,但它的bug太多,在我看来不可用。有人知道如何解决这个问题吗?我更喜欢不使用shell命令(ipv6calc)的


提前感谢

反向指针是这样实现的:

    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.3.a.5.8.8.b.d.0.1.0.0.0.2.ip6.arpa
这是正确的版本,即使不是您想要的

您需要将
IPv6Network
子类化,并根据自己的喜好重写
\u reverse\u 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
,因为每个半字节都有一个点。

我不同意投票结果。这个问题已经包含了一个MCVE,它清楚地说明了问题,以及它与预期结果的区别。不过,我的Python不够强大,无法解决这个问题。我有一个简单的解决方案
network=ipaddress.IPv6Network('2001:db8:85a3::/48',False);'。join(network.network\u address.reverse\u pointer.split('.')[32-(network.prefixlen//4):])
,这仍然不令人满意。如果将输出与ipv6calc和一些特殊前缀(例如49)进行比较,则您的和我的都不正确
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