Нужно сломать 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
,