Содержание
Краткая памятка по работе с IP-адресами и сетями в Python
- Импортируйте модуль: from ipaddress import *.
- Создайте объект сети: net = IPv4Network(‘192.168.1.0/24’).
- Получите список всех IP-адресов: all_ips = list(net).
- Получите только адреса хостов: hosts = list(net.hosts()).
- Проверьте принадлежность адреса: ‘192.168.1.10’ in net.
- Получите маску подсети: net.netmask.
- Получите широковещательный адрес: net.broadcast_address.
- Преобразуйте IP в число: int(IPv4Address(‘10.0.0.1’)).
- Разделите сеть на подсети: list(net.subnets()).
- Проверьте тип сети: net.is_private, net.is_reserved.
- Сравните две сети: net1.compare_networks(net2).
- Используйте фабричные функции: ip_address(), ip_network(), ip_interface().
Создания и работа с IPv4 и IPv6 адресами, сетями и интерфейсами
Модуль ipaddress предоставляет возможности для создания, управления и работы с адресами и сетями IPv4 и IPv6.
Функции и классы в этом модуле упрощают выполнение различных задач, связанных с IP-адресами, включая проверку того, находятся ли два хоста в одной подсети, итерацию по всем хостам в определенной подсети, проверку того, представляет ли строка действительный IP-адрес или определение сети и т. д.
Определение IP-адресов.
Адреса, часто называемые «адресами хостов», являются основной единицей при работе с IP-адресацией. Самый простой способ создания адресов — использовать фабричную функцию ipaddress.ip_address(), которая автоматически определяет, следует ли создавать адрес IPv4 или IPv6 на основе переданного значения:
Адреса также можно создавать непосредственно из целых чисел. Предполагается, что значения, которые соответствуют 32 битам, являются адресами IPv4:
Чтобы принудительно использовать адреса IPv4 или IPv6, соответствующие классы могут быть вызваны напрямую. Такое поведение полезно для принудительного создания адресов IPv6 для небольших целых чисел:
Определение IP-сетей.
Адреса хостов обычно группируются в IP-сети, поэтому модуль ipaddress позволяет создавать, проверять и управлять определениями сети. Сетевые объекты IP состоят из строк, которые определяют диапазон адресов хостов, которые являются частью этой сети. Простейшей формой этой информации является пара «сетевой адрес/сетевой префикс», где префикс определяет количество ведущих битов, которые сравниваются, чтобы определить, является ли адрес частью сети, а сетевой адрес определяет ожидаемое значение этих бит.
Что касается адресов, предусмотрена фабричная функция, которая автоматически определяет правильную версию IP:
Объекты IP-сети не могут иметь никаких битов хоста. На практике это означает, что запись 192.0.2.1/24 не описывает сеть. Такие определения называются объектами сетевых интерфейсов, поскольку нотация ip-on-a-network обычно используется для описания сетевых интерфейсов компьютера в данной сети.
По умолчанию попытка создать сетевой объект с установленными битами хоста приведет к возникновению ValueError. Чтобы запросить приведение дополнительных битов к нулю, в конструктор необходимо передать флаг strict=False:
Как и в случае с адресами, определенный тип сети может быть принудительно создан прямым вызовом конструктора класса вместо использования фабричной функции.
Определение IP-интерфейса.
Если нужно описать адрес в конкретной сети, ни объекта адреса, ни объекта сети недостаточно. Обозначение типа 192.0.2.1/24, используется сетевыми инженерами для определения правил маршрутизаторов и расшифровывается как «хост 192.0.2.1 в сети 192.0.2.0/24». Соответственно, модуль ipaddress предоставляет набор гибридных классов, которые связывают адрес с определенной сетью. Интерфейс для создания идентичен интерфейсу для определения объектов сети, за исключением того, что часть адреса не ограничивается объектом сетевого адреса.
Для создания интерфейса могут использоваться целочисленные входные данные (как в случае с сетями), так же создание определенного типа интерфейса хоста может быть создано прямым вызовом конструктора соответствующего класса
ipaddress.ip_address#
In: import ipaddress In: ipv4 = ipaddress.ip_address(‘10.0.1.1’) In: ipv4 Out[3]: IPv4Address(‘10.0.1.1’) In: print(ipv4) 10.0.1.1
In: ipv4. ipv4.is_loopback ipv4.is_unspecified ipv4.is_multicast ipv4.max_prefixlen ipv4.is_global ipv4.is_private ipv4.is_link_local ipv4.is_reserved ipv4.reverse_pointer
In: ipv4.is_loopback Out[6]: False In: ipv4.is_multicast Out[7]: False In: ipv4.is_reserved Out[8]: False In: ipv4.is_private Out[9]: True
In: ip1 = ipaddress.ip_address(‘10.0.1.1’) In: ip2 = ipaddress.ip_address(‘10.0.2.1’) In: ip1 > ip2 Out[12]: False In: ip2 > ip1 Out[13]: True In: ip1 == ip2 Out[14]: False In: ip1!= ip2 Out[15]: True In: str(ip1) Out[16]: ‘10.0.1.1’ In: int(ip1) Out[17]: 167772417 In: ip1 + 5 Out[18]: IPv4Address(‘10.0.1.6’) In: ip1 — 5 Out[19]: IPv4Address(‘10.0.0.252’)
Удобные функции фабрики¶
ipaddress
Модуль предоставляет функции фабрики для удобного создания IP- адресов, сетей и интерфейсов:
IPv4Address IPv6Address ValueError
Возвращает объект или в зависимости от IP-адреса, переданного в качестве аргумента. Могут быть указаны либо IPv4, либо IPv6 адреса; целые числа меньше 2**32 будут считаться IPv4 по умолчанию. Поднимается, если address не является допустимым адресом IPv4 или IPv6.
IPv4Network IPv6Network IPv4Network IPv6Network ValueError
Возвращает объект или в зависимости от IP-адреса, переданного в качестве аргумента. address является строкой или целым числом, представляющим IP-сеть. Могут поставляться либо сети IPv4, либо сети IPv6; целые числа меньше 2**32 по умолчанию будет считаться IPv4. strict передаются конструктору или. Поднимается, если address не является допустимым адресом IPv4 или IPv6 или если в сети установлены биты узла.
IPv4Interface IPv6Interface ValueError
Возвращает объект или в зависимости от IP-адреса, переданного в качестве аргумента. address является строкой или целым числом, представляющим IP-адрес. Могут быть указаны либо IPv4, либо IPv6 адреса; целые числа меньше 2**32 будут считаться IPv4 по умолчанию. Поднимается, если address не является допустимым адресом IPv4 или IPv6.
Одним из недостатков этих удобных функций является то, что необходимость обработки как IPv4, так и IPv6 форматов означает, что сообщения об ошибках предоставляют минимальную информацию о точной ошибке, так как функции не знают, был ли предназначен формат IPv4 или IPv6. Более подробные отчеты об ошибках можно получить, непосредственно вызвав соответствующие конструкторы классов, зависящие от версии.
Операции с объектами IP-адреса, сети и интерфейса.
И так, есть объект IPv(4/6) IP-адреса, сети или интерфейса, и вероятно, необходимо получить информацию о нем. Модуль ipaddress делает это простым и интуитивно понятным.
Получение сетевой маски (т. е. установки битов, соответствующих префиксу сети) или маски хоста (любых битов, не являющихся частью сетевой маски):
>>> net4 = ipaddress.ip_network(‘192.0.2.0/24’) >>> # IPv4Address(‘255.255.255.0’) >>> # IPv4Address(‘0.0.0.255’) >>> net6 = ipaddress.ip_network(‘2001:db8::0/96’) >>> # IPv6Address(‘ffff:ffff:ffff:ffff:ffff:ffff::’) >>> # IPv6Address(‘::ffff:ffff’)
Хотя IPv4 не поддерживает расширение или сжатие, связанные объекты по-прежнему предоставляют соответствующие свойства, поэтому нейтральный по версии код может легко гарантировать, что для адресов IPv6 используется наиболее краткая или самая подробная форма, при этом адреса IPv4, так же обрабатывая правильно.
Объект сети как список IP-адресов.
Полезное свойство модуля, это предоставление объекта сети как списка адресов. Это означает, что их можно индексировать следующим образом:
>>> net4 = ipaddress.ip_network(‘192.0.2.0/24’) >>> net4[1] # IPv4Address(‘192.0.2.1’) >>> net4[-1] # IPv4Address(‘192.0.2.255’) >>> net6 = ipaddress.ip_network(‘2001:db8::0/96’) >>> net6[1] # IPv6Address(‘2001:db8::1’) >>> net6[-1] # IPv6Address(‘2001:db8::ffff:ffff’)
Сравнение IP-адресов.
Модуль ipaddress предоставляет несколько простых, интуитивно понятных способов сравнения объектов, где это имеет смысл:
Если производится попытка сравнить объекты разных версий или разных типов, то возникает исключение TypeError.
Преобразование объекта IP-адреса в строку и число.
Другие модули, использующие IP-адреса (например, socket), обычно не принимают объекты IP-адреса напрямую. Следовательно они должны быть приведены к целому числу или строке, которые примет другой модуль:
Информация при сбое создания экземпляра.
При создании объектов адреса, сети или интерфейса с использованием фабричных функций, не зависящих от версии протокола, любые ошибки будут генерировать исключение ValueError с общим сообщением об ошибке (переданное значение не было распознано как объект этого типа).
Конструкторы классов, имеющих в названии конкретный протокол, при ошибках создания объекта вызывают исключения и и точно указывают, какую часть определения не удалось правильно проанализировать
Сообщения об ошибках значительно более детализированы при прямом использовании конструкторов классов. Например:
>>> ipaddress.ip_address(«192.168.0.256») # Traceback (most recent call last): #… # ValueError: ‘192.168.0.256’ does not appear to be an IPv4 or IPv6 address >>> ipaddress.IPv4Address(«192.168.0.256») # Traceback (most recent call last): #… #: Octet 256 (> 255) not permitted in ‘192.168.0.256’ >>> ipaddress.ip_network(«192.168.0.1/64») # Traceback (most recent call last): #… # ValueError: ‘192.168.0.1/64′ does not appear to be an IPv4 or IPv6 network >>> ipaddress.IPv4Network(«192.168.0.1/64») # Traceback (most recent call last): #… #: ’64’ is not a valid netmask
Оба специфичных для модуля исключения имеют ValueError в качестве родительского класса, поэтому, если не беспокоит конкретный тип ошибки, все равно можно написать код, подобный следующему:
try: network = ipaddress.IPv4Network(address) except ValueError: print(‘address/netmask is invalid for IPv4:’, address)
Создание и использование 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)
ipaddress.IPv4Network:
- Строка, состоящая из 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).
Строка, состоящая из 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:
- Строка, состоящая из IP-адреса и необязательной длины префикса, разделенных косой чертой ‘/’. IP-адрес — это сетевой адрес, а длина префикса должна состоять из одного числа — префикса. Если длина префикса не указана, то считается, что она равна /128.Обратите внимание, что в настоящее время расширенные маски сети не поддерживаются. Это означает, что ‘2001:db00::0/24’ является допустимым аргументом, а ‘2001:db00::0/ffff:ff00::’ нет.
- Целое число, умещающееся на 128 бит, что эквивалентно сети с одним адресом и маской /128.
- Целое число, упакованное в байтовый объект длиной 16 с прямым порядком байтов. Интерпретация аналогична целочисленному адресу.
- Парный кортеж, состоящий из описания адреса и маски сети, где описание адреса является либо строкой, 128-битным целым числом, 16-байтовым упакованным целым числом, либо существующим объектом IPv6Address. Сетевая маска — это целое число, представляющее длину префикса.
Строка, состоящая из IP-адреса и необязательной длины префикса, разделенных косой чертой ‘/’. IP-адрес — это сетевой адрес, а длина префикса должна состоять из одного числа — префикса. Если длина префикса не указана, то считается, что она равна /128.
Обратите внимание, что в настоящее время расширенные маски сети не поддерживаются. Это означает, что ‘2001:db00::0/24’ является допустимым аргументом, а ‘2001:db00::0/ffff:ff00::’ нет.
Целое число, умещающееся на 128 бит, что эквивалентно сети с одним адресом и маской /128.
Целое число, упакованное в байтовый объект длиной 16 с прямым порядком байтов. Интерпретация аналогична целочисленному адресу.
Парный кортеж, состоящий из описания адреса и маски сети, где описание адреса является либо строкой, 128-битным целым числом, 16-байтовым упакованным целым числом, либо существующим объектом IPv6Address. Сетевая маска — это целое число, представляющее длину префикса.
- если адрес не является допустимым адресом IPv4/IPv6 соответственно, то возникает ошибка AddressValueError.
- если маска недопустима для IPv4/IPv6 адреса соответственно, то возникает ошибка NetmaskValueError.
Если аргумент strict=True и в предоставленном адресе установлены биты узла, то возникает ошибка ValueError. В противном случае биты хоста маскируются для определения подходящего сетевого адреса.
Атрибуты и методы объектов IPv4Network/IPv6Network:
Все атрибуты, реализованные объектами IP-адресов, также реализуются объектами сети. Кроме того, объекты сетей реализуют дополнительные атрибуты. Все они являются общими для IPv4Network и IPv6Network.
network.is_private:
Атрибут network.is_private возвращает True для сети, если она является частной.
Подробнее смотрите Iana-ipv4-special-registry (для IPv4) или iana-ipv6-special-registry (для IPv6).
network.is_unspecified:
Атрибут network.is_unspecified возвращает True для сети, если она является не уточненной.
network.is_reserved:
Атрибут network.is_reserved возвращает True для сети, если она НЕ зарезервирована IETF.
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.with_prefixlen:
Атрибут IPv4Network.with_prefixlen с возвращает строковое представление сети в десятичном формате с точками разделителями и маской в префиксной записи, всегда совпадает с str(network) для адресов IPv4. Предоставление этого атрибута для IPv4Network упрощает написание кода, который может обрабатывать сети как IPv4, так и IPv6.
network.with_netmask:
Атрибут network.with_netmask возвращает строковое представление сети с маской в нотации маски сети.
network.with_hostmask:
Атрибут network.with_hostmask возвращает строковое представление сети с маской в нотации маски хоста.
network.address_exclude(network):
Метод network.address_exclude() вычисляет определения сети, полученные в результате удаления данной сети network из этой.
>>> 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.compare_networks(other):
Метод network.compare_networks() сравнивает сеть network с другой other. В этом сравнении учитываются только сетевые адреса, а биты хоста — нет.
>>> 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).
Операции сравнения объектов сети:
Объекты сетей можно сравнить с обычным набором операторов сравнения. Сетевые объекты упорядочиваются сначала по сетевому адресу, затем по сетевой маске.
Перечисление всех адресов сети.
По объектам сети можно итерироваться. Такое поведение можно использовать, чтобы перечислить все адреса, принадлежащие сети. При итерации, возвращаются все хосты, включая неиспользуемые (для используемых хостов используйте метод ()).
>>> 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-адресов в сети с помощью Python
Вопрос: Как получить список всех IP-адресов в сети с помощью Python?
Ответ: Используйте модуль ipaddress. Создайте объект сети (например, IPv4Network(‘192.168.1.0/24’)) и преобразуйте его в список: list(network.hosts()).
Вопрос: Как получить только IP-адреса хостов, исключая адрес сети и широковещательный адрес?
Ответ: Используйте метод.hosts() объекта сети. Он возвращает итератор по всем адресам хостов, исключая сетевой и широковещательный.
Вопрос: Как перебрать все IP-адреса в сети в цикле?
Ответ: Используйте цикл for: for ip in IPv4Network(‘10.0.0.0/28’): print(ip).
Вопрос: Как проверить, принадлежит ли IP-адрес определенной сети?
Ответ: Используйте оператор in: IPv4Address(‘192.168.1.5’) in IPv4Network(‘192.168.1.0/24’).
Вопрос: Как получить маску подсети для сети?
Ответ: Используйте атрибут.netmask объекта сети: network.netmask.
Вопрос: Как преобразовать IP-адрес в целое число?
Ответ: Используйте int(IPv4Address(‘192.168.1.1’)).
Вопрос: Как создать сеть из строки с префиксом?
Ответ: Передайте строку в конструктор: IPv4Network(‘10.0.0.0/8’).
Вопрос: Как получить широковещательный адрес сети?
Ответ: Используйте атрибут.broadcast_address объекта сети.
Вопрос: Как разделить сеть на подсети?
Ответ: Используйте метод.subnets() объекта сети: list(network.subnets(prefixlen_diff=2)).
Вопрос: Как определить, является ли сеть частной?
Ответ: Используйте атрибут.is_private: network.is_private.























