Вы можете использовать IPNetwork:
from netaddr import IPNetwork
ip_addr = '2.2.2.2'
mask = '255.255.255.0'
network = IPNetwork('/'.join([ip_addr, mask]))
generator = network.iter_hosts()
Примечание: 2.2.2.2/255.255.255.0
эквивалентно CIDR 2.2.2.0/24
, оба работают для IPNetwork
.
Конвертируя в список вы получаете:
In []:
list(generator)
Out[]:
[IPAddress('2.2.2.1'),
IPAddress('2.2.2.2'),
IPAddress('2.2.2.3'),
...
IPAddress('2.2.2.252'),
IPAddress('2.2.2.253'),
IPAddress('2.2.2.254')]
Согласно документации netaddr.iter_host
:
- для IPv4, сетевые и широковещательные адреса всегда исключаются. Для подсетей, которые содержат менее 4 IP-адресов, / 31 и / 32 сообщают в соответствии с RFC 3021
RFC 3021 гласит:
В двухточечной связи с
31-битная маска подсети, два указанных выше адреса ДОЛЖНЫ интерпретироваться как
адреса хоста.
Итак, оба ip-адреса с маской 255.255.255.254
сообщаются:
In []:
mask = '255.255.255.254'
list(IPNetwork('/'.join([ip_addr, mask])).iter_hosts())
Out[]:
[IPAddress('2.2.2.2'), IPAddress('2.2.2.3')]