如果我有起始 IP 和结束 IP,如何找到子网?
If I have a starting and an ending IP, how can I find the subnet?
我需要阻止来自某些国家/地区的某些 IP,但我只获得了起始 IP 和结束 IP,如下所示:
11.22.33.44 - 11.22.35.200
我想这样计算子网:
(not accurate)
11.22.33.44/14
如何确定给定 IP 地址范围 Python 中的子网?
我最近没有花太多时间在社交上,但我认为您可以通过以下方式最有效地做到这一点。
首先,重要的是要认识到并非所有 IP 范围都可以表示为单个子网。让我们看一下像
这样的常见子网
192.168.0.0/24
/24
表示192.168.0.0
的前24位给出网络前缀,在本例中192.168.0
,其余位用于主机寻址。您得到的范围从 192.168.0.0
到 192.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')]
看起来很适合我。
- 将 IP 地址转换为无符号长整数
- 异或两个地址
- 从头开始数零位 - 那就是你的前缀长度
我需要阻止来自某些国家/地区的某些 IP,但我只获得了起始 IP 和结束 IP,如下所示:
11.22.33.44 - 11.22.35.200
我想这样计算子网:
(not accurate)
11.22.33.44/14
如何确定给定 IP 地址范围 Python 中的子网?
我最近没有花太多时间在社交上,但我认为您可以通过以下方式最有效地做到这一点。
首先,重要的是要认识到并非所有 IP 范围都可以表示为单个子网。让我们看一下像
这样的常见子网192.168.0.0/24
/24
表示192.168.0.0
的前24位给出网络前缀,在本例中192.168.0
,其余位用于主机寻址。您得到的范围从 192.168.0.0
到 192.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')]
看起来很适合我。
- 将 IP 地址转换为无符号长整数
- 异或两个地址
- 从头开始数零位 - 那就是你的前缀长度