Если у меня есть начальный и конечный IP, как я могу найти подсеть? - PullRequest
0 голосов
/ 20 сентября 2018

Мне нужно заблокировать некоторые IP-адреса из некоторых стран, но мне дают только начальный IP-адрес и конечный IP-адрес, например:

11.22.33.44 - 11.22.35.200

Я хотел бы рассчитать подсеть, чтобы она была такой:

(not accurate)

11.22.33.44/14

Как определить подсеть по диапазону IP-адресов в Python?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018
  1. преобразование IP-адресов в длинную без знака
  2. xor для обоих адресов
  3. отсчет нулевых битов от начала - это длина вашего префикса
0 голосов
/ 20 сентября 2018

В последнее время я не тратил много времени на работу в сети, но вот как я думаю, вы можете сделать это наиболее эффективно.

Прежде всего, важно признать, что не все диапазоны IP-адресов могут быть представлены как одинподсети.Давайте рассмотрим общую подсеть, такую ​​как

192.168.0.0/24

. /24 указывает, что первые 24 бита 192.168.0.0 дают префикс сети, в данном случае 192.168.0, а остальные биты используются дляадресация хоста.Вы можете получить диапазон от 192.168.0.0 до 192.168.0.255.

ipcalc.Посмотрим, согласится ли он:

$ ipcalc 192.168.0.0 - 192.168.0.255
deaggregate 192.168.0.0 - 192.168.0.255
192.168.0.0/24

Пока все хорошо.Но что, если вы хотите исключить .0 или .255, который используется для трансляции?Нет ни одной подсети, которая представляет этот диапазон:

$ ipcalc 192.168.0.0 - 192.168.0.254
deaggregate 192.168.0.0 - 192.168.0.254
192.168.0.0/25
192.168.0.128/26
192.168.0.192/27
192.168.0.224/28
192.168.0.240/29
192.168.0.248/30
192.168.0.252/31
192.168.0.254/32

Подсети растут на степени два, и когда наш диапазон не вписывается в эту структуру чисто, мы в итоге получаем такие вещи.

В приведенном вами примере, кстати, нет отдельной подсети:

$ ipcalc 11.22.33.44 - 11.22.35.200
deaggregate 11.22.33.44 - 11.22.35.200
11.22.33.44/30
11.22.33.48/28
11.22.33.64/26
11.22.33.128/25
11.22.34.0/24
11.22.35.0/25
11.22.35.128/26
11.22.35.192/29
11.22.35.200/32

В Python есть модуль ipaddress.Давайте посмотрим, соответствует ли его summarize_address_range() функция с ipcalc (отформатировано для удобства чтения):

>>> import ipaddress

>>> list(ipaddress.summarize_address_range(
        ipaddress.IPv4Address('192.168.0.0'),
        ipaddress.IPv4Address('192.168.0.255')))

[IPv4Network('192.168.0.0/24')]

Пока все хорошо.Как насчет второго примера?

>>> list(ipaddress.summarize_address_range(
        ipaddress.IPv4Address('11.22.33.44'),
        ipaddress.IPv4Address('11.22.35.200')))

[IPv4Network('11.22.33.44/30'),
 IPv4Network('11.22.33.48/28'),
 IPv4Network('11.22.33.64/26'),
 IPv4Network('11.22.33.128/25'),
 IPv4Network('11.22.34.0/24'),
 IPv4Network('11.22.35.0/25'),
 IPv4Network('11.22.35.128/26'),
 IPv4Network('11.22.35.192/29'),
 IPv4Network('11.22.35.200/32')]

Похоже на совпадение.

...