Нужно сломать IP-подсеть

Я пытаюсь написать скрипт, который разбивает подсети больше (не больше /16), чем / 24 в / 24 подсети. Например: 10.10.10.0/23 должны дать мне 10.10.10.0/24 и 10.10.11.0/24

Моя логика состоит в том, чтобы сначала найти маску CIDR. если меньше 24, то вычтите это из 24, и это число (скажем, х) даст общее число / 24 с, а затем от 1 до третьего октета IP x раз и / 24.

например: 10.10.8.0/22

if 22 < 24 
x = 24-22 = 2
total # of /24s = 2^x = 4
So output :
10.10.8.0/24
10.10.9.0/24 
10.10.10.0/24
10.10.11.0/24

Я не уверен, как закодировать / изменить строку только для третьего октета и добавить 1 только к третьему октету.

Я думаю о создании списка всех значений третьего октета и перестройке IP-адресов. Но если есть более простой выход, это мне очень поможет!

Спасибо!

2 ответа

Решение

Посмотрите на пакет netaddr. Он уже поставляется со встроенной поддержкой понимания масок сети и может генерировать список подсетей любой желаемой длины:

>>> n = netaddr.IPNetwork('10.10.8.0/22')
>>> list(n.subnet(24))
[IPNetwork('10.10.8.0/24'), IPNetwork('10.10.9.0/24'), IPNetwork('10.10.10.0/24'), IPNetwork('10.10.11.0/24')]
>>> [str(sn) for sn in n.subnet(24)]
['10.10.8.0/24', '10.10.9.0/24', '10.10.10.0/24', '10.10.11.0/24']

Начиная с Python 3.3, эта функциональность также доступна в новой встроенной ipaddress модуль.

Если вы используете Python 3.3 или новее, вы можете использовать ipaddress модуль. С использованием subnets Метод, вы можете сделать это в одну строку:

>>> list(ipaddress.ip_network('10.10.8.0/22').subnets(new_prefix=24))
[IPv4Network('10.10.8.0/24'), IPv4Network('10.10.9.0/24'), IPv4Network('10.10.10.0/24'), IPv4Network('10.10.11.0/24')]

Преобразование в строки тривиально. Просто приведите к str,

Другие вопросы по тегам