繁体   English   中英

如何检查一个网络是否包含在 Python 中的另一个网络中?

[英]How do I check if a network is contained in another network in Python?

如何检查一个网络是否完全包含在 Python 中的另一个网络中,例如10.11.12.0/24是否在10.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
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

从 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 版本,则只需从模块的更高版本中复制该方法的代码即可

尝试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!"

出于某种原因,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)

我还需要实施这样的检查。 阅读ipaddress 模块的文档,我发现函数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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM