Все ip в диапазоне подсети-маски - PullRequest
0 голосов
/ 30 марта 2019

Я знаю, как получить все IP в диапазоне

from netaddr import iter_iprange
generator = iter_iprange('192.168.1.1', '192.168.255.255', step=1)

Что мне нужно, так это получить все IP-адреса, которые исправляются в маске подсети с некоторым IP.

Например, я получаю Ip 2.2.2.2 и маску 255: 255: 255: 0, поэтому мне нужно получить 255 IP-адресов 2.2.2.2 - 2.2.2.255, но если маска подсети 255.255.255.254 I, то нет IP, который исправляет к этому

Как я могу получить это в Python?

1 Ответ

0 голосов
/ 31 марта 2019

Вы можете использовать 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')]
...