使用Python

时间:2017-01-21 09:06:44

标签: python networking network-programming

这个问题是更大项目的一部分。让我先从项目开始。这可能有助于解释我想要实现的目标。我工作的公司有很多AWS账户,这些账户有很多安全组(sg)。因此他们有很多入站和出站规则。问题是有很多规则相互重叠。

例如:在一个sg中有一个规则允许端口的10.0.1.0/24入站访问,比方说,1234。但同时还有另一个允许10.0.0.0/16访问所有端口的规则。显然不需要前一条规则。现在你可以让你的想象力变得疯狂,并考虑其他安全组,个人ips,入站和出站访问以及不是。

如果我必须手动执行此操作,那将是一场噩梦。所以,我决定以编程方式执行此操作。这些天我正在尝试使用Python脚本,这似乎是一个完美的起点。但我陷入了第一阶段。为了能够做到这一点,我想我需要一种比较三件事的方法

  • 如果个人ip或ips是网络的一部分。
  • 如果网络是更大网络的一部分。
  • 如果端口范围的端口是较大端口范围的一部分。
谷歌搜索第一点,向我展示了几个结果。我想我会选择ipaddress模块​​。但我无法找到第二点的方法。我试着成为一个聪明的人并试验,但它并没有成功。

>>> 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
>>>

所以这就是它。我希望我已经解释了这个问题,如果没有,请告诉我。我会尝试提供更多信息。

非常感谢任何帮助。而且,我很想听听如何解决这个整体项目。我认为可以安全地假设这是一个非常普遍的问题。

感谢您的时间。

1 个答案:

答案 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