gpt4 book ai didi

python - ipaddress模块​​和IPv6反向指针

转载 作者:行者123 更新时间:2023-12-01 07:46:39 25 4
gpt4 key购买 nike

我将尝试用示例解释我的问题:当我使用 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) 的一个。

提前谢谢

最佳答案

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 因为每个半字节都带有以下内容点。

关于python - ipaddress模块​​和IPv6反向指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56429402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com