【问题标题】:Need to break down a IP subnet需要分解一个 IP 子网
【发布时间】:2015-05-09 07:46:26
【问题描述】:

我正在尝试编写一个脚本,它将比 /24 更大(不大于 /16)的子网分解为 /24 子网。 例如:10.10.10.0/23 应该给我 10.10.10.0/24 和 10.10.11.0/24

我的逻辑是首先扫描 CIDR 掩码。如果小于 24,则从 24 中减去该数字(假设 x)给出 /24s 的总数,然后是 IP x 次和 /24 的 1 到第三个八位字节。

例如:10.10.8.0/22

if 22 < 24 
x = 24-22 = 2
total # of /24s = 2^x = 4
So output :
10.10.8.0/24
10.10.9.0/24 
10.10.10.0/24
10.10.11.0/24

我不知道如何只为第三个八位位组编码/修改字符串,并且只在第三个八位位组中加 1。

我正在考虑创建所有第三个八位字节值的列表并重新构建 IP。但是,如果那里有更简单的方法,那将对我有很大帮助!

谢谢!

【问题讨论】:

  • 我不是在这里要求代码,只是一个方向/几个关于如何接近的链接应该很好。谢谢!
  • 也许尽量不要使用小数点符号,而是二进制(或十进制,如果你喜欢)之一。如果您有一个IP/N 子网,您想要生成从 0 到 2^(24 - N) - 1 的所有 24 位数字,将它们添加到您的基本 IP 地址,并且您自己获得了 /24 子网的所有前缀。然后,您可以根据需要将它们转换回小数点表示法。
  • @Carsten 但是我仍然会有“点”如果我转换为二进制,这些点不会消失,例如:192.168.1.1 == 11000000.10101000.00000001.00000001
  • 这些点只是作为您和必须输入这些地址的人类同胞的分隔符。字符串表示“192.168.1.1”与二进制表示“11000000101010000000000100000001”相同,与十进制表示“3232235777”相同。
  • @Carsten .. 呃,我的错误.. 人为错误(第 8 层问题)感谢您的想法。我认为这种方式绝对有可能

标签: python python-2.x netmask


【解决方案1】:

看看netaddr 包。它已经内置了对理解网络掩码的支持,并且能够生成任意长度的子网列表:

>>> n = netaddr.IPNetwork('10.10.8.0/22')
>>> list(n.subnet(24))
[IPNetwork('10.10.8.0/24'), IPNetwork('10.10.9.0/24'), IPNetwork('10.10.10.0/24'), IPNetwork('10.10.11.0/24')]
>>> [str(sn) for sn in n.subnet(24)]
['10.10.8.0/24', '10.10.9.0/24', '10.10.10.0/24', '10.10.11.0/24']

从 Python 3.3 开始,新的内置 ipaddress 模块也提供此功能。

【讨论】:

    【解决方案2】:

    如果您使用的是 Python 3.3 或更高版本,则可以使用 the ipaddress module。使用subnets method,您可以在一行中完成:

    >>> list(ipaddress.ip_network('10.10.8.0/22').subnets(new_prefix=24))
    [IPv4Network('10.10.8.0/24'), IPv4Network('10.10.9.0/24'), IPv4Network('10.10.10.0/24'), IPv4Network('10.10.11.0/24')]
    

    转换为字符串很简单。只需投到str

    【讨论】:

    • 我还在使用 py 2.7。但我会对此投赞成票,因为输出显示了我需要的东西!谢谢!
    猜你喜欢
    • 2022-06-21
    • 2020-04-15
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2012-03-11
    • 2012-12-28
    • 2015-04-11
    • 2011-03-12
    相关资源
    最近更新 更多