Сообщить об ошибке.

Объекты IPv4Network() и IPv6Network() модуля ipaddress в Python

Создание и использование IPv4 и IPv6 объектов сетей

Объекты IPv4Network и IPv6Network предоставляют механизм для определения и проверки определений IP-сети. Определение сети состоит из маски и сетевого адреса и, как таковое, определяет диапазон IP-адресов. Например, определение сети с маской '255.255.255.0' и сетевым адресом '192.168.1.0' состоит из IP-адресов в диапазоне от 192.168.1.0 до 192.168.1.255.

Существует несколько эквивалентных способов задания масок IP-сети. Префикс /nbits - это обозначение, которое обозначает, сколько старших битов установлено в сетевой маске. Сетевая маска - это IP-адрес с некоторым количеством установленных старших битов. Таким образом, префикс /24 эквивалентен сетевой маске 255.255.255.0 в IPv4 или ffff:ff00:: в IPv6. Кроме того, маска хоста является логической инверсией сетевой маски и иногда используется (например, в списках управления доступом Cisco) для обозначения сетевой маски. Маска хоста, эквивалентная /24 в IPv4 - 0.0.0.255.

Сетевые объекты хешируются, поэтому их можно использовать в качестве ключей в словарях.

Синтаксис:

import ipaddress

# для IP4-сети
ipAddr = ipaddress.IPv4Network(address, strict=True)

# для IP6-сети
ipAddr = ipaddress.IPv6Network(address, strict=True)

Параметры:

  • address - определение IP-сети,
  • strict=True - как обрабатывать биты узла.

Возвращаемое значение:

Описание:

ipaddress.IPv4Network:

Класс ipaddress.IPv4Network() создает определение IPv4 сети.

Аргумент address может быть:

  1. Строка, состоящая из IP-адреса и необязательной маски, разделенных косой чертой '/'. IP-адрес - это сетевой адрес, а маска может быть либо одним числом, что означает префикс, либо строковым представлением IPv4-адреса. В последнем случае маска интерпретируется как маска сети, если она начинается с ненулевого поля, или как маска хоста, если она начинается с нулевого поля, за единственным исключением полностью нулевой маски, которая рассматривается как чистая маска. Если маска не указана, то считается, что она равна /32.

    Например, следующие спецификации адреса эквивалентны: '192.168.1.0/24', '192.168.1.0/255.255.255.0' и '192.168.1.0/0.0.0.255'.

  2. Целое число, умещающееся на 32 бита, что эквивалентно сети с одним адресом и маской /32.

  3. Целое число, упакованное в байтовый объект длиной 4, с прямым порядком байтов. Интерпретация аналогична целочисленному адресу.

  4. Парный кортеж, состоящий из описания адреса и сетевой маски, где описание адреса является либо строкой, 32-битным целым числом, 4-байтовым упакованным целым числом, либо существующим объектом IPv4Address. А маска сети - это либо целое число, представляющее длину префикса (например, 24), либо строка, представляющая маску префикса (например, 255.255.255.0).

Если не указано иное, то все сетевые методы, принимающие другие объекты сетей/адресов, будут вызывать исключение TypeError, если IP-версия аргумента несовместима с самим собой.

ipaddress.IPv6Network:

Класс ipaddress.IPv6Network() создает определение IPv4 сети.

Аргумент address может быть:

  1. Строка, состоящая из IP-адреса и необязательной длины префикса, разделенных косой чертой '/'. IP-адрес - это сетевой адрес, а длина префикса должна состоять из одного числа - префикса. Если длина префикса не указана, то считается, что она равна /128.

    Обратите внимание, что в настоящее время расширенные маски сети не поддерживаются. Это означает, что '2001:db00::0/24' является допустимым аргументом, а '2001:db00::0/ffff:ff00::' нет.

  2. Целое число, умещающееся на 128 бит, что эквивалентно сети с одним адресом и маской /128.

  3. Целое число, упакованное в байтовый объект длиной 16 с прямым порядком байтов. Интерпретация аналогична целочисленному адресу.

  4. Парный кортеж, состоящий из описания адреса и маски сети, где описание адреса является либо строкой, 128-битным целым числом, 16-байтовым упакованным целым числом, либо существующим объектом IPv6Address. Сетевая маска - это целое число, представляющее длину префикса.

