Python ipaddress.IPv6Network ValueError beheben: ... has host bits set

English Deutsch

Problem:

Beim Versuch, eine IPv6-Netzwerkadresse in Python mit Code wie

ipv6_network_example.py
import ipaddress
ipaddress.IPv6Network("2a01:c23:c0bb:d00:8ce6:2eff:fe60:cc69/64")

erscheint eine Fehlermeldung wie

ipv6_traceback.txt
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/tmp/ipykernel_154945/1312927855.py in <module>
      1 import ipaddress
----> 2 ipaddress.IPv6Network("2a01:c23:c0bb:d00:8ce6:2eff:fe60:cc69/64")

/usr/lib/python3.8/ipaddress.py in __init__(self, address, strict)
    2106         if packed & int(self.netmask) != packed:
    2107             if strict:
-> 2108                 raise ValueError('%s has host bits set' % self)
    2109             else:
    2110                 self.network_address = IPv6Address(packed &

ValueError: 2a01:c23:c0bb:d00:8ce6:2eff:fe60:cc69/64 has host bits set

Lösung 1: Vielleicht sollte stattdessen IPv6Address statt IPv6Network verwendet werden

Wenn die Adresse geparst werden soll und das Netzwerk keine Rolle spielt, ipaddress.IPv6Address verwenden, aber beachten, dass die CIDR-Maske (z.B. /64) entfernt werden muss. Ob IPv6Address oder IPv6Network verwendet werden sollte, hängt davon ab, was damit gemacht werden soll – wenn auf einen spezifischen Host verwiesen werden soll, wird fast immer IPv6Address verwendet.

ipv6_address_example.py
import ipaddress
ipaddress.IPv6Address("2a01:c23:c0bb:d00:8ce6:2eff:fe60:cc69")

Lösung 2: strict=False verwenden, damit IPv6Network die Host-Bits verwirft:

strict=False ignoriert diesen Fehler im Wesentlichen

ipv6_strict_example.py
import ipaddress
ipaddress.IPv6Network("2a01:c23:c0bb:d00:8ce6:2eff:fe60:cc69/64", strict=False)

Beachten, dass das Ergebnis

ipv6_strict_result.py
IPv6Network('2a01:c23:c0bb:d00::/64')

ist, sodass die Informationen in den Host-Bits verloren gehen!

Lösung 2: Host-Bits manuell entfernen

Da die Host-Bits ohnehin verworfen werden, kann das IPv6-Netzwerk einfach mit der korrekten Netzmaske angegeben werden:

ipv6_network_corrected.py
import ipaddress
ipaddress.IPv6Network("2a01:c23:c0bb:d00::/64")

Check out similar posts by category: Networking, Python