在Python中检查IP地址是否属于A类、B类或C类

3
如何在Python中确定IP地址的类别。我正在使用Python的ipaddress模块。 以下是类别定义:
Class   Private Networks    Subnet Mask Address Range
A   10.0.0.0    255.0.0.0   10.0.0.0 - 10.255.255.255
B   172.16.0.0 - 172.31.0.0 255.240.0.0 172.16.0.0 - 172.31.255.255
C   192.168.0.0 255.255.0.0 192.168.0.0 - 192.168.255.255

给定一个IP地址,如何检查它属于A类、B类还是C类


你是不是只想查看IP是否为私有is_private?因为A类、B类、C类等的定义已经过时且不再使用(参见无类别IP地址),而且它们的定义中也包括非私有IP。 - Bakuriu
我想将私有IP地址分类,但找不到方法。 - hard coder
也许这是一个愚蠢的想法,但字符串比较怎么样?A/B/C都有不同的范围(前3个数字)-难道不能通过这种方式进行区分吗?或者我错过了什么? - Cribber
@Cribber 给定的 IP 可能在这三个类之外。 - Adirio
网络类已死(请让它们安息吧),在1993年被RFC 1517、1518和1519杀死(比商业互联网的1995年还早两年!),这些定义了CIDR(无类别域间路由)。网络类在本世纪已经不再使用。 - Ron Maupin
2个回答

6

IPv4

使用 ipaddress.IPv4Addressipaddress.IPv4Network 类型。

from ipaddress import IPv4Address, IPv4Network

classA = IPv4Network(("10.0.0.0", "255.0.0.0"))  # or IPv4Network("10.0.0.0/8")
classB = IPv4Network(("172.16.0.0", "255.240.0.0"))  # or IPv4Network("172.16.0.0/12")
classC = IPv4Network(("192.168.0.0", "255.255.0.0"))  # or IPv4Network("192.168.0.0/16")

我给您提供元组形式,因为您有网络地址和掩码,但如果您更喜欢使用CIDR标准的/X后缀,也可以接受。实际上还有其他一些方法。
要使用它,您只需检查特定的IPv4Address是否在IPv4Network中,就像检查一个元素是否在列表中一样:
ip1 = IPv4Address("10.0.2.8")
ip2 = IPv4Address("172.18.76.25")
ip3 = IPv4Address("192.168.45.62")

ip1 in classA  # True
ip2 in classA  # False
ip3 in classA  # False

ip1 in classB  # False
ip2 in classB  # True
ip3 in classB  # False

ip1 in classC  # False
ip2 in classC  # False
ip3 in classC  # True

IPv6

使用 ipaddress.IPv6Addressipaddress.IPv6Network 类型,并在创建对象时纠正 IPv6 IP 字符串。

通用

如果需要同时支持 IPv4 和 IPv6,则可以使用 ipaddress.ip_addressipaddress.ip_network 便捷工厂函数,模块将根据字符串格式创建适当的 IPv4 或 IPv6 类。


来源:https://docs.python.org/3/library/ipaddress.html


这看起来不错。我们能用这种方式检查IPv6中的类吗?你能给一个例子吗? - hard coder
IPv6也有相应的类,即ipaddress.IPv6Addressipaddress.IPv6Network,但我还没有尝试过它们,我会试一下并回复结果,但我预计行为会类似。 - Adirio
如预期,这些类的工作方式与IPv4版本完全相同。 - Adirio
答案中包括IPv6和通用版本的信息。除了Address和Network类之外,还有第三个类Interface,它基本上将前两个类分组,旨在以单个对象指定设备IP +其连接到的网络,请查看是否可以帮助您的应用程序。 - Adirio
@Adirio 这对于单个子网很好,但我们如何覆盖特定类别中的整个IP地址范围。 - Krishna Oza
显示剩余6条评论

0
检查IP地址是否属于Python中的A类、B类或C类。
a='195.168.10.20'
b=int(a[0:3])
if b in range(1,127):
    print(a,'-->','class-A')
elif b in range(128,191):
    print(a,'-->','class-B')
elif b in range(192,223):
    print(a,'-->','class-C')
elif b in range (224,239):
    print(a,'-->','class-D')
elif b in range (240,255):
    print(a,'-->','class-E')
else:
    print(a,'-->','not valid ip')

输出:

195.168.10.20 --> class-C

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