如果我有一个起始IP和一个终止IP,如何找到该子网?

时间:2018-09-20 11:25:01

标签: python routing ip subnet

我需要阻止来自某些国家/地区的某些IP,但是我只能得到这样的起始IP和结束IP:

11.22.33.44 - 11.22.35.200

我想计算子网使其如下:

(not accurate)

11.22.33.44/14

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

2 个答案:

答案 0 :(得分: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')]

看起来像是我的比赛。

答案 1 :(得分:0)

  1. 将IP地址转换为无符号长
  2. 将两个地址异或
  3. 从开始算起零位-这就是您的前缀长度