【问题标题】:How do I check if a network is contained in another network in Python?如何检查一个网络是否包含在 Python 中的另一个网络中?
【发布时间】:2016-01-31 14:48:56
【问题描述】:

如何检查一个网络是否完全包含在 Python 中的另一个网络中,例如如果10.11.12.0/2410.11.0.0/16 中?

我尝试过使用ipaddress,但它不起作用:

>>> import ipaddress
>>> ipaddress.ip_network('10.11.12.0/24') in ipaddress.ip_network('10.11.0.0/16')
False

【问题讨论】:

  • ipaddress.ip_network('10.11.12.0/24').overlaps(ipaddress.ip_network('10.11.0.0/16'))?
  • @GingerPlusPlus:如果您交换网络,这将返回 True
  • A= Primary Net(10.4.0.0), B=Member of A(75.85.45.0) 没门!如果您是 A 的成员,则成员 B 使用朋友示例。

标签: python python-3.x networking


【解决方案1】:
import ipaddress

def is_subnet_of(a, b):
   """
   Returns boolean: is `a` a subnet of `b`?
   """
   a = ipaddress.ip_network(a)
   b = ipaddress.ip_network(b)
   a_len = a.prefixlen
   b_len = b.prefixlen
   return a_len >= b_len and a.supernet(a_len - b_len) == b

然后

is_subnet_of("10.11.12.0/24", "10.11.0.0/16")   # => True

【讨论】:

  • 现在内置在模块ipaddress:ipaddress.ip_network(u'10.11.12.0/24').subnet_of(ipaddress.ip_network(u'10.11.0.0/16')) == True
  • @Francois 真的吗?什么版本的 Python?我没有看到它in the docs
  • 用 Python 2.7.9 测试
【解决方案2】:

从 Python 3.7.0 开始,您可以使用 ipaddress.IPv6Networkipaddress.IPv4Networksubnet_of()supernet_of() 方法进行网络遏制测试:

>>> from ipaddress import ip_network
>>> a = ip_network('192.168.1.0/24')
>>> b = ip_network('192.168.1.128/30')
>>> b.subnet_of(a)
True
>>> a.supernet_of(b)
True

如果您有 3.7.0 之前的 Python 版本,则只需从模块的更高版本复制方法的 code

【讨论】:

    【解决方案3】:

    试试netaddr,如下-

    检查一个网络是否在另一个网络中

    from netaddr import IPNetwork,IPAddress
    
    if IPNetwork("10.11.12.0/24") in IPNetwork("10.11.0.0/16"):
        print "Yes it is!"
    

    检查某个 IP 是否在网络中

    from netaddr import IPNetwork,IPAddress
    
    if IPAddress("10.11.12.0") in IPNetwork("10.11.0.0/16"):
        print "Yes it is!"
    

    【讨论】:

    • 这似乎是一个更好的答案。
    【解决方案4】:

    由于某种原因,ipaddress 模块没有提供简单的功能来检查一个网络是否包含在另一个网络中。我设法解决了这个问题:

    ip1 = '10.0.0.0/24' ip2 = '10.0.0.22' ipaddress.ip_network(ip2) in ipaddress.ip_network(ip1).subnets(new_prefix=ipaddress.ip_network(ip2).prefixlen)

    【讨论】:

      【解决方案5】:

      我还需要实施这样的检查。阅读ipaddress module的文档,发现函数overlaps()。有用。代码示例:

      import ipaddress
      from ipaddress import IPv4Network
      
      supernet = IPv4Network('10.0.0.0/8')
      net = IPv4Network('11.0.10.0/30')
      print(net.overlaps(supernet))
      

      【讨论】:

      • tihs 示例没有说明问题的解决方案;无论如何它都是错误的,因为即使net 没有完全包含在supernet 中,overlaps 也会返回 true(参见上面@planetp 的评论)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 2018-10-15
      • 2021-07-22
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多