Андрей Грановский
Когда мы открываем сайт, подключаем телефон к Wi-Fi или настраиваем сервер, за этим почти всегда стоит одна и та же задача: устройство должно найти другое устройство в сети и передать ему данные. Для человека это выглядит просто: мы вводим имя сайта или нажимаем на ссылку. Но внутри сети используется сразу несколько видов адресов.
Представим обычную ситуацию: ноутбук подключён к домашнему роутеру, а пользователь
открывает сайт www.example.org. Сначала имя сайта нужно превратить
в IP-адрес. Потом компьютер должен понять, находится ли нужный адрес в той же
локальной сети или пакет надо отправить через роутер. И наконец, чтобы передать
данные хотя бы до ближайшего устройства, нужен адрес сетевого интерфейса в локальной
сети.
Поэтому в сетях используются адреса разных уровней. DNS-имя удобно человеку, IP-адрес нужен для маршрутизации между сетями, а MAC-адрес используется для доставки кадра внутри локального сегмента. Эти адреса не конкурируют друг с другом, они работают вместе.
| Тип адреса | Пример | Где используется | Для чего нужен |
|---|---|---|---|
| MAC-адрес | 00:1A:2B:3C:4D:5E |
Канальный уровень: Ethernet, Wi-Fi | Доставка кадра внутри одной локальной сети или одного канального сегмента |
| IPv4-адрес | 192.0.2.25 |
Сетевой уровень | Маршрутизация пакетов между IP-сетями |
| IPv6-адрес | 2001:db8:1::25 |
Сетевой уровень | Маршрутизация в современных IPv6-сетях |
| DNS-имя | www.example.org |
Прикладной уровень | Понятное имя, которое DNS преобразует в IP-адрес |
Важно различать адрес устройства и адрес интерфейса. В обычной речи говорят «IP-адрес компьютера», но строго говоря IP-адрес назначается сетевому интерфейсу. Если у сервера две сетевые карты или два сетевых подключения, у него может быть несколько IP-адресов. У одного интерфейса тоже может быть несколько адресов: например, IPv4-адрес, IPv6 link-local адрес и один или несколько глобальных IPv6-адресов.
MAC-адрес — это адрес сетевого интерфейса на канальном уровне. В Ethernet и Wi-Fi
обычно используется 48-битный адрес, который записывается шестью байтами в шестнадцатеричной
форме, например 00:1A:2B:3C:4D:5E.
MAC-адрес важен только в пределах локальной сети. Когда компьютер отправляет пакет другому компьютеру в той же сети, IP-пакет помещается в кадр Ethernet или Wi-Fi, а в заголовке кадра указывается MAC-адрес получателя. Если получатель находится за маршрутизатором, кадр отправляется не прямо конечному серверу, а ближайшему маршрутизатору — шлюзу по умолчанию.
Маршрутизатор при пересылке пакета не сохраняет исходные MAC-адреса. На каждом следующем участке пути IP-пакет заново упаковывается в кадр соответствующей технологии. Поэтому MAC-адрес не является глобальным адресом в Интернете: по нему нельзя маршрутизировать пакеты через множество сетей.
IPv4-адрес имеет длину 32 бита. Обычно он записывается в виде четырёх десятичных чисел от 0 до 255, разделённых точками:
192.0.2.25
Каждое число соответствует одному байту. Например, адрес 192.0.2.25
можно представить как четыре байта:
192 0 2 25
IP-адрес сам по себе ещё не говорит, какая часть адреса обозначает сеть, а какая — узел внутри этой сети. Для этого используется префикс, или маска сети.
Сам по себе IP-адрес показывает точку в адресном пространстве, но не объясняет, какие адреса находятся рядом с ним в одной сети. Для работы сети важно знать не только адрес узла, но и границы подсети.
Например, адрес 192.168.10.25 может принадлежать маленькой подсети,
где рядом с ним находятся только несколько адресов, а может быть частью большой
внутренней сети. Чтобы определить границы, вместе с адресом указывают префикс:
192.168.10.25/24, 192.168.10.25/25,
192.168.10.25/16 и так далее.
Префикс отвечает на простой вопрос: какая часть адреса обозначает сеть, а какая — конкретный интерфейс (узел) внутри этой сети.
В современных IP-сетях адресные блоки записываются в формате CIDR (Classless Inter-Domain Routing):
192.0.2.0/24
203.0.113.128/25
10.10.0.0/16
2001:db8:1234::/48
Число после косой черты показывает, сколько начальных битов адреса относится
к сетевой части. Например, запись 192.0.2.0/24 означает, что первые
24 бита задают сеть, а оставшиеся 8 битов могут использоваться для адресов
узлов внутри этой сети.
В IPv4 префикс /24 соответствует маске 255.255.255.0.
В такой сети всего 256 адресов: от 192.0.2.0 до
192.0.2.255. В обычной IPv4-подсети первый адрес используется как
адрес сети, последний — как широковещательный адрес, поэтому для узлов остаётся
254 адреса.
На практике начинающему администратору чаще всего встречаются несколько типичных
префиксов. Их не нужно заучивать как таблицу умножения, но полезно понимать порядок
размеров: /24 — небольшая локальная сеть, /32 — один
адрес, /16 — уже большой внутренний блок.
| Префикс | Маска IPv4 | Всего адресов | Обычное применение |
|---|---|---|---|
/32 |
255.255.255.255 |
1 | Один конкретный IPv4-адрес, хост-маршрут |
/31 |
255.255.255.254 |
2 | Соединения точка-точка между маршрутизаторами (RFC 3021) |
/30 |
255.255.255.252 |
4 | Небольшие служебные соединения, исторически — точка-точка |
/24 |
255.255.255.0 |
256 | Типичная небольшая локальная сеть |
/16 |
255.255.0.0 |
65 536 | Крупный внутренний адресный блок |
/8 |
255.0.0.0 |
16 777 216 | Очень крупный адресный блок |
Историческое деление IPv4-адресов на классы A, B и C сегодня не используется
как основа проектирования сетей. В современной практике важен именно префикс:
/24, /20, /16 и так далее. Такой подход
позволяет гибко делить адресное пространство и агрегировать маршруты.
Подробнее: RFC 4632: Classless Inter-domain Routing (CIDR).
Рассмотрим сеть:
192.0.2.0/24
В ней:
192.0.2.0 — адрес сети;192.0.2.1 — может быть адресом маршрутизатора;192.0.2.25 — может быть адресом компьютера или сервера;192.0.2.255 — широковещательный адрес этой подсети.Широковещательный адрес IPv4 используется для отправки пакета всем узлам данной подсети. Например, DHCP-клиент при первом подключении может ещё не знать ни своего IP-адреса, ни адреса DHCP-сервера, поэтому начальный обмен в IPv4 часто использует broadcast.
Маршрутизаторы обычно не пересылают широковещательные пакеты за пределы локальной сети. Это важно: широковещание удобно внутри подсети, но опасно и неэффективно в больших сетях.
Из правила «минус два адреса» есть исключения. В сетях /31 сетевой
и широковещательный адреса не резервируются: оба адреса используются как адреса
двух конечных узлов канала точка-точка. Эта схема, описанная в RFC 3021, сегодня —
стандартная практика для линков между маршрутизаторами, потому что экономит
половину адресов на каждом таком соединении. В сетях /32 вообще нет
понятия подсети — это одиночный хост-маршрут, и broadcast-адреса там тоже нет.
Подробнее: RFC 3021: Using 31-Bit Prefixes on IPv4 Point-to-Point Links.
Внутри домашних, офисных и корпоративных сетей обычно используются не публичные, а частные IPv4-адреса. Они специально зарезервированы для внутренних сетей и не маршрутизируются в глобальном Интернете.
Самый знакомый пример — адреса вида 192.168.x.x. Их часто используют
домашние роутеры и небольшие офисы. В крупных сетях чаще встречаются адреса
из диапазона 10.0.0.0/8, то есть от 10.0.0.0
до 10.255.255.255: он даёт очень большое внутреннее адресное
пространство. Есть и промежуточный диапазон 172.16.0.0/12 —
от 172.16.0.0 до 172.31.255.255; его тоже применяют
во внутренних сетях организаций, VPN, облачных VPC и контейнерных средах.
Такие адреса удобны внутри сети, но напрямую из Интернета они недоступны. Чтобы устройства с частными адресами могли обращаться к внешним сайтам и сервисам, обычно используется NAT — трансляция сетевых адресов.
NAT позволяет множеству внутренних устройств выходить в Интернет через один или несколько публичных IPv4-адресов. Это помогло продлить жизнь IPv4, но NAT не является полноценной заменой глобальной адресации: он усложняет входящие соединения, некоторые сетевые протоколы и диагностику.
Отдельно стоит упомянуть диапазон 100.64.0.0/10 — Shared Address Space,
выделенный RFC 6598 под carrier-grade NAT (CGNAT). Это адреса, которые интернет-провайдеры
используют внутри собственной инфраструктуры NAT, когда публичных IPv4 не хватает на
всех абонентов. Адреса 100.64.x.x часто видны в WAN-настройках домашних
роутеров пользователей, подключённых к таким провайдерам. От обычных RFC 1918 этот
диапазон отличается тем, что предназначен именно для внутрипровайдерского использования
и не должен появляться внутри частных сетей предприятий — иначе при подключении абонента
к CGNAT-провайдеру возникнут пересечения адресов и проблемы с маршрутизацией.
Подробнее: RFC 1918: Address Allocation for Private Internets и RFC 6598: IANA-Reserved IPv4 Prefix for Shared Address Space.
Кроме обычных публичных и частных адресов, в IPv4 есть специальные диапазоны. Они нужны не для обычной адресации узлов в Интернете, а для служебных задач.
127.0.0.1 — самый известный адрес обратной связи
(loopback). Он всегда указывает на сам узел. Если программа обращается
к 127.0.0.1, она обращается не к удалённому серверу, а к сервису
на той же машине. Весь диапазон 127.0.0.0/8 зарезервирован для
loopback.
0.0.0.0 часто означает неопределённый адрес. Например, серверная
программа может слушать 0.0.0.0, то есть принимать соединения
на всех IPv4-интерфейсах узла.
169.254.0.0/16 используется для link-local IPv4. Такие адреса
могут появиться автоматически, если устройство не получило обычный адрес,
например от DHCP-сервера.
100.64.0.0/10 — Shared Address Space для CGNAT. Этот диапазон
уже был упомянут выше: он предназначен не для обычных домашних или корпоративных
сетей, а для провайдерской инфраструктуры NAT.
224.0.0.0/4 — диапазон IPv4 multicast, то есть адресов для групповой
доставки.
255.255.255.255 — ограниченное широковещание в локальной сети.
192.0.2.0/24, 198.51.100.0/24 и
203.0.113.0/24 зарезервированы для документации и примеров
(TEST-NET-1, TEST-NET-2 и TEST-NET-3). Поэтому в этой статье используются
адреса вроде 192.0.2.25 и 203.0.113.140: они не
должны случайно указывать на реальный чужой сервер.
Актуальный справочник специальных диапазонов ведёт IANA: IPv4 Special-Purpose Address Space.
Если узел знает IPv4-адрес получателя в локальной сети, ему всё равно нужен MAC-адрес, чтобы отправить кадр Ethernet или Wi-Fi. Для этого в IPv4 используется ARP (Address Resolution Protocol).
Пример:
192.168.1.20.192.168.1.20?»ARP работает только внутри локального канального сегмента. Для удалённых сетей компьютер ищет не MAC-адрес конечного сервера, а MAC-адрес маршрутизатора, через который пакет будет отправлен дальше.
IPv4 до сих пор широко используется, но его адресное пространство слишком мало для современного Интернета. Частные адреса и NAT помогли продлить жизнь IPv4, однако они не устранили саму причину проблемы: публичных IPv4-адресов мало. Поэтому параллельно с IPv4 развивается и используется IPv6.
IPv6 был создан не просто как «IPv4 с более длинными адресами». Он изменил ряд важных механизмов: отказался от широковещания, ввёл обязательную поддержку link-local адресов, использует Neighbor Discovery вместо ARP и по-другому организует автоконфигурацию.
IPv6-адрес имеет длину 128 бит и записывается в шестнадцатеричной форме:
2001:0db8:0000:0000:0000:0000:0000:0025
Нули можно сокращать:
2001:db8::25
Двойное двоеточие :: означает одну непрерывную последовательность
нулевых групп. В одном адресе его можно использовать только один раз, иначе запись
стала бы неоднозначной.
Подробнее: RFC 8200: Internet Protocol, Version 6 (IPv6) Specification и RFC 4291: IP Version 6 Addressing Architecture.
В IPv6 есть несколько типов адресов, и их важно не смешивать.
Адрес ::1 — это loopback, аналог 127.0.0.1 в IPv4:
он указывает на сам узел. Адрес :: означает неопределённый адрес
и используется до того, как узел получил настоящий адрес.
Адреса fe80::/10 называются link-local. Они есть у каждого
IPv6-интерфейса и работают только в пределах одного локального сегмента.
Через обычные маршрутизаторы такие адреса не передаются.
Для внутренних сетей организаций используются Unique Local Addresses, или ULA.
Формально это диапазон fc00::/7, охватывающий обе половины
fc00::/8 и fd00::/8. Но на практике локально назначаемые
адреса обычно берутся из fd00::/8: организация генерирует их сама
со случайным 40-битным идентификатором. fc00::/8 зарезервирован под
возможный механизм централизованной регистрации, но такой механизм пока не существует.
ULA можно считать приблизительным аналогом частных IPv4-адресов, хотя устройство
IPv6-адресации отличается от IPv4.
Глобальные unicast-адреса используются для обычной маршрутизации в Интернете.
Например, префикс 2001:db8::/32 зарезервирован для документации,
поэтому его удобно использовать в учебных примерах. Multicast-адреса начинаются
с ff00::/8 и обозначают группу получателей. Широковещания в стиле
IPv4 в IPv6 нет: многие служебные задачи, которые раньше решались broadcast-ом,
в IPv6 решаются через multicast.
Актуальный справочник специальных IPv6-диапазонов: IPv6 Special-Purpose Address Space.
Помимо unicast (один адрес соответствует одному интерфейсу) и multicast (один адрес обозначает группу интерфейсов и пакет доставляется всем), есть третья модель — anycast: один и тот же адрес настроен сразу на нескольких узлах, географически разнесённых, и пакет доставляется любому из них, обычно ближайшему по маршрутизации.
В IPv6 anycast явно предусмотрен в архитектуре. В частности, определён subnet-router anycast: специальный адрес внутри подсети, на который отвечает любой маршрутизатор этой подсети. В IPv4 anycast реализуется не на уровне самого протокола, а на уровне маршрутизации: несколько узлов в разных точках сети анонсируют через BGP один и тот же префикс, и каждый клиент попадает на ближайший по метрикам.
По схеме anycast работают, например, корневые DNS-серверы и публичные DNS-резолверы
1.1.1.1, 8.8.8.8, 9.9.9.9: за каждым из этих
адресов на самом деле скрываются десятки физических серверов, расположенных по
всему миру.
Link-local адрес уникален только в пределах одного канального сегмента. Если у узла несколько сетевых интерфейсов, один и тот же link-local адрес может быть достижим через любой из них — и нужно явно указать, какой именно интерфейс имеется в виду. Для этого используется идентификатор зоны после знака процента:
fe80::1%eth0 — Linux, FreeBSD, macOS
fe80::1%3 — Windows, где 3 — индекс интерфейса
Без указания зоны команда вроде ping fe80::1 на многоинтерфейсном узле
работать не будет: ОС просто не знает, в какой канальный сегмент отправлять пакет.
Глобальные и ULA-адреса в указании зоны не нуждаются, потому что они уникальны во
всей маршрутизируемой области.
Подробнее: RFC 4007: IPv6 Scoped Address Architecture.
В IPv6 также используется CIDR-запись:
2001:db8:1234:10::/64
Для обычных локальных IPv6-сетей чаще всего используется префикс /64.
Это означает, что первые 64 бита адреса задают подсеть, а оставшиеся 64 бита —
идентификатор интерфейса. Такой размер подсети связан с механизмами IPv6,
в том числе с автоконфигурацией адресов.
Например, организация может получить от провайдера префикс /48 или
/56, а внутри него выделять отдельные /64-подсети для
офисов, VLAN, серверных сегментов, Wi-Fi и VPN.
Подробнее о границе 64 бит: RFC 7421: Analysis of the 64-bit Boundary in IPv6 Addressing.
В IPv6 нет ARP. Его функции выполняет Neighbor Discovery Protocol, который работает поверх ICMPv6. С его помощью узлы IPv6:
Подробнее: RFC 4861: Neighbor Discovery for IP version 6.
IP-адрес может быть назначен несколькими способами.
Администратор может вручную указать IP-адрес, префикс, шлюз по умолчанию и DNS-серверы. Так часто настраивают серверы, маршрутизаторы, межсетевые экраны и другое оборудование, адрес которого должен быть предсказуемым.
В IPv4 для автоматической настройки обычно используется DHCP. Клиент получает от DHCP-сервера адрес, маску, шлюз по умолчанию, DNS-серверы и другие параметры. Адрес выдаётся на ограниченное время — срок аренды. Когда срок подходит к концу, клиент пытается продлить аренду.
В IPv6 узел может сам сформировать адрес на основании информации, полученной из Router Advertisement. Этот механизм называется SLAAC — Stateless Address Autoconfiguration.
Маршрутизатор периодически рассылает RA с информацией о префиксе подсети, например
2001:db8:1234:10::/64. Узел добавляет к этому префиксу собственный
64-битный идентификатор интерфейса и получает полноценный глобальный адрес. Никакого
сервера для этого не нужно — отсюда «stateless» в названии.
Исторически идентификатор интерфейса часто строился на основе MAC-адреса в формате EUI-64. Это удобно с точки зрения уникальности, но плохо с точки зрения приватности: один и тот же постфикс адреса следует за пользователем по всем сетям, в которых он появляется. Поэтому современные операционные системы по умолчанию используют случайно сгенерированный стабильный идентификатор и дополнительно — временные (privacy) адреса по RFC 8981. Стабильный адрес используется для входящих соединений, а исходящие соединения идут с временного адреса, который периодически меняется.
Подробнее: RFC 4862: IPv6 Stateless Address Autoconfiguration и RFC 8981: Temporary Address Extensions for SLAAC.
DHCPv6 может использоваться для выдачи IPv6-адресов, префиксов и дополнительных параметров. В одних сетях он работает вместе со SLAAC, в других — вместо него. Например, DHCPv6 Prefix Delegation часто используется, когда провайдер выдаёт домашнему или корпоративному маршрутизатору не один адрес, а целый IPv6-префикс.
Какой именно механизм работает в конкретной сети, узел определяет по флагам в Router Advertisement. Флаг M (Managed Address Configuration) означает, что адрес нужно получить через DHCPv6. Флаг O (Other Configuration) означает, что через DHCPv6 надо запросить только дополнительные параметры — например, DNS-серверы — а сам адрес сформировать через SLAAC. Если оба флага сброшены, используется чистый SLAAC.
Подробнее: RFC 8415: Dynamic Host Configuration Protocol for IPv6.
IP-адреса неудобно запоминать. Кроме того, адрес сервера может измениться, а имя сайта должно остаться прежним. Для этого используется DNS — Domain Name System.
DNS — распределённая иерархическая система имён. Когда приложение обращается
к имени www.example.org, резолвер DNS получает записи, связанные
с этим именем. Для темы IP-адресации особенно важны записи A,
AAAA и PTR.
Запись A связывает имя с IPv4-адресом:
www.example.org. A 192.0.2.25
Запись AAAA связывает имя с IPv6-адресом:
www.example.org. AAAA 2001:db8::25
Есть и обратное разрешение: по IP-адресу можно попытаться найти имя. Для этого
используются PTR-записи в специальных доменах in-addr.arpa для IPv4
и ip6.arpa для IPv6. IPv4-адрес записывается в обратном порядке октетов:
для адреса 192.0.2.25 ищется запись
25.2.0.192.in-addr.arpa.
25.2.0.192.in-addr.arpa. PTR www.example.org.
Обратное разрешение применяется в логах серверов, в почтовых антиспам-проверках
(в частности, при проверке HELO и FCrDNS — Forward-Confirmed reverse DNS) и при
сетевой диагностике. Другие типы DNS-записей решают свои задачи: CNAME
задаёт каноническое имя, на которое указывает псевдоним
(www.example.org. CNAME server.example.org.), а MX указывает
почтовые серверы домена (example.org. MX 10 mail.example.org.). Но для
темы IP-адресации главные записи — это A, AAAA и PTR.
DNS-ответы кэшируются. Время жизни записи задаётся параметром TTL. Малый TTL позволяет быстрее менять адреса, но увеличивает нагрузку на DNS-инфраструктуру. Большой TTL снижает число запросов, но изменения распространяются медленнее.
Базовые документы DNS: RFC 1034 и RFC 1035. Поддержка IPv6-адресов в DNS описана в RFC 3596. Динамические обновления DNS описаны в RFC 2136.
Маршрутизатор принимает решение о пересылке пакета по таблице маршрутизации. В таблице для каждого адресного префикса указан адрес следующего перехода (next hop) или интерфейс, через который нужно отправлять пакеты.
Если в таблице есть несколько подходящих маршрутов, выбирается наиболее точный, то есть маршрут с самым длинным префиксом. Это называется правилом самого длинного совпадения (longest prefix match).
Например, если маршрутизатор знает такие маршруты:
0.0.0.0/0 через провайдера
203.0.113.0/24 через канал A
203.0.113.128/25 через канал B
то пакет к адресу 203.0.113.140 будет отправлен через канал B,
потому что префикс /25 точнее, чем /24 и тем более
точнее, чем маршрут по умолчанию /0.
Маршрут 0.0.0.0/0 в IPv4 и ::/0 в IPv6 называется
маршрутом по умолчанию. Он используется, когда более точного маршрута нет.
Допустим, есть небольшой офис:
Для такой сети можно использовать частный IPv4-блок:
192.168.10.0/24
Пример распределения:
| Адреса | Назначение |
|---|---|
192.168.10.1 |
Маршрутизатор, шлюз по умолчанию |
192.168.10.2 – 192.168.10.20 |
Сетевое оборудование и серверы со статическими адресами |
192.168.10.50 – 192.168.10.200 |
DHCP-пул для рабочих станций и мобильных устройств |
192.168.10.255 |
Broadcast-адрес подсети |
Если у сети есть IPv6-префикс, например:
2001:db8:1234:10::/64
то устройства могут получать IPv6-адреса автоматически через SLAAC, через DHCPv6 или через сочетание этих механизмов. При этом IPv4 и IPv6 могут работать параллельно: такая схема называется dual stack.
Вернёмся к простому примеру. Пользователь открывает сайт по имени. DNS помогает найти IP-адрес сервера. По IP-адресу операционная система определяет, находится ли сервер в локальной сети или пакет надо отправить на шлюз по умолчанию. Если пакет надо передать ближайшему маршрутизатору, в IPv4 используется ARP, чтобы узнать MAC-адрес этого маршрутизатора. В IPv6 похожую роль выполняет Neighbor Discovery.
Дальше маршрутизаторы пересылают пакет от сети к сети, выбирая маршруты по префиксам. На каждом участке пути меняются канальные заголовки и локальные адреса, но IP-адреса источника и назначения остаются основой доставки между сетями.
В обратную сторону цепочка работает похоже: сервер видит IP-адрес клиента и при необходимости через PTR-запись может узнать связанное с ним имя.
IP-адрес часто используют в журналах, правилах доступа и системах мониторинга, но важно понимать ограничения. Один и тот же пользователь может получать разные адреса в разное время. За одним публичным IPv4-адресом через NAT — особенно через CGNAT у провайдера — могут находиться сотни и тысячи устройств. В IPv6 у одного устройства может быть несколько адресов одновременно, в том числе временные адреса, которые меняются для защиты приватности.
Поэтому IP-адрес полезен как технический признак, но его нельзя безусловно считать надёжным идентификатором человека или устройства.
Временные IPv6-адреса для SLAAC описаны в RFC 8981.
in-addr.arpa и ip6.arpa./31 (RFC 3021).100.64.0.0/10./64.