我会试着用例子来解释我的问题:当我使用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)的版本。
提前谢谢你
发布于 2019-06-04 06:38:54
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 address,而不是网络/前缀。
首先,您可以通过执行以下操作来获得更好的答案:
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,因为每个半字节都有一个后面的点。
https://stackoverflow.com/questions/56429402
复制相似问题