Справедливо для обоих классов IPv4Network/IPv6Network

  • если адрес не является допустимым адресом IPv4/IPv6 соответственно, то возникает ошибка AddressValueError.
  • если маска недопустима для IPv4/IPv6 адреса соответственно, то возникает ошибка NetmaskValueError.

Если аргумент strict=True и в предоставленном адресе установлены биты узла, то возникает ошибка ValueError. В противном случае биты хоста маскируются для определения подходящего сетевого адреса.

Атрибуты и методы объектов IPv4Network/IPv6Network:

Все атрибуты, реализованные объектами IP-адресов, также реализуются объектами сети. Кроме того, объекты сетей реализуют дополнительные атрибуты. Все они являются общими для IPv4Network и IPv6Network.


network.version:

Атрибут network.version возвращает соответствующий номер версии протокола: 4 для IPv4, 6 для IPv6.

network.max_prefixlen:

Атрибут network.max_prefixlen возвращает общее количество бит в представлении сети для этой версии протокола: 32 для IPv4, 128 для IPv6.

network.is_multicast:

Атрибут network.is_multicast возвращает True для сети, которая зарезервирована для многоадресного использования.

Подробнее смотрите RFC 3171 (для IPv4) или RFC 2373 (для IPv6).

network.is_private:

Атрибут network.is_private возвращает True для сети, если она является частной.

Подробнее смотрите Iana-ipv4-special-registry (для IPv4) или iana-ipv6-special-registry (для IPv6).

network.is_unspecified:

Атрибут network.is_unspecified возвращает True для сети, если она является не уточненной.

Подробнее смотрите RFC 5735 (для IPv4) или RFC 2373 (для IPv6).

network.is_reserved:

Атрибут network.is_reserved возвращает True для сети, если она НЕ зарезервирована IETF.

network.is_loopback:

Атрибут network.is_loopback возвращает True для сети, которая используется как loopback.

Подробнее смотрите RFC 3330 (для IPv4) или RFC 2373 (для IPv6).

network.is_link_local:

Атрибут network.is_link_local возвращает True для сети в целом, если атрибуты верны как для сетевого адреса, так и для широковещательного адреса.

network.is_site_local:

Атрибут network.is_site_local только для IPv6-адресов возвращает True для сети в целом, если атрибуты верны как для сетевого адреса, так и для широковещательного адреса.

network.network_address:

Атрибут network.network_address возвращает сетевой адрес сети. Сетевой адрес и длина префикса вместе однозначно определяют сеть.

network.broadcast_address:

Атрибут network.broadcast_address возвращает широковещательный адрес сети. Пакеты, отправленные на широковещательный адрес, должны приниматься каждым хостом в сети.

network.hostmask:

Атрибут network.hostmask возвращает маску хоста в виде объекта IPv4Address/IPv6Address соответственно.

network.netmask:

Атрибут network.netmask возвращает сетевую маску в виде объекта IPv4Address/IPv6Address соответственно.

network.with_prefixlen:

Атрибут IPv4Network.with_prefixlen с возвращает строковое представление сети в десятичном формате с точками разделителями и маской в ​​префиксной записи, всегда совпадает с str(network) для адресов IPv4. Предоставление этого атрибута для IPv4Network упрощает написание кода, который может обрабатывать сети как IPv4, так и IPv6.

network.compressed:

Атрибут IPv4Network.compressed возвращает строковое представление сети в десятичном формате с точками разделителями и маской в ​​префиксной записи, всегда совпадает с str(network) для адресов IPv4. Предоставление этого атрибута для IPv4Network упрощает написание кода, который может обрабатывать сети как IPv4, так и IPv6.

Атрибут IPv6Network.compressed краткая форма представления IPv6-сети, в которой начальные нули в группах опущены, а самая длинная последовательность групп, полностью состоящая из нулей, свернута в одну пустую группу.

