【问题标题】:check if ip address belongs to a Class A, B and C in python检查ip地址是否属于python中的A、B和C类
【发布时间】:2017-02-22 07:23:03
【问题描述】:

如何在 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。
  • 我想将私有 IP 分类,但找不到方法
  • 也许这是一个愚蠢的想法,但是字符串比较呢? A/B/C 都有不同的护林员(前 3 个数字)——难道不能以此区分吗?还是我没有抓住重点?
  • @Cribber 给定的 IP 可能不属于这 3 个类
  • 网络类已经死了(请让它们安息吧),在 1993 年被 RFC 1517、1518 和 1519(定义 CIDR(无类域间路由)。本世纪还没有使用网络类。

标签: python ip


【解决方案1】:

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")

我给了你元组形式,因为你有网络地址和掩码,但如果你更喜欢 /X(CIDR 标准)后缀,它也接受它。实际上还有一些额外的方法。

要使用它,您只需检查某个IPv4Address 是否为in IPv4Network,就好像您在检查list 中的元素一样:

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 中的类吗?可以举个例子吗
  • IPv6 有等效的类,ipaddress.IPv6Addressipaddress.IPv6Network,但还没有尝试过,会给他们一个机会并回发,但我希望会有类似的行为
  • 正如预期的那样,这些类的工作方式与 IPv4 版本完全相同。
  • 有关 IPv6 和 asnwer 中包含的通用版本的信息。除了地址和网络类之外,还有第三个接口,它基本上将前面的两个类组合在一起,旨在在单个对象中指定设备 IP + 它所连接的网络,看看它是否对您的应用程序有帮助。
  • @Adirio 这对单个子网有好处,我们如何覆盖特定类中的整个 IP 地址范围。
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 2017-10-30
  • 2014-05-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 2022-03-03
  • 2013-08-22
相关资源
最近更新 更多