Вычислить, к каким подсетям принадлежит IP-адрес

python #sql #ip #subnet

#python #sql #ip #подсеть

Вопрос:

Я как бы застрял в конкретной проблеме. Мне нужно вычислить подсети, к которым принадлежит IP-адрес. Это может быть сделано в SQL или Python или аналогично.

Итак, если у меня есть, например, 100.100.100.105, мне нужно получить все подсети:

 100.100.100.105/32
100.100.100.104/31
100.100.100.104/30
100.100.100.104/29
100.100.100.96/28
100.100.100.96/27
100.100.100.64/26
...
100.64.0.0/10
100.0.0.0/9
...
64.0.0.0/2
0.0.0.0/1
 

Но на самом деле не знаю, как подойти к проблеме.

Комментарии:

1. Не очень понятно, чего вы хотите достичь. если ваш ввод представляет собой строку (?) "100.100.100.105" , вы хотите вернуть все строки, которые выглядят как ["100.100.100.105/32", "100.100.100.105/21", etc...] ?

2. Также укажите ожидаемый результат.

3. Извините, длинные списки подсетей, перечисленных в вопросе, — это результат, который я хочу. Таким образом, список всех подсетей, в которых находится один IP-адрес, начиная с /32 /31 и далее.

4. github.com/SinaKzlca/IPRangeAnalyzer проверьте это, может быть, вы нашли какие-то полезные вещи

Ответ №1:

вы можете достичь этого с помощью встроенного ipaddress модуля python3

 import ipaddress
addresses = []
# get the int representation of your ip
ip = int(ipaddress.IPv4Address('100.100.100.105'))

for mask in range(32):
    addresses.append(f'{ipaddress.IPv4Address(ip amp; ((2**32-1)-(2**mask -1)))}/{32-mask }')
 

На каждой итерации мы применяем маску к нашему IP, выполняя логику И операции между целочисленными представлениями IP и маски. Затем мы преобразуем результат в октеты ip и добавляем обозначение подсети ‘/ 24’. Вы можете заменить 2**32-1 на 4294967295 , я оставил его там, чтобы было понятнее, что происходит.