【问题标题】:How to generate a random IPv6 subnet in Python 3如何在 Python 3 中生成随机 IPv6 子网
【发布时间】:2020-02-05 20:49:12
【问题描述】:

我有一个现有的 IPv6 地址块。如何使用 Python 在此块中生成随机 /64 网络,最好不使用任何外部库?

例如,您可以从fd00::/8 Unique Local Address (ULA) 块开始生成一个随机的私有 ipv6 网络。

【问题讨论】:

  • "例如,您可以从 fc00::/8 唯一本地地址 (ULA) 块开始生成随机私有 ipv6 网络。“不,@ 987654324@ 块已保留。 fd00::/8 ULA 块(设置了“L”位)可用于本地分配,但必须随机选择接下来的 40 位。这为您提供了一个 /48 前缀,您可以从中使用任何或所有 65.536 个 /64 网络,并且不需要随机选择。
  • @RonMaupin 我编辑了问题以询问fd00::/8。但是,我确实希望在这个块中有一个随机子网。所以随机前缀+该前缀中的随机子网。

标签: python-3.x ipv6


【解决方案1】:

正如@Ron Maupin 在他们对 OP 答案的评论中所指出的,这是一个使用正确数量的随机位的解决方案:

#! /usr/bin/env python3
"""IPv6 ULA generation."""

from ipaddress import IPv6Network
from random import getrandbits


__all__ = ['get_ula_network']


ULA_BASE = IPv6Network("fd00::/8")


def get_ula_network() -> IPv6Network:
    """Generates a random ULA network."""

    random_suffix = getrandbits(40) << 80
    base_address = ULA_BASE.network_address + random_suffix
    return IPv6Network((base_address, 48))

您可以通过以下方式驱动上述/64 网络:

>>> network = get_ula_network()
>>> subnets = list(network.subnets(new_prefix=64))
>>> len(subnets)
65536
>>> 

【讨论】:

  • 这不是一个完整的答案。它只显示如何生成 48 位路由前缀,而不是如何在该路由前缀中生成 random /64 网络。您能否更新您的答案以包括如何从此前缀中选择随机子网?
【解决方案2】:

您可以使用标准的randomipaddress 模块来执行此操作。短版:

from ipaddress import IPv6Network
import random

ula = IPv6Network("fd00::/8")
random_network = IPv6Network((
    ula.network_address + (random.getrandbits(64 - ula.prefixlen) << 64 ),
    64))

带解释的加长版:

from ipaddress import IPv6Network
import random

# Start from the ula address block
ula = IPv6Network("fd00::/8")

# Get a random bitstring the size of the number of bits we can randomise.
# This is the number of bits reserved for the network (64) minus the number of bits
# already used in the address block we start from (8).
random_bits = random.getrandbits(64 - ula.prefixlen)

# Bitshift those bits 64 times to the left, so the last 64 bits are zero.
random_address_suffix = random_bits << 64

# Add those bits to the network address of the block we start from
# and create a new IPv6 network with the modified address and prefix 64
random_network = IPv6Network((
    ula.network_address + random_address_suffix,
    64))

【讨论】:

  • 实际上,您生成的随机位太多。随机位数应该是 40,给你一个 /48 前缀,你可以从中派生 65,536 个 /64 网络。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 2015-07-08
  • 2016-07-17
  • 1970-01-01
相关资源
最近更新 更多