计算一个 IP 地址属于哪些子网
Posted
技术标签:
【中文标题】计算一个 IP 地址属于哪些子网【英文标题】:Calculate which subnets an IP address belongs to 【发布时间】:2021-12-12 15:39:52 【问题描述】:我有点卡在一个特定的问题上。我需要计算 IP 地址所属的子网。它可以用 SQL 或 Python 或类似的方式完成。
所以如果我有例如100.100.100.105 我需要获取所有子网:
100.100.100.105/32
100.100.100.104/31
100.100.100.104/30
100.100.100.104/29
100.100.100.96/28
100.100.100.96/27
100.100.100.64/26
...
100.64.0.0/10
100.0.0.0/9
...
64.0.0.0/2
0.0.0.0/1
但真的不知道如何解决这个问题。
【问题讨论】:
你想要达到的目标不是很清楚。如果您的输入是字符串(?)"100.100.100.105"
,您想取回所有看起来像["100.100.100.105/32", "100.100.100.105/21", etc...]
的字符串?
还指定预期结果。
对不起,问题中列出的一长串子网是我想要的输出。因此,一个单一 IP 地址所在的所有子网的列表,从 /32
、/31
开始。
github.com/SinaKzlca/IPRangeAnalyzer 看看这个也许你发现了一些有用的东西
【参考方案1】:
您可以使用ipaddress
模块中内置的python3 来实现这一点
import ipaddress
addresses = []
# get the int representation of your ip
ip = int(ipaddress.IPv4Address('100.100.100.105'))
for mask in range(32):
addresses.append(f'ipaddress.IPv4Address(ip & ((2**32-1)-(2**mask -1)))/32-mask ')
在每次迭代中,我们通过在 IP 的整数表示和掩码之间进行逻辑与运算来将掩码应用于我们的 IP。然后我们将结果转换为 ip 八位字节并附加“/24”子网符号。您可以将2**32-1
替换为4294967295
,我将其留在那里以便更清楚地了解发生了什么。
【讨论】:
以上是关于计算一个 IP 地址属于哪些子网的主要内容,如果未能解决你的问题,请参考以下文章