这个问题是更大项目的一部分。让我先从项目开始。这可能有助于解释我想要实现的目标。我工作的公司有很多AWS账户,这些账户有很多安全组(sg)。因此他们有很多入站和出站规则。问题是有很多规则相互重叠。
例如:在一个sg中有一个规则允许端口的10.0.1.0/24入站访问,比方说,1234。但同时还有另一个允许10.0.0.0/16访问所有端口的规则。显然不需要前一条规则。现在你可以让你的想象力变得疯狂,并考虑其他安全组,个人ips,入站和出站访问以及不是。
如果我必须手动执行此操作,那将是一场噩梦。所以,我决定以编程方式执行此操作。这些天我正在尝试使用Python脚本,这似乎是一个完美的起点。但我陷入了第一阶段。为了能够做到这一点,我想我需要一种比较三件事的方法
>>> 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
>>>
所以这就是它。我希望我已经解释了这个问题,如果没有,请告诉我。我会尝试提供更多信息。
非常感谢任何帮助。而且,我很想听听如何解决这个整体项目。我认为可以安全地假设这是一个非常普遍的问题。
感谢您的时间。
答案 0 :(得分:0)
您可以尝试使用overlaps()
重叠(其他)
如果此网络部分或全部包含在此网络中,则为真。
。
>>> 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