使用Python检查网络是否是更大网络的一部分

2024-05-15 09:56:58 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题是更大项目的一部分。让我先从项目开始。这也许有助于解释我想要达到的目标。我工作的公司有很多AWS帐户,这些帐户有很多安全组(sg)。因此他们有很多出入境规则。问题是有太多相互重叠的规则。你知道吗

例如:在一个sg中有一个允许10.0.1.0/24端口入站访问的规则,比如说1234。但同时还有另一条规则,允许10.0.0.0/16访问所有端口。前一条规则显然不是必需的。现在你可以尽情发挥你的想象力,考虑其他安全组、单个IP、入站和出站访问等等。你知道吗

如果我必须手动操作,那将是一场噩梦。所以,我决定用编程的方式来做。这几天我正在尝试Python脚本,这似乎是一个完美的开始。但我还停留在第一阶段。要做到这一点,我想我需要一种方法来比较三件事

  • 如果单个ip或多个ip是网络的一部分。你知道吗
  • 如果一个网络是更大网络的一部分。你知道吗
  • 如果一个港口范围是更大港口范围的一部分。你知道吗

谷歌搜索第一点,给我看了几个结果。我想我会选择ipaddress模块。但我想不出第二点的方法。我试着成为一个聪明的a$$和实验,但没有成功。你知道吗

>>> import ipaddress
>>> network1 = u'10.0.0.0/16'
>>> ipaddress1 = u'10.0.1.10'
>>> ipaddress.ip_address(ipaddress1) in ipaddress.ip_network(network1)
True
>>>
>>> network2 = u'10.0.1.0/24'
>>> ipaddress.ip_network(network2) in ipaddress.ip_network(network1)
False
>>>

就是这样。我希望我已经解释了这个问题,如果没有请告诉我。我会尽力提供更多的信息。你知道吗

任何帮助都将不胜感激。同时,我也很想知道如何着手解决整个项目。我认为可以肯定这是一个非常普遍的问题。你知道吗

谢谢你抽出时间。你知道吗


Tags: 项目方法端口inip网络规则帐户
1条回答
网友
1楼 · 发布于 2024-05-15 09:56:58

您可以尝试使用overlaps()

overlaps(other)

True if this network is partly or wholly contained in other or other is wholly contained in this network.

>>> bigNet = ipaddress.ip_network('10.0.0.0/16')
>>> smallNet = ipaddress.ip_network('10.0.0.0/24')
>>> 
>>> smallNet.overlaps(bigNet)
True

但这还不够,因为它是双向的:

>>> bigNet.overlaps(smallNet)
True

所以我们也可以检查前缀长度:

>>> contains(bigNet,smallNet)
>>> def contains(net1, net2):
    return net1.overlaps(net2) and net1.prefixlen >= net2.prefixlen

>>> contains(bigNet,smallNet)
False
>>> contains(smallNet,bigNet)
True

相关问题 更多 >