Автор оригинала: Doug Hellmann.
Цель:
Классы для работы с интернет-протоколом (IP) адреса.
Модуль IPADDRESS
включает в себя классы для работы с сетевыми адресами IPv4 и IPv6. Классы поддерживают проверку, нахождение адресов и хостов в сети и другие общие операции.
Адреса
Самый базовый объект представляет собой самому адресу сети. Передайте строку, целочисленное или байтовую последовательность в IP_ADDRESS ()
, чтобы построить адрес. Возвращаемое значение будет <код> IPv4Address или <код> IPv6Address , в зависимости от типа используемого адреса.
ipaddress_addresses.py
import binascii import ipaddress ADDRESSES [ '10.9.0.6', 'fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa', ] for ip in ADDRESSES: addr ipaddress.ip_address(ip) print('{!r}'.format(addr)) print(' IP version:', addr.version) print(' is private:', addr.is_private) print(' packed form:', binascii.hexlify(addr.packed)) print(' integer:', int(addr)) print()
Оба класса могут предоставлять различные представления адреса в различных целях, а также отвечать на базовые утверждения, такие как адрес, зарезервирован ли адрес для многоадресной связи или если оно находится в частной сети.
$ python3 ipaddress_addresses.py IPv4Address('10.9.0.6') IP version: 4 is private: True packed form: b'0a090006' integer: 168361990 IPv6Address('fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa') IP version: 6 is private: True packed form: b'fdfd87b5b4755e3eb1bce121a8eb14aa' integer: 337611086560236126439725644408160982186
Сеть
Сеть определяется диапазоном адресов. Обычно он экспрессируется с базовым адресом и маской, указывающей, какие части адреса представляют собой сеть, и какие порции остаются для представления адресов в этой сети. Маска может быть выражена явно или используя значение длины префикса, как в примере ниже.
ipaddress_networks.py
import ipaddress NETWORKS [ '10.9.0.0/24', 'fdfd:87b5:b475:5e3e::/64', ] for n in NETWORKS: net ipaddress.ip_network(n) print('{!r}'.format(net)) print(' is private:', net.is_private) print(' broadcast:', net.broadcast_address) print(' compressed:', net.compressed) print(' with netmask:', net.with_netmask) print(' with hostmask:', net.with_hostmask) print(' num addresses:', net.num_addresses) print()
Как и в случае с адресами, есть два сетевых сетевых класса для IPv4 и IPv6. Каждый класс предоставляет свойства или методы доступа к значениям, связанным с сетью, такими как адрес широковещательного вещания, и адреса в сети, доступных для используемых хостов.
$ python3 ipaddress_networks.py IPv4Network('10.9.0.0/24') is private: True broadcast: 10.9.0.255 compressed: 10.9.0.0/24 with netmask: 10.9.0.0/255.255.255.0 with hostmask: 10.9.0.0/0.0.0.255 num addresses: 256 IPv6Network('fdfd:87b5:b475:5e3e::/64') is private: True broadcast: fdfd:87b5:b475:5e3e:ffff:ffff:ffff:ffff compressed: fdfd:87b5:b475:5e3e::/64 with netmask: fdfd:87b5:b475:5e3e::/ffff:ffff:ffff:ffff:: with hostmask: fdfd:87b5:b475:5e3e::/::ffff:ffff:ffff:ffff num addresses: 18446744073709551616
Сетевой экземпляр является итоги и дает адреса в сети.
ipaddress_network_iterate.py
import ipaddress NETWORKS [ '10.9.0.0/24', 'fdfd:87b5:b475:5e3e::/64', ] for n in NETWORKS: net ipaddress.ip_network(n) print('{!r}'.format(net)) for i, ip in zip(range(3), net): print(ip) print()
Этот пример печатает лишь несколько адресов, поскольку сеть IPv6 может содержать гораздо больше адресов, чем в соответствии с выходом.
$ python3 ipaddress_network_iterate.py IPv4Network('10.9.0.0/24') 10.9.0.0 10.9.0.1 10.9.0.2 IPv6Network('fdfd:87b5:b475:5e3e::/64') fdfd:87b5:b475:5e3e:: fdfd:87b5:b475:5e3e::1 fdfd:87b5:b475:5e3e::2
Итализация по сети дает адреса, но не все они действительны для хозяев. Например, базовый адрес сети и широковещательный адрес включены. Чтобы найти адреса, которые могут быть использованы обычными хостами в сети, используйте метод Hosts ()
, который создает генератор.
ipaddress_network_iterate_hosts.py
import ipaddress NETWORKS [ '10.9.0.0/24', 'fdfd:87b5:b475:5e3e::/64', ] for n in NETWORKS: net ipaddress.ip_network(n) print('{!r}'.format(net)) for i, ip in zip(range(3), net.hosts()): print(ip) print()
Сравнивая выход этого примера с предыдущим примером, показывает, что адреса хоста не включают в себя первые значения, полученные при итерации по всей сети.
$ python3 ipaddress_network_iterate_hosts.py IPv4Network('10.9.0.0/24') 10.9.0.1 10.9.0.2 10.9.0.3 IPv6Network('fdfd:87b5:b475:5e3e::/64') fdfd:87b5:b475:5e3e::1 fdfd:87b5:b475:5e3e::2 fdfd:87b5:b475:5e3e::3
В дополнение к протоколу итератору, сети поддерживают оператор в
, чтобы определить, является ли адрес частью сети.
ipaddress_network_membership.py
import ipaddress NETWORKS [ ipaddress.ip_network('10.9.0.0/24'), ipaddress.ip_network('fdfd:87b5:b475:5e3e::/64'), ] ADDRESSES [ ipaddress.ip_address('10.9.0.6'), ipaddress.ip_address('10.7.0.31'), ipaddress.ip_address( 'fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa' ), ipaddress.ip_address('fe80::3840:c439:b25e:63b0'), ] for ip in ADDRESSES: for net in NETWORKS: if ip in net: print('{}\nis on {}'.format(ip, net)) break else: print('{}\nis not on a known network'.format(ip)) print()
Реализация <Код> в использует сетевую маску для проверки адреса, поэтому он намного эффективнее, чем расширение полного списка адресов в сети.
$ python3 ipaddress_network_membership.py 10.9.0.6 is on 10.9.0.0/24 10.7.0.31 is not on a known network fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa is on fdfd:87b5:b475:5e3e::/64 fe80::3840:c439:b25e:63b0 is not on a known network
Интерфейсы
Сетевой интерфейс представляет собой определенный адрес в сети и может быть представлен адресом хоста и сетевой префиксом или NetMask.
ipaddress_interfaces.py
import ipaddress ADDRESSES [ '10.9.0.6/24', 'fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa/64', ] for ip in ADDRESSES: iface ipaddress.ip_interface(ip) print('{!r}'.format(iface)) print('network:\n ', iface.network) print('ip:\n ', iface.ip) print('IP with prefixlen:\n ', iface.with_prefixlen) print('netmask:\n ', iface.with_netmask) print('hostmask:\n ', iface.with_hostmask) print()
Объект интерфейса имеет свойства для доступа к полной сети и адресу отдельно, а также несколько различных способов выразить интерфейс и сетевую маску.
$ python3 ipaddress_interfaces.py IPv4Interface('10.9.0.6/24') network: 10.9.0.0/24 ip: 10.9.0.6 IP with prefixlen: 10.9.0.6/24 netmask: 10.9.0.6/255.255.255.0 hostmask: 10.9.0.6/0.0.0.255 IPv6Interface('fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa/64') network: fdfd:87b5:b475:5e3e::/64 ip: fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa IP with prefixlen: fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa/64 netmask: fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa/ffff:ffff:ffff:ffff:: hostmask: fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa/::ffff:ffff:ffff:ffff
Смотрите также
- Стандартная библиотечная документация для iPaddress
- PEP 3144 – библиотека манипулирования IP-адреса для стандартной библиотеки Python
- Введение в iPaddress модуль
- Wikipedia: IP-адрес – введение в IP-адреса и сети.
- Компьютерные сети (5-е издание) – Эндрю С. Таненбаум и Дэвид Дж. Wetherall. Опубликовано Pearson, 2010. ISBN-10: 0132126958