python ipaddr库netmask IPv6

时间:2015-11-04 20:39:30

标签: python ipv6

我正在使用python-ipaddr库。

我无法为IPv6地址指定网络掩码。它只需要CIDR符号。

>>> ipaddr.IPv6Network('2001:db00::0/24')
IPv6Network('2001:db00::/24')
>>> ipaddr.IPv6Network('2001:db00::0/ffff:ff00::')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/lib/python2.6/site-packages/ipaddr.py", line 1925, in __init__
   raise NetmaskValueError(addr[1])
ipaddr.NetmaskValueError: ffff:ff00::

有没有办法将netmask用于IPv6地址而不是CIDR? 如果没有,有没有支持这个的python库?
netmask

转换CIDRIPv6的最pythonic方式是什么?

TIA

2 个答案:

答案 0 :(得分:3)

CIDR是在IPv6中指定子网的唯一官方方式。

所以可能没有图书馆支持这个。

但是你可以计算位并将其转换为CIDR,并将位数作为后缀。

mask = "ffff:fff0::"
bitCount = [0, 0x8000, 0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00, 0xff00, 0xff80, 0xffc0, 0xffe0, 0xfff0, 0xfff8, 0xfffc, 0xfffe, 0xffff]

count = 0
try:
  for w in mask.split(':'):
    if not w or int(w, 16) == 0: break
    count += bitCount.index(int(w, 16))
except:
  raise SyntaxError('Bad NetMask')

答案 1 :(得分:2)

IPv6不再使用网络掩码,总是使用CIDR表示法。 CIDR表示法在IPv4中也很常见,因为它比那些笨拙的网络掩码更容易处理:)