【问题标题】:If I have a starting and an ending IP, how can I find the subnet?如果我有一个起始 IP 和一个结束 IP,如何找到子网?
【发布时间】:2019-02-24 16:52:35
【问题描述】:

我需要阻止来自某些国家/地区的一些 IP,但我只获得了起始 IP 和结束 IP,如下所示:

11.22.33.44 - 11.22.35.200

我想像这样计算子网:

(not accurate)

11.22.33.44/14

如何在 Python 中确定给定 IP 地址范围的子网?

【问题讨论】:

  • 我打算投票结束这个作为一个离题的网络问题,但我看到你已经包含了 Python 标记。您是否尝试在 Python 代码中 执行此操作?
  • 是的,我正在尝试在 python 中执行此操作,但我也对伪代码感到满意
  • 使用内置的ipaddress模块怎么样?

标签: python routing ip subnet


【解决方案1】:

我最近没有花太多时间建立人脉,但我认为您可以通过以下方式最有效地做到这一点。

首先,重要的是要认识到并非所有 IP 范围都可以表示为单个子网。让我们来看看一个常见的子网像

192.168.0.0/24

/24 表示192.168.0.0 的前 24 位给出网络前缀,在本例中为192.168.0,其余位用于主机寻址。你得到一个从192.168.0.0192.168.0.255 的范围。

ipcalc 可以在这里帮助我们。让我们看看它是否同意:

$ ipcalc 192.168.0.0 - 192.168.0.255
deaggregate 192.168.0.0 - 192.168.0.255
192.168.0.0/24

到目前为止一切顺利。但是如果要排除用于广播的.0.255 怎么办?没有代表该范围的单个子网:

$ ipcalc 192.168.0.0 - 192.168.0.254
deaggregate 192.168.0.0 - 192.168.0.254
192.168.0.0/25
192.168.0.128/26
192.168.0.192/27
192.168.0.224/28
192.168.0.240/29
192.168.0.248/30
192.168.0.252/31
192.168.0.254/32

子网以 2 的幂次方增长,当我们的范围没有完全融入该框架时,我们最终会得到这样的结果。

顺便说一句,您给出的示例没有给出单个子网:

$ ipcalc 11.22.33.44 - 11.22.35.200
deaggregate 11.22.33.44 - 11.22.35.200
11.22.33.44/30
11.22.33.48/28
11.22.33.64/26
11.22.33.128/25
11.22.34.0/24
11.22.35.0/25
11.22.35.128/26
11.22.35.192/29
11.22.35.200/32

Python 有一个 ipaddress 模块。让我们看看its summarize_address_range() function 是否与ipcalc 一致(为便于阅读而格式化):

>>> import ipaddress

>>> list(ipaddress.summarize_address_range(
        ipaddress.IPv4Address('192.168.0.0'),
        ipaddress.IPv4Address('192.168.0.255')))

[IPv4Network('192.168.0.0/24')]

到目前为止一切顺利。第二个例子怎么样?

>>> list(ipaddress.summarize_address_range(
        ipaddress.IPv4Address('11.22.33.44'),
        ipaddress.IPv4Address('11.22.35.200')))

[IPv4Network('11.22.33.44/30'),
 IPv4Network('11.22.33.48/28'),
 IPv4Network('11.22.33.64/26'),
 IPv4Network('11.22.33.128/25'),
 IPv4Network('11.22.34.0/24'),
 IPv4Network('11.22.35.0/25'),
 IPv4Network('11.22.35.128/26'),
 IPv4Network('11.22.35.192/29'),
 IPv4Network('11.22.35.200/32')]

对我来说看起来很匹配。

【讨论】:

    【解决方案2】:
    1. 将 IP 地址转换为无符号长整数
    2. 异或两个地址
    3. 从头开始计数零位 - 这是您的前缀长度

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 2013-09-15
      • 2016-01-01
      • 2014-07-19
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      相关资源
      最近更新 更多