Объекты 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 - как обрабатывать биты узла.IPv4Network/IPv6Network соответственно.ipaddress.IPv4Network:Класс ipaddress.IPv4Network() создает определение IPv4 сети.
Аргумент address может быть:
Строка, состоящая из 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'.
Целое число, умещающееся на 32 бита, что эквивалентно сети с одним адресом и маской /32.
Целое число, упакованное в байтовый объект длиной 4, с прямым порядком байтов. Интерпретация аналогична целочисленному адресу.
Парный кортеж, состоящий из описания адреса и сетевой маски, где описание адреса является либо строкой, 32-битным целым числом, 4-байтовым упакованным целым числом, либо существующим объектом IPv4Address. А маска сети - это либо целое число, представляющее длину префикса (например, 24), либо строка, представляющая маску префикса (например, 255.255.255.0).
Если не указано иное, то все сетевые методы, принимающие другие объекты сетей/адресов, будут вызывать исключение TypeError, если IP-версия аргумента несовместима с самим собой.
ipaddress.IPv6Network:Класс ipaddress.IPv6Network() создает определение IPv4 сети.
Аргумент address может быть:
Строка, состоящая из IP-адреса и необязательной длины префикса, разделенных косой чертой '/'. IP-адрес - это сетевой адрес, а длина префикса должна состоять из одного числа - префикса. Если длина префикса не указана, то считается, что она равна /128.
Обратите внимание, что в настоящее время расширенные маски сети не поддерживаются. Это означает, что '2001:db00::0/24' является допустимым аргументом, а '2001:db00::0/ffff:ff00::' нет.
Целое число, умещающееся на 128 бит, что эквивалентно сети с одним адресом и маской /128.
Целое число, упакованное в байтовый объект длиной 16 с прямым порядком байтов. Интерпретация аналогична целочисленному адресу.
Парный кортеж, состоящий из описания адреса и маски сети, где описание адреса является либо строкой, 128-битным целым числом, 16-байтовым упакованным целым числом, либо существующим объектом IPv6Address. Сетевая маска - это целое число, представляющее длину префикса.
Справедливо для обоих классов IPv4Network/IPv6Network
AddressValueError.NetmaskValueError.Если аргумент strict=True и в предоставленном адресе установлены биты узла, то возникает ошибка ValueError. В противном случае биты хоста маскируются для определения подходящего сетевого адреса.
IPv4Network/IPv6Network:Все атрибуты, реализованные объектами IP-адресов, также реализуются объектами сети. Кроме того, объекты сетей реализуют дополнительные атрибуты. Все они являются общими для IPv4Network и IPv6Network.
network.version версии протокола,network.max_prefixlen количество бит в сети,network.is_multicast сеть для многоадресного использования,network.is_private сеть является частной,network.is_unspecified сеть является не уточненной,network.is_reserved сеть НЕ зарезервирована IETF,network.is_loopback сеть используется как loopback,network.is_link_local Атрибут,network.is_site_local Атрибут,network.network_address сетевой адрес сети,network.broadcast_address широковещательный адрес сети,network.hostmask маска хоста,network.netmask маска сети,network.compressed краткое представления сети,network.exploded расширенное представления сети,network.with_prefixlen представление сети с маской в виде префикса,network.with_netmask представление сети с маской в виде маски сети,network.with_hostmask представление сети с маской в виде маски хоста,network.num_addresses общее количество адресов в сети,network.prefixlen длина префикса сети в битах,network.hosts() итератор по используемым хостам в сети,network.overlaps() сеть частично или полностью содержится в другой сети,network.address_exclude() новая сеть, полученная при вычитании сети,network.subnets() подсети, которые можно сложить для получения текущей сети,network.supernet() суперсеть, которая содержит определение этой сети,network.subnet_of() вхождение network в другую сеть,network.supernet_of() network является надсетью другой сети,network.compare_networks() сравнение ситей,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')
>>> 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