0

如果 IPv4 地址不在地址范围内,我正在设置一个运行一些代码的过滤器,我正在使用 ipaddress python3 的模块,但这让我很困惑,因为它说 172.16.32.5 在 CIDR 172.16 中。 0.0/12,当这是错误的:

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from ipaddress import IPv4Address,IPv4Network
>>> ip_addr = IPv4Address('172.16.32.5')
>>> ip_net = IPv4Network('172.16.0.0/12')
>>> all_addr = list(ip_net.hosts())
>>> ip_addr in ip_net
True
>>> all_addr[-1]
IPv4Address('172.31.255.254')

如您所见, ip_addr 超出了该网络中的最后一个主机...

我做错了什么?这个模块有bug吗?

4

3 回答 3

1

/12 子网掩码表示在二进制视图中设置前 12 位。您要查询的子网和主机具有相同的前 12 位:

                         cutoff at 12 bits
/12 mask    11111111.1111 | 0000.00000000.00000000
172.16.0.0  10101100.0001 | 0000.00000000.00000000
172.16.32.5 10101100.0001 | 0000.00100000.00000101

172.32.16.5 10101100.0010 | 0000.00010000.00000101

最后一个是我认为您误读的内容,它具有不同的前 12 位,并且位于子网之外。

另见:http: //jodies.de/ipcalc ?host=172.16.0.0&mask1=12&mask2=

于 2022-01-20T00:30:33.800 回答
0

我刚刚仔细检查,发现我不知道比较是在不同的八位字节,对不起,一切都很好。:(

于 2022-01-20T00:51:57.500 回答
0

使用子网计算器确保您有正确的输出。计算器的输入表明,正如 TessellatingHeckler 所说,172.16.0.0/12上升到172.31.255.254. 您要查找的 CIDR 是172.16.0.0/19,最高可达172.16.31.254.

于 2022-01-20T00:33:58.213 回答