如何检查网络是否完全包含在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
答案 0 :(得分:4)
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
答案 1 :(得分: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!"
答案 2 :(得分:3)
从Python 3.7.0开始,您可以将ipaddress.IPv6Network
和ipaddress.IPv4Network
的{{3}}和subnet_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
如果您的Python版本是3.7.0之前的版本,则可以从更高版本的模块中复制方法的supernet_of()
。
答案 3 :(得分:0)
由于某种原因,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)
答案 4 :(得分:-2)
我还需要实施这样的检查。阅读ipaddress module的文档,我发现函数重叠()。有用。代码示例:
import ipaddress
from ipaddress import IPv4Network
supernet = IPv4Network('10.0.0.0/8')
net = IPv4Network('11.0.10.0/30')
print(net.overlaps(supernet))