Рубрики
Без рубрики

Модуль ipaddress в Python [ Простые примеры ]

Эй, ребята! Сегодня мы узнаем о модуле ipaddress в Python. Итак, без лишних слов, давайте начнем.

Автор оригинала: Pankaj Kumar.

Эй, ребята! Сегодня мы узнаем о модуле ipaddress в Python. Итак, без лишних слов, давайте начнем.

Что такое IP-адрес?

IP расшифровывается как интернет-протокол. Он используется для идентификации узла в любой сети. Поэтому любое устройство, которое подключается к Интернету, должно иметь IP-адрес.

Существует две версии IP-адресов: IPv4 и IPv6. В настоящее время используется IPv4, в то время как IPv6 внедряется крупными сетевыми провайдерами медленно из-за нехватки адресов IPv4 по сравнению с устройствами в сети.

Чтобы узнать больше об IP-адресах, посетите страницу Wiki здесь .

Как использовать модуль ipaddress в Python?

Давайте начнем с использования модуля ipaddress прямо сейчас. Чтобы задать адрес хоста, мы используем ip-адрес.ip_address( ) .

Эта функция автоматически определяет, какая версия будет использоваться на основе переданных значений. Он либо возвращает адрес IPv4, либо адрес IPv6.

1. Как создать действительный IPv4-адрес?

IPv4 проверяет значения в диапазоне от 0 до 255. Целое число, которое помещается в 32 бита, представляет октет в адресе. Целое число, упакованное в байтовый объект длиной 4.

import ipaddress
ipaddress.ip_address('199.138.0.1')

Выход:

IPv4Address('199.138.0.1')

2. Как создать действительный IPv6-адрес?

IPv6 проверяет значения в диапазоне от 0 до ffff. Целое число, которое укладывается в 128 бит. Целое число, упакованное в байтовый объект длиной 16.

import ipaddress
ipaddress.ip_address('2011:cb0::')
ipaddress.ip_address('FFFF:9999:2:FDE:257:0:2FAE:112D')

Выход:

IPv6Address('2011:cb0::')
IPv6Address('ffff:9999:2:fde:257:0:2fae:112d')

Работа с IP-адресами в Python с помощью модуля ipaddress

IP-адреса сопровождаются набором правил. Диапазонам IP-адресов назначаются различные функции.

Например, 127.0.0.1-это адрес обратной связи, назначенный сетевому модулю на вашем компьютере. Когда вы отправляете пинг-пакет на этот IP-адрес, вы, по сути, пингуете свой собственный компьютер.

1. Основные функции IP

Давайте посмотрим, как мы можем проверить, какие адреса являются петлевыми, многоадресными, локальными ссылками или зарезервированы с помощью модуля ipaddress в Python

import ipaddress

ipa = ipaddress.ip_address('199.138.0.1')
print(ipa.is_private) # Checks if address is private
print(ipa.is_global)  # Checks if address is global

#If address is a loopback address
print(ipaddress.ip_address("127.0.0.1").is_loopback) 

#If address is reserved for multiclass use
print(ipaddress.ip_address("229.100.0.23").is_multicast) 

#If address is reserved for link local usage
print(ipaddress.ip_address("169.254.0.100").is_link_local)

#True if the address is otherwise IETF reserved.
print(ipaddress.ip_address("240.10.0.1").is_reserved)

Выход:

False
True
True
True
True
True

2. Обратный поиск IP-адресов

Функция обратного указателя запрашивает DNS для разрешения IP-адреса, добавленного в качестве аргумента здесь. Если DNS сможет разрешить IP-адрес, вы получите вывод с назначенным именем.

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

ipaddress.ip_address("199.138.0.1").reverse_pointer

Выход:

'1.0.138.199.in-addr.arpa'

Сеть IPv4 и сеть IPv6 могут помочь нам определить и проверить определения IP-сетей.

Мы можем получить IP-сеть в требуемом формате без написания пользовательского кода.

  1. Префикс/ обозначает количество битов высокого порядка, установленных в сетевой маске.
  2. 2. Маска сети-это IP-адрес с набором битов высокого порядка.
  3. 3. Маска хоста является логической обратной маской netmask и используется в списке управления доступом Cisco.
ipn = ipaddress.ip_network("10.0.0.0/16")
print(ipn.with_prefixlen)
print(ipn.with_hostmask)
print(ipn.with_netmask)

Выход:

10.0.0.0/16
10.0.0.0/0.0.255.255
10.0.0.0/255.255.0.0

1. Проверьте, является ли IP-адрес IPv4 или IPv6

ip-адрес.функция ip_network( ) используется для возврата типа сети адреса. Он подтверждает, находится ли IP-адрес в сети IP4 или сети IP6.

import ipaddress
ipaddress.ip_network('199.138.0.1')
ipaddress.ip_network('FFFF:9999:2:FDE:257:0:2FAE:112D')

Выход:

IPv4Network('199.138.0.1/32')
IPv6Network('ffff:9999:2:fde:257:0:2fae:112d/128')

2. Идентификация хостов в IP-сети

Хосты-это все IP-адреса, принадлежащие сети, за исключением сетевого адреса и широковещательного адреса сети.

