如何在Python中检查IP是否在网络中?

140

如何在Python中检查IP地址(比如192.168.0.1)是否属于某个网络(比如192.168.0.0/24)?

在Python中是否有一些常规工具用于IP地址的操作,例如主机查找、将IP地址转换为整数、将带有子网掩码的网络地址转换成整数等等?希望这些工具能够在Python 2.5标准库中找到。


这个问题似乎是一个不错的经典问题,适用于非常旧的2.x版本的答案,但对于3.x版本已经过时。请参见如何组织和分配“Python/pandas比较IP地址/CIDR”的经典问题? - smci
@smci,我不明白为什么;phihag在https://dev59.com/8HRA5IYBdhLWcg3wzhRY#1004527上的回答对于Python 3来说是一个完美的答案,并且自2014年以来一直存在。我已经撤销了您使该答案无效的编辑。 - Mark Amery
@Staale - 你应该更新你的答案,以一个没有重大漏洞的答案。其他答案使用内置库来完成相同的事情,只需要1/10的代码,而且没有任何漏洞。 - Addison
31个回答

0
另一种解决方案是使用IPy库。
def is_ip_in_prefix(ip, *prefixes):
prefixes_ipset = IPy.IPSet([IPy.IP(item) for item in prefixes])
try:
    ip_ipset = IPy.IP(ip)
    return (
        ip_ipset in prefixes_ipset
        or
        # If the IP is IPv4/IPv6 and prefix is IPv6/IPv4 addresses, we need to convert it to a compatible
        # format.
        #   >>> IP('192.168.1.1').v46map()
        #   IP('::ffff:192.168.1.1')
        #   >>> IP('::ffff:192.168.1.1').v46map()
        #   IP('192.168.1.1')
        ip_ipset.v46map() in prefixes_ipset
    )
except ValueError:
    return False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接