IPv6-Adresse: Host-Teil mit Python ersetzen

English Deutsch

In unserem vorherigen Beitrag Bitweise Operationen mit IPv6-Adressen und Netzwerken in Python haben wir gezeigt, wie man bitweise Operationen in Python mit dem ipaddress-Modul durchführt. In diesem Beitrag werden wir diese vorherige Arbeit nutzen, um nur den Host-Teil einer IPv6-Adresse zu ersetzen und den Netzwerk-Teil unverändert zu lassen – mit anderen Worten, wir werden zwei IPv6-Adressen miteinander kombinieren unter Verwendung einer konfigurierbaren Netzwerk-Präfixlänge.

replace_ipv6_host_part.py
import ipaddress

def bitwise_and_ipv6(addr1, addr2):
    result_int = int.from_bytes(addr1.packed, byteorder="big") & int.from_bytes(addr2.packed, byteorder="big")
    return ipaddress.IPv6Address(result_int.to_bytes(16, byteorder="big"))

def bitwise_or_ipv6(addr1, addr2):
    result_int = int.from_bytes(addr1.packed, byteorder="big") | int.from_bytes(addr2.packed, byteorder="big")
    return ipaddress.IPv6Address(result_int.to_bytes(16, byteorder="big"))

def bitwise_xor_ipv6(addr1, addr2):
    result_int = int.from_bytes(addr1.packed, byteorder="big") ^ int.from_bytes(addr2.packed, byteorder="big")
    return ipaddress.IPv6Address(result_int.to_bytes(16, byteorder="big"))

def replace_ipv6_host_part(net_addr, host_addr, netmask_length=64):
    # Bitmasken berechnen
    prefix_network = ipaddress.IPv6Network(f"::/{netmask_length}")
    hostmask = prefix_network.hostmask # ffff:ffff:ffff:ffff:: für /64
    netmask = prefix_network.netmask # ::ffff:ffff:ffff:ffff für /64
    # Adresse berechnen
    net_part = bitwise_and_ipv6(net_addr, netmask)
    host_part = bitwise_and_ipv6(host_addr, hostmask)
    # Resultierende IP zusammensetzen
    return bitwise_or_ipv6(net_part, host_part)

# Verwendungsbeispiel:
# IP-Adresse, aus der der Netzwerk-Teil ("Präfix") genommen wird
net_addr = ipaddress.IPv6Address("2a01:c22:6f71:9f00:8ce6:2eff:fe60:cc69")
# IP-Adresse, aus der der Host-Teil (Suffix) genommen wird
host_addr = ipaddress.IPv6Address("::dead:babe:cafe:0000")
print(replace_ipv6_host_part(net_addr, host_addr))

Dies gibt aus

replace_ipv6_output.txt
IPv6Address('2a01:c22:6f71:9f00:dead:babe:cafe:0')

Check out similar posts by category: Networking, Python