host( ) возвращает итератор по используемым хостам в сети.

Сети, длина маски которых равна 31, сетевой адрес и широковещательный адрес сети также включены в результат, а сети, длина маски которых равна 32, возвращают список возвращаемых адресов одного хоста.

ipn= ipaddress.ip_network('192.0.2.0/29')
list(ipn.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')]

3. Определение широковещательного адреса для сетей

С помощью broadcast_address мы можем запросить DNS-сервер ответить широковещательным адресом в сети.

ipn= ipaddress.ip_network('199.1.8.0/29')
ipn.broadcast_address

Выход:

IPv4Address('199.1.8.7')

4. Определение перекрытий IP-сетей

Эта функция говорит нам, что если сеть частично или полностью содержится в другой сети. Он возвращает либо true, либо false.

ipn1 = ipaddress.ip_network("10.10.1.32/29")
ipn2 = ipaddress.ip_network("10.10.1.32/27")
ipn3 = ipaddress.ip_network("10.10.1.48/29")
print(ipn1.overlaps(ipn2))
print(ipn1.overlaps(ipn3))
print(ipn3.overlaps(ipn2))

Выход:

True
False
True

5. Подсети в IP-сетях

Он возвращает итератор сетевых объектов. prefixlen_diff-это сумма длины префикса, которая должна быть увеличена, new_prefix-это новый префикс подсетей и больше нашего префикса.

ipn1 = ipaddress.ip_network("10.10.1.32/29")
print(list(ipn1.subnets()))
print(list(ipn1.subnets(prefixlen_diff=2)))
print(list(ipn1.subnets(new_prefix=30))) 

Выход:

[IPv4Network('10.10.1.32/30'), IPv4Network('10.10.1.36/30')]
[IPv4Network('10.10.1.32/31'), IPv4Network('10.10.1.34/31'), IPv4Network('10.10.1.36/31'), IPv4Network('10.10.1.38/31')]
[IPv4Network('10.10.1.32/30'), IPv4Network('10.10.1.36/30')]

6. Создание суперсетей с помощью модуля ipaddress

Суперсети – это комбинация одной или нескольких подсетей. Вы можете узнать больше о суперсетах здесь . С помощью метода supernet в модуле ipaddress можно создавать подсети, указывая необходимую информацию.

  • prefixlen_diff – это сумма, на которую должна быть увеличена длина нашего префикса
  • new_prefix – это желаемый новый префикс подсетей, который должен быть больше нашего префикса.
ipnn = ipaddress.ip_network("172.10.15.160/29")
print(ipnn.supernet(prefixlen_diff=3))
print(ipnn.supernet(new_prefix=20))

Выход:

172.10.15.128/26
172.10.0.0/20

7. Проверьте, является ли IP-сеть суперсетью/подсетью другой IP-сети

Возвращает true, если сеть является подсетью другого, если сеть является суперсетью другого. Возвращает либо true, либо false.

a = ipaddress.ip_network("192.168.1.0/24")
b = ipaddress.ip_network("192.168.1.128/30")

print(b.subnet_of(a))
print(a.supernet_of(b))

Выход:

True
True

8. Работа с объектами интерфейса IPv4

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

Интерфейс IPv4 наследует все атрибуты от адреса IPv4, поскольку интерфейс IPv4 является подклассом адреса IPv4.

Вот, 199.167.1.6 IP-адрес находится в сети 199.167.1.0/24

from ipaddress import IPv4Interface
ifc = IPv4Interface("199.167.1.6/24")
print(ifc.ip)
print(ifc.network)

Выход:

199.167.1.6
199.167.1.0/24

Мы можем представить сетевой интерфейс в префиксной нотации, как сетевую маску и как маску хоста.

interface = IPv4Interface('192.0.2.5/24')
print(interface.with_prefixlen)
print(interface.with_netmask)
print(interface.with_hostmask)

Выход:

192.0.2.5/24
192.0.2.5/255.255.255.0
192.0.2.5/0.0.0.255

Различные операции с IP-адресами

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

ipa1=ipaddress.ip_address("127.0.0.2")
ipa2=ipaddress.ip_address("127.0.0.1")
print(ipa1>ipa2)
print(ipa1==ipa2)
print(ipa1!=ipa2)

Выход:

True
False
True

Мы можем добавлять или вычитать целые числа из объектов IP-адресов.

ipa = ipaddress.ip_address("10.10.1.0")
print( ipa + 9)

Выход:

10.10.1.9

Адреса могут быть преобразованы в строки или целые числа с помощью встроенных функций ул( ) и int( ).

str(ipaddress.IPv4Address('199.138.0.1'))
int(ipaddress.IPv4Address('192.198.0.1'))

Выход:

'199.138.0.1'
3234201601

IPv6-адреса преобразуются в строки без идентификатора зоны.

str(ipaddress.IPv6Address('::8'))
int(ipaddress.IPv6Address('::100'))

Выход:

'::8'
256

Вывод

В этом уроке мы узнали об адресах IPv4 и IPv6, сети и интерфейсе. Для получения большего количества такого контента следите за обновлениями. Счастливого Обучения! 🙂

Рекомендации

Официальные документы модуля IPAddress