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

iPaddress – Интернет-адреса

Автор оригинала: 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

Смотрите также