Это также значение, возвращаемое str(network) для адресов IPv6.

network.exploded:

Атрибут IPv4Network.exploded возвращает строковое представление сети в десятичном формате с точками разделителями и маской в ​​префиксной записи, всегда совпадает с str(network) для адресов IPv4. Предоставление этого атрибута для IPv4Network упрощает написание кода, который может обрабатывать адреса как IPv4, так и IPv6.

Атрибут IPv6Network.exploded представляет собой полную форму представления адреса со всеми ведущими нулями и группами.

network.with_netmask:

Атрибут network.with_netmask возвращает строковое представление сети с маской в нотации маски сети.

network.with_hostmask:

Атрибут network.with_hostmask возвращает строковое представление сети с маской в нотации маски хоста.

network.num_addresses:

Атрибут network.num_addresses возвращает общее количество адресов в сети.

network.prefixlen:

Атрибут network.prefixlen возвращает длину префикса сети в битах.

network.hosts():

Метод IPv4Network.hosts() возвращает итератор по используемым хостам в сети. Используемые хосты - это все IP-адреса, принадлежащие сети, за исключением самого сетевого адреса и широковещательного адреса сети. Для сетей с длиной маски 31 в результат также включаются сетевой адрес и сетевой широковещательный адрес. Сети с маской 32 вернут список, содержащий единственный адрес хоста.

>>> list(ip_network('192.0.2.0/29').hosts())  
# [IPv4Address('192.0.2.1'), IPv4Address('192.0.2.2'),
#  IPv4Address('192.0.2.3'), IPv4Address('192.0.2.4'),
# IPv4Address('192.0.2.5'), IPv4Address('192.0.2.6')]
>>> list(ip_network('192.0.2.0/31').hosts())
# [IPv4Address('192.0.2.0'), IPv4Address('192.0.2.1')]
>>> list(ip_network('192.0.2.1/32').hosts())
# [IPv4Address('192.0.2.1')]

Метод IPv6Network.hosts() возвращает итератор по используемым хостам в сети. К используемым хостам относятся все IP-адреса, принадлежащие сети, за исключением произвольного адреса подсети-маршрутизатора. Для сетей с длиной маски 127 в результат также включается произвольный адрес подсети-маршрутизатора. Сети с маской 128 вернут список, содержащий единственный адрес хоста.

network.overlaps(other):

Метод network.overlaps() возвращает True, если эта сеть частично или полностью содержится в другой или другая полностью содержится в этой сети.

network.address_exclude(network):

Метод network.address_exclude() вычисляет определения сети, полученные в результате удаления данной сети network из этой.

Возвращает итератор сетевых объектов. Если сеть network не полностью входит в эту сеть, то вызывает исключение ValueError.

>>> n1 = ip_network('192.0.2.0/28')
>>> n2 = ip_network('192.0.2.1/32')
>>> list(n1.address_exclude(n2))  
# [IPv4Network('192.0.2.8/29'), IPv4Network('192.0.2.4/30'),
#  IPv4Network('192.0.2.2/31'), IPv4Network('192.0.2.0/32')]

network.subnets(prefixlen_diff=1, new_prefix=None):

Метод network.subnets() возвращает подсети, которые присоединяются для создания текущего определения сети, в зависимости от значений аргументов.

  • Аргумент prefixlen_diff - это количество, на которое должна быть увеличена длина существующего префикса.
  • Аргумент new_prefix - желаемый новый префикс подсетей; он должен быть больше, чем существующий префикс.

Должен быть установлен один и только один из аргументов prefixlen_diff и new_prefix. Возвращает итератор объектов сети .

list(ip_network('192.0.2.0/24').subnets())
# [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
list(ip_network('192.0.2.0/24').subnets(prefixlen_diff=2))  
# [IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
#  IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
list(ip_network('192.0.2.0/24').subnets(new_prefix=26))  
# [IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
#  IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
list(ip_network('192.0.2.0/24').subnets(new_prefix=23))
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#     raise ValueError('new prefix must be longer')
# ValueError: new prefix must be longer
list(ip_network('192.0.2.0/24').subnets(new_prefix=25))
# [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]

network.supernet(prefixlen_diff=1, new_prefix=None):

Новое в Python 3.7.

Метод network.supernet() возвращает суперсеть, которая содержит определение этой сети, в зависимости от значений аргументов.

  • Аргумент prefixlen_diff - это величина, на которую должна быть уменьшена длина существующего префикса.
  • Аргумент new_prefix - желаемый новый префикс суперсети, который должен быть меньше существующего префикса.

Должен быть установлен один и только один из аргументов prefixlen_diff и new_prefix. Возвращает один объект сети .

>>> ip_network('192.0.2.0/24').supernet()
# IPv4Network('192.0.2.0/23')
>>> ip_network('192.0.2.0/24').supernet(prefixlen_diff=2)
# IPv4Network('192.0.0.0/22')
>>> ip_network('192.0.2.0/24').supernet(new_prefix=20)
# IPv4Network('192.0.0.0/20')

network.subnet_of(other):

Метод network.subnet_of() возвращает True, если сеть network является подсетью другой other.

>>> a = ip_network('192.168.1.0/24')
>>> b = ip_network('192.168.1.128/30')
>>> b.subnet_of(a)
True

network.supernet_of(other):

Метод network.supernet_of() возвращает True, если эта сеть является надсетью other. Другими словами, если сеть other, является частью сети network.

>>> a = ip_network('192.168.1.0/24')
>>> b = ip_network('192.168.1.128/30')
>>> a.supernet_of(b)
# True

network.compare_networks(other):

Метод network.compare_networks() сравнивает сеть network с другой other. В этом сравнении учитываются только сетевые адреса, а биты хоста - нет.

Метод возвращает -1, 0 или 1.

>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.2/32'))
# -1
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.0/32'))
# 1
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.1/32'))
# 0

Не рекомендуется, начиная с Python 3.7: метод использует тот же алгоритм упорядочивания и сравнения, что и <, == и >.


Операции, поддерживаемые объектами IPv4Network/IPv6Network.

Объекты сетей поддерживают некоторые операции. Если не указано иное, то операции, приведенные ниже могут применяться только между совместимыми объектами (например, IPv4 с IPv4, IPv6 с IPv6).

Операции сравнения объектов сети:

Объекты сетей можно сравнить с обычным набором операторов сравнения. Сетевые объекты упорядочиваются сначала по сетевому адресу, затем по сетевой маске.

Перечисление всех адресов сети.

По объектам сети можно итерироваться. Такое поведение можно использовать, чтобы перечислить все адреса, принадлежащие сети. При итерации, возвращаются все хосты, включая неиспользуемые (для используемых хостов используйте метод network.hosts()).

Пример:

>>> for addr in IPv4Network('192.0.2.0/28'):
...     addr
...
IPv4Address('192.0.2.0')
IPv4Address('192.0.2.1')
IPv4Address('192.0.2.2')
IPv4Address('192.0.2.3')
IPv4Address('192.0.2.4')
IPv4Address('192.0.2.5')
IPv4Address('192.0.2.6')
IPv4Address('192.0.2.7')
IPv4Address('192.0.2.8')
IPv4Address('192.0.2.9')
IPv4Address('192.0.2.10')
IPv4Address('192.0.2.11')
IPv4Address('192.0.2.12')
IPv4Address('192.0.2.13')
IPv4Address('192.0.2.14')
IPv4Address('192.0.2.15')

Объекты сетей могут работать как контейнеры IP-адресов.

Индексирование объекта сети:

>>> IPv4Network('192.0.2.0/28')[0]
# IPv4Address('192.0.2.0')
>>> IPv4Network('192.0.2.0/28')[15]
# IPv4Address('192.0.2.15')

Проверка наличия/вхождения IP-адреса в сеть:

>>> IPv4Address('192.0.2.6') in IPv4Network('192.0.2.0/28')
# True
>>> IPv4Address('192.0.3.6') in IPv4Network('192.0.2.0/28')
# False