Сайт FSA
07.12.2023

IPv6 для тех, кто знает что такое IPv4

Изначально эта статья была опубликована мной на Хабре.

В 2023 году люди боятся многих новых для них вещей, например, systemd, SELinux, IPv6 и др. От этих вещей люди стараются избавиться, отключить, удалить. Об этом написано во множестве любительских мануалов в интернете, коим может являться и этот. Далее речь пойдёт о протоколе интернета IP версии 6, для краткости — IPv6.

Целью данной заметки показать, что IPv6 не намного страшней того IPv4, который вы сейчас используете. Он способен решить все те же ваши задачи, что вы решали с помощью старого протокола, а также упростить себе жизнь за счёт более простой настройки сети. Кроме того, возможно, даже сейчас используете новый протокол даже не подозревая об этом.

Текст я попытался написать максимально доступным языком. Это не техническое руководство. Воспринимайте эту заметку как отправную точку, просто чтобы перестать бояться использовать IPv6 и познакомиться с его основными особенностями, которые отличают его от IPv4, но при этом дают заметные преимущества.

Как появился IPv6 и почему он именно такой

История протокола начинается в 1990-х годах. Предпосылкой появления нового протокола являлись проблемы, которые накопились при использовании IP протокола, который в дальнейшем я буду называть IPv4 (из-за версии 4 в заголовке IP пакета).

Первоочередной проблемой оказался размер адресного пространства. Во-первых, он не позволял дать отдельный адрес каждому устройству в сети, что хоронило изначальный принцип сети интернет — «сквозную прозрачность». Этот принцип гарантирует нам то, что для доставки информацию от одного узла сети к другому нам никак не нужно будет модифицировать пакет с данными. В настоящее время ограничение адресного пространства вообще привело к тому, что даже провайдеры стали выдавать пользователям серые адреса и использовать NAT.

Чтобы увеличить размер адреса необходимо увеличить количество используемых бит. В ходе обсуждения вопроса места размещения дополнительных бит адреса инженеры пришли к выводу, что текущим форматом заголовка IPv4 придётся пожертвовать, т.е. новый протокол не будет иметь обратной совместимости, а, значит, его можно радикально переделать так, чтобы исправить в нём существующие недостатки и добавить новые возможности. Именно поэтому он так заметно отличается от IPv4, а не продолжает тянуть всего его недостатки за собой.

Единственное, что осталось общим в пакете IP — поле версии протокола. Старый протокол имеет номер «4». Значение «5» уже было зарезервировано для «Internet Stream Protocol Version 2», который так и не стал общедоступным, поэтому для нового протокола использовали следующее значение — «6».

Одна из идей расширения адресного пространства — использование переменной длины адреса. В этом направлении также были разработки, например, «IP нового поколения» — TUBA. Она описана в RFC 1347. В качестве основы в ней используется протокол ISO CLNP. Однако, даже сами авторы выражали опасение, что гибкость адресации будет в ущерб производительности. За TUBA зарезервирована «9» версия IP. Если бы разработка была признана перспективной, то вполне возможно, что сейчас внедряли бы IPv9, а не IPv6.

Обо всех зарезервированных версиях IP можно узнать на сайте IANA.

В результате был выбран компромиссный вариант — 128 бит на адрес. Этого достаточно, чтобы не испытывать долгое время нехватку адресов, при этом адрес остаётся достаточно коротким, чтобы даже самые простые устройства нормально могли работать с подобными адресами. Конечно, если бы протокол IPv6 разрабатывался, например, в 2010-х годах или сейчас, то, вполне вероятно, что вместо 128 бит адреса могли бы использовать 256, т.к. возможности даже самых компактных устройств значительно выросли по сравнению с 1990-ми годами, когда протокол IPv6 только начал разрабатываться.

Если вы представляете себе, что такое IP адрес, но, при этом, вы не специалист, то большинство адресов, которые вы знаете — это индивидуальные IPv4 адреса. Кроме этого, часто можно встретить адреса из диапазона 224.0.0.0/4. Это адреса для многоадресной рассылки. Также существуют адреса для широковещательных запросов. В IPv6 тоже существуют индивидуальные адреса, также известные как unicast адреса. А вот работу группового вещания в IPv6 переделали полностью. Это очень большая тема, которая явно не для первого знакомства с протоколом, поэтому подробно все остальные типы адресов, кроме индивидуальных, далее не будут рассматриваться, а только иногда упоминаться, поскольку они важны для нормального функционирования IPv6.

Адреса IPv6

Прежде чем продолжить, нужно познакомиться с тем, как записывать IPv6 адреса. Постараюсь объяснить максимально кратко. Если вы не поняли или возникли вопросы, всегда можете воспользоваться поиском в интернете. Этой теме посвящено немало заметок и статей.

Для записи адреса выбрана шестнадцатеричная система счисления. Несмотря на то, что она менее понятна многим людям, но она имеет несколько преимуществ, перед привычной десятичной, которая использовалась для записи IPv4 адресов. Например, она облегчает работу с префиксами, а также IP адреса отлично видны прямо в дампе пакетов при анализе сети.

Поскольку адрес имеет большую длину, то его поделили на 8 групп по 16 бит. Каждую из групп записывают в виде шестнадцатеричного числа от 0000 до FFFF. Группы разделяют между собой знаком «:». Для уменьшения длины адреса, в каждой из групп опускают ведущие нули, например, также вы делаете в десятичной системе счисления: вы можете записать число 10 в таком виде 0010, однако ведущие нули легко можно опустить и оставить только 10.

Кроме этого, ввиду специфики распределения IPv6 адресов, адреса могут содержать повторяющиеся нулевые разряды, например, 2001:DB8:0:0:0:0:0:1. В таком случае самую большую последовательность нулей (и только одну!!!) можно заменить на ::. Тогда адрес может быть записан как 2001:DB8::1. По сути, то, что расположено до знака двойного двоеточия — это старшая часть адреса, а то, что справа — младшая. Количество нулевых разрядов всегда легко восстановить, т.к. общее количество разрядов всегда равно 8.

В паре с адресом обычно используется маска сети, чтобы обозначить какие адреса будут соответствовать заданной сети, а какие нет. Если записывать маску сети аналогично тому, как это делается в IPv4, то это будет очень громоздко. При этом, обычно, почти нигде не используются маски с разрывами. Поэтому в IPv6 принято обозначать не маску сети, а префикс. Префикс указывает какое количество бит в левой части маски будет заполнено единицами, вся остальная часть будет наполнена нулями. Возможно вы сталкивались с подобной записью в IPv4, например, 192.168.1.0/24, то эквивалентно маске 255.255.255.0. Аналогично запишется и IPv6, адрес, например, 2001:DB8::1/64.

В IPv6 приняли стандартный размер префикса для канала. Чтобы все механизмы IPv6 работали необходимо использовать префикс /64. Если в IPv4 вы выбирали себе маску и могли использовать как 255.255.0.0, так и 255.255.255.0, или даже 255.255.255.192, то для сетей IPv6 смело выбирайте /64. Если вы где-то встречаете варианты использования маски /65 или ещё больше, вплоть до /128, то явно что-то не так. Однако, в некоторых случаях, вы не можете повлиять на распределение адресов выше, возможно для вас это будет являться единственным выходом, например, хостинг провайдер выдаёт вам только сеть /64, а вы хотите организовать VPN сервер с поддержкой IPv6. Провайдер нарушает рекомендации, а вы вынуждены использовать данные префиксы. Готовьтесь к другим подводным камням! А лучше решите проблему и вернитесь к стандартной сети /64.

Первое, что нужно понять, что отличает IPv6 от IPv4 — это то, что ваше устройство теперь может иметь не один IP адрес, а сразу несколько. В IPv4 подобная ситуация тоже возможна, но это не имеет большого смысла. Да, вы можете создать две сети с разными диапазонами в одном сегменте сети, но какой-то практической пользы на постоянной основе это не несёт. Иметь множество IPv6 адресов на одном сетевом адаптере — это нормально. Более того, для нормальной работы обычной сети вы не можете отказаться от link-local адреса.

В IPv4 существует такое понятие, как канальные IP адреса. Это специально выделенный диапазон 169.254.0.0/16, который используют ваши устройства, если на интерфейсе не задан IP адрес или его не удалось получить. Так, например, поступают все версии Windows начиная… как минимум с Windows 95. Диапазон не очень популярен, поскольку может быть использован только в изолированной сети, который также можно назвать каналом. Канал — это пространство, где узлы сети могут обмениваться между собой любыми пакетами данных без использования промежуточных узлов.

В IPv6 для link-local выделен специальный диапазон fe80::/10. Не смотря на такой широкий префикс, реально в сетях используется стандартный /64. И это не простая сеть, а очень важная. Любой узел при подключении к сети IPv6 обязан взять себе адрес из этого диапазона. Даже если есть несколько сетевых адаптеров, то на каждом должен быть адрес из этого диапазона. Более того, эти адреса могут пересекаться на одном устройстве. Благодаря тому, что в таблицах маршрутизации всегда указан сетевой интерфейс, устройство может легко иметь 2 и более одинаковых адреса. Подобного механизма в протоколе IPv4 не было. Возникает логический вопрос: а как тогда работать с этими адресами? Логический ответ: как пользователю вам эти адреса вряд ли понадобятся, просто не обращайте на них внимание. Но если вы хотите их использовать, то кроме адреса нужно указать сетевой интерфейс, который, скорее всего связан с одним каналом. Как будет сетевой интерфейс называться зависит от реализации. Например, в linux это выглядит так: fe80::1%ens3, где ens3 — имя сетевого интерфейса. В Windows используется число, которое указывает на конкретный сетевой интерфейс: fe80::1%3.

Первое, что вы увидите при включении IPv6 протокола на сетевом интерфейсе — это link-local адрес. Например, если вы подключите к сети компьютер под управлением ОС Windows, то он автоматически выберет себе адреса из указанного диапазона. Если в вашей сети не будет DHCPv4 сервера, то компьютер также получит IPv4 адрес из диапазона 169.254.0.0/16. В данном случае IPv4 и IPv6 работают примерно одинаково. При этом IPv4 адрес изменится, если в сети появится DHCP сервер, а IPv6 адрес останется и продолжит работать не зависимо от настроек сети.

Link-local адрес всегда выбирается по определённому алгоритму, благодаря чему этот адрес для интерфейса всегда одинаковый и не меняется со временем.

Link-local адресации вполне достаточно, чтобы, например, открыть для сети папку или принтер в Windows для других машин, которые подключены к вашему каналу. Для примера рассмотрим две системы с Windows 7. После запуска этих операционных систем в одной локальной сети сети, машины прекрасно видят себя через сетевое окружение. Более того, можно даже отключить IPv4 протокол и убедиться, что всё работает именно через IPv6.

Если на вашей машине активирован протокол IPv6, то даже если вы не настраивали IPv6 сети и используете Windows, то вполне вероятно, что большая часть трафика в внутри сети между устройствами через стандартные механизмы Windows ходит именно по IPv6. Например, протокол LLMNR (Link-Local Multicast Name Resolution) позволяет найти IPv6 адреса устройств с использованием запросов на групповые адреса. Именно поэтому, когда вы обращаетесь к соседнему устройству по имени, то вы с большой долей вероятности с помощью LLMNR получите его link-local адрес и обратитесь к его сетевым ресурсам именно по сети IPv6. Это просто магия IPv6!!! Вы ничего не настраивали, но уже всё работает. И это не сломается, даже если добавите вашей сети новые возможности, например, выход в сеть интернет, просто потому, что link-local адреса с вами всегда.

Посмотрите на адреса вашего сетевого адаптера. Если там указан адрес, который начинается на fe80:, то это тот самый link-local адрес. Если он у вас есть, то протокол IPv6 активен на этом сетевом интерфейсе. Однако, несмотря на свою замечательность, этот тип адресов не способен обеспечить обмен трафиком с другими сетями, т.к. данная сеть не маршрутизируется. Чтобы получить к ресурсам других сетей необходимо использовать другой тип индивидуальных адресов.

Рассмотрим два узла ALPHA и BETA на Windows 7 которые были объединены в сеть без каких либо других устройств. Windows 7 была выбрана как достаточно старая, к тому же её поддержка закончилась. Сразу после настройки узлы получили link-local адреса IPv6 и канальные адреса IPv4.

Настройка сети узла ALPHA

Настройка сети узла BETA

Даже если отключить IPv4 протокол, узлы прекрасно продолжают видеть друг друга.

Доступность общих папок при отключении IPv4

Даже Windows 7 имеет полноценную поддержку протокола IPv6.

Любопытный факт. В сети IPv6 маршрутизатор может вообще не иметь никаких других адресов, кроме link-local, но при этом успешно маршрутизировать пакеты. А всё потому, что в его таблице маршрутизации могут быть быть указаны link-local адреса соседних маршрутизаторов.

Частные индивидуальные адреса (ULA)

Представьте себе ситуацию, что вы решили объединить две сети. Если у вас сеть IPv4, то вы начинаете использовать стандартные выделенные диапазоны: 10.0.0.0/8, 172.16.0.0/12 и 192.168.0.0/16. Благодаря использованию этих адресов, в дальнейшем, вы легко сможете подключиться к сети интернет, поскольку данные адреса используются только в частных сетях и не будет конфликта адресов. Разве что придётся применить специальный костыль (NAT), который будет подменять адрес из этого диапазона на тот, который способен маршрутизироваться в интернете.

В IPv6 тоже есть свой аналог. Это тоже специально выделенный диапазон fd00::/8. За этими адресами закрепилось наименование ULA — Unique local address. С ним рядом присутствует смежный блок fc00::/8, а вместе они представляют префикс fc00::/7. Однако окончательного решения по блоку fc00::/8 от IETF не было. Поэтому в большинстве случаев используется диапазон fd00::/8. Большинство маршрутизаторов с поддержкой IPv6 по умолчанию автоматически генерирует сеть fdXX:XXXX:XXXX::/48, которую в дальнейшем будет использовать в качестве ULA адресов. При использовании прошивки OpenWRT на вашем маршрутизаторе вы легко сможете изменить адресацию этой сети. А вот некоторые устройства, например, GPON маршрутизаторы от Ростелеком имеют крайне скудные настройки для IPv6 и не позволяют изменить адресацию этой сети.

Немаловажная деталь о которой говорилось ранее. В отличие от IPv4, использование ULA не означает, что ваш сетевой адаптер перестаёт пользоваться link-local адресом. Он по прежнему остаётся доступен и ваше устройство может общаться с соседями используя только его.

Как использовать эти адреса? Также, как вы используете аналогичную адресацию в IPv4. Можете просто назначить вручную каждому хосту свой IPv6 адрес. При этом, благодаря тому, что запись IPv6 адреса можно сократить, можно добиться ещё более лаконичной записи адреса, чем в IPv4, например, fd12::1. Первая часть адреса fd12:0:0:0: — это выбранная вами сеть, 0:0:0:1 — адрес узла внутри сети /64.

Прописывать адреса вручную обычно не очень хорошая идея. Для IPv4 чтобы получить адрес у нас есть единственный способ — спросить у сети, а не может ли она предоставить мне IPv4 адрес. Этот механизм называется DHCP. В IPv6 пошли дальше. Если ваша сеть нуждается в ULA адресах, то она, вероятно, будет использовать маршрутизатор для связи с другими сетями. Во время своей работы маршрутизатор рассылает уведомления рабочим станциям с какими сетями он работает, а также дополнительную информацию, например, адреса DNS серверов. Также маршрутизатор может отправить эти данные по запросу клиентов. Таким образом, как только в сети появляется маршрутизатор, он рассылает всем клиентам всю необходимую информацию. Устройства, получив анонс, могут автоматически сформировать свой уникальный адрес по определённым алгоритмам и настроить свои сетевые интерфейсы. Этот механизм называется SLAAC.

DHCP в IPv6 тоже не обошли стороной, поскольку это очень полезный инструмент. Маршрутизатор в анонсе может выставить два флага о необходимости обратиться к DHCP серверу:

DHCP теперь не обязан предоставлять вам адрес, хотя может это делать, но всё также может подсказать вам где искать те или иные сервисы в сети. DHCPv6 становится опциональным, потому что без него сеть IPv6 способна работать просто при наличии маршрутизатора.

Снова посмотрите на адреса на вашем сетевом адаптере. Если там присутствуют адреса из диапазона fdXX:, то ваше устройство может общаться по сети не только с соседями, но ещё и через маршрутизаторы вашей локальной сети. Эти адреса могут появляются автоматически, если ваш маршрутизатор поддерживает IPv6. Этих адресов ещё недостаточно, чтобы получить полноценный доступ к интернет, но, как и в IPv4, вы уже можете воспользоваться прокси-сервером или даже NAT. Однако использование NAT не приветствуется в IPv6, и ваше устройство, скорее всего, предпочтёт использовать IPv4 адрес вместо ULA, если, конечно, такая возможность имеется.

Глобальные индивидуальные адреса IPv6 (GUA)

Самый востребованный тип Unicast адресов в интернет — Global Unique Address. Только адреса из этой группы могут маршрутизироваться в интернете. Если вы собираетесь использовать интернет, то вам нужен адрес именно из этого диапазона.

По своей сути эти адреса для пользователя ничем не отличаются от ULA, за одним главным исключением — пакеты с адресами GUA маршрутизируются в интернете. Из этого вытекает, что назначить себе любой GUA адрес, как это делали с ULA, просто так нельзя. Адреса GUA выделяются блоками поэтапно и, в конечном итоге, вы получаете свой блок от вашего провайдера. В рекомендациях IANA для абонента рекомендуется выделять сеть не менее /56 (т.е. вы получаете 256 сетей /64), что несколько меньше первой рекомендации /48 (65536 сетей /64). Особо жадные провайдеры могут выделять только одну сеть /64. Но есть и те, кто щедро выделяет максимально сеть /48.

Таким образом, GUA — это уже третий адрес, который может быть присвоен вашему сетевому интерфейсу наряду с link-local и ULA.

В настоящее время IANA выделяет адреса, в основном, из пула 2000::/3, (2XXX:... и 3XXX:...). Если подобных адресов нет на вашем сетевом интерфейсе, то и в интернет вы выйти с использованием IPv6, вероятно, не сможете.

Откуда у меня столько IPv6 адресов?

Пользователи Windows могут открыть свойства сетевого интерфейса и ужаснуться количеству IPv6 адесов. Пользователи Linux тоже могут выполнить команду ip a увидеть подобное:

2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 20:23:0d:db:09:10 brd ff:ff:ff:ff:ff:ff
    inet6 2001:0db8:2023:0910:60e1:76bd:601e:fa2f/64 scope global temporary dynamic
       valid_lft 85496sec preferred_lft 2696sec
    inet6 fd23:f1a9:d8a2::cea9:b317:45a2:eb90/64 scope global temporary dynamic
       valid_lft 528157sec preferred_lft 9546sec
    inet6 fd23:f1a9::12/128 scope global dynamic noprefixroute
       valid_lft 42598sec preferred_lft 2696sec
    inet6 2001:0db8:2023:0910::12/128 scope global dynamic noprefixroute
       valid_lft 42598sec preferred_lft 2696sec
    inet6 2001:0db8:2023:0910:36e1:7563:52e3:9043/64 scope global temporary deprecated dynamic
       valid_lft 85496sec preferred_lft 0sec
    inet6 2001:0db8:2023:0910:baa2:45c8:8915:6d10/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 85496sec preferred_lft 2696sec
    inet6 fd23:f1a9::cfab:64da:1f13:f335/64 scope global temporary deprecated dynamic
       valid_lft 441971sec preferred_lft 0sec
    inet6 fd23:f1a9::90e:a9d9:2a14:1a03/64 scope global mngtmpaddr noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fe80::a33a:1d30:af11:d339/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

Из результатов видно, что устройство получило 9 адресов IPv6:

  1. fe80::a33a:1d30:af11:d339/64 scope link noprefixroute
  2. fd23:f1a9::90e:a9d9:2a14:1a03/64 scope global mngtmpaddr noprefixroute
  3. fd23:f1a9::12/128 scope global dynamic noprefixroute
  4. fd23:f1a9::cea9:b317:45a2:eb90/64 scope global temporary dynamic
  5. fd23:f1a9::cfab:64da:1f13:f335/64 scope global temporary deprecated dynamic
  6. 2001:0db8:2023:0910:baa2:45c8:8915:6d10/64 scope global dynamic mngtmpaddr noprefixroute
  7. 2001:0db8:2023:0910::12/128 scope global dynamic noprefixroute
  8. 2001:0db8:2023:0910:60e1:76bd:601e:fa2f/64 scope global temporary dynamic
  9. 2001:0db8:2023:0910:36e1:7563:52e3:9043/64 scope global temporary deprecated dynamic

Как уже описывалось выше, можно заметить, что первый адрес относится к link-local адресам. со второго по пятый относятся к ULA и с шестого по девятый к GUA. Как уже вам известно, адрес link-local был присвоен автоматически при включении протокола IPv6. А вот полученные адреса ULA и GUA можно разделить на 3 группы:

  1. автоматически сформированный адрес с помощью SLAAC;
  2. адрес, полученный от DHCPv6-сервера;
  3. автоматически сформированные адреса, которые обеспечивают приватность.

Автоматически настроенный IPv6 адрес

Как уже отмечалось ранее, при подключении к сети маршрутизатора, он начинает рассылать свои анонсы со всеми необходимыми для настройки сети параметрами. Одним из ключевых параметров, которые передают маршрутизаторы — это префиксы сетей, которые они обслуживают. Префикс сети, это ничто иное, как первые 64 бита адреса IPv6. Получив его, каждый узел сможет сформировать свой уникальный IPv6 адрес. Именно такими адресами являются №2 и №6 из нашего списка. Алгоритм формирования этого адреса может зависеть от операционной системы на устройстве, а также от его настроек, в том числе может быть привязан к MAC-адресу сетевого адаптера. Как вы понимаете, это не очень безопасно в интернете.

Одним из первых алгоритмов был модифицированный EUI-64. Что это такое? Это просто обычный MAC-адрес, который преобразовали из 48 до 64 бит. А модификация — это изменение бита, говорящего о том, что MAC-адрес назначен вручную. Зачем эта модификация. Да просто потому, что простые адреса вроде ::1, ::2 и прочие могли бы случайно совпасть с MAC-адресом, который был присвоен какому-либо устройству легально. Благодаря модификации MAC-адрес, соответствующий этим адресам однозначно говорит о ручном назначении MAC-адреса. Инженеры просто перестраховались.

EUI-64 вполне хороший вариант для link-local адресов, потому что он обеспечивает гарантированно уникальный адрес в сети, потому что MAC-адреса уникальны в каждом канале. Если адрес не уникален, то будет проблема с передачей Ethernet кадров и это, в любом случае, придётся исправлять.

Светить MAC-адресом в составе публичных IP не очень хорошая идея. Поэтому большинство операционных систем теперь используют случайную генерацию IPv6 адреса по определённому алгоритму. Этим они гарантируют постоянство IPv6 адреса внутри выданного префикса IPv6, но при этом из этого адреса невозможно извлечь MAC-адрес устройства и он не повторяется при изменении префикса.

Таким образом, получив от маршрутизатора анонс, устройство автоматически присвоило себе по одному адресу ULA и GUA. Эти два адреса выглядят совершенно различно. Один из адресов позволяет маршрутизировать пакеты внутри вашей сети, как это ранее вы делали в сетях, например, 10.0.0.0/8 или 192.168.0.0/16, а второй позволяет вашему устройству пользоваться сетью интернет.

В анонсах маршрутизатора даже можно передать адреса DNS северов, которые обслуживают вашу сеть, в том числе, указать адреса публичных DNS, которыми должны пользоваться клиенты. К сожалению, не все клиенты способны принять данный тип данных, например, подобная проблема присуща ОС Windows. Решается она с помощью DHCPv6 сервера.

Даже если у вас пропадёт соединение с интернетом, ваш маршрутизатор оповестит все устройства о том, что GUA больше недоступен и ваши устройства продолжат общаться используя ULA адреса или даже link-local.

Адрес, присвоенный DHCPv6 сервером

О том, что DHCPv6 сервер доступен в вашей сети вы можете узнать из анонса маршрутизатора. Маршрутизатор может сообщить узлам, что IPv6 адрес нужно получать от DHCPv6-сервера.

Если ваш узел обратился к DHCP-серверу, то он вполне мог получить адреса №3 и №7 из нашего списка (fd23:f1a9::12 и 2001:0db8:2023:0910::12). Это означает, что вам в сети /64 был выдан адрес 12.

К сожалению, большинство узлов предпочитают адрес с наименьшим адресом. Т.е. если вы выходите в интернет, то вас легко идентифицировать по адресу 2001:0db8:2023:0910::12. Если вас это устраивает, то вы легко можете пользоваться интернетом и дальше.

Конфиденциальный IPv6 адрес

Если предыдущие IP адреса могли предоставить вам какие-то постоянные IPv6 адреса, хоть и случайные, но вы вполне могли их использовать для своих целей. Но если при их использовании у вас возникает ощущение дискомфорта, потому что вы считаете, что за вами могут следить, то для вас создан третий тип адресов. Не зависимо от того, какие постоянные адреса выданы вашему устройству, вы всегда можете получить случайный временный IPv6 адрес из доступных вам префиксов и использовать именно его.

Описание алгоритма приведено в RFC 4941 «Privacy Extensions for Stateless Address Autoconfiguration in IPv6». Если описать кратко, то ваш узел динамически формирует случайный IPv6 адрес из выданного маршрутизатором диапазона и пользуется им для всех исходящих соединений. Но тут есть одна проблема. Ваше устройство может соединиться и постоянно использовать соединение. При этом оно имеет право изменить свой IPv6 адрес. Для этого старые IPv6 адреса оно помечает как deprecated. Когда все соединения с использованием этого адреса будут закрыты, адрес может быть удалён с сетевого интерфейса.

В приведённом варианте механизмы конфиденциальных IPv6 адресов были использованы для 4 адресов: двух ULA (№4 и №5) и двух GUA (№8 и №9). Эти адреса помечаются как temporary.

Когда вы получаете конфиденциальные адреса, то ранее полученные вами адреса также продолжают работать. С их помощью вы можете предоставлять другим узлам свои услуги, например, общие папки, принтеры или даже веб-сервер. Постоянные IP адреса удобны тем, что их легко можно прописать в правилах вашего брандмауэра и, например, разрешить доступ к нужным сервисам, например, из интернет. А конфиденциальные адреса обеспечивают вашу приватность при работе с сетью интернет.

Отображение адресов IPv4 на адреса IPv6

Во время перехода к новой версии протокола возникают ситуации, когда требуется отобразить адрес IPv4 в адресе IPv6. Для этого может использоваться особая визуальная запись адреса. Начальная часть адреса записывается как обычно, а младшие 32 разряда адреса записываются в представлении, характерном для IPv4. Например, если у нас есть сервис NAT64, которому выделена адресация 2001:0DB8::123:/96, а нам необходимо обратиться через него к адресу 203.0.113.10, то можно использовать следующую запись — 2001:0DB8::123:203.0.113.10. При этом адрес будет преобразован к обычному виду 2001:0DB8::123:cb00:710a. Аналогично со стандартными диапазоном для локальных NAT64: 64:ff9b::203.0.113.10 -> 64:ff9b::cb00:710a. Таким образом, адреса IPv4 внутри IPv6 могут быть легко прочитаны человеком. Нет необходимости преобразовывать десятичные числа в шестнадцатеричную систему счисления.

Кроме NAT64 подобная запись используется для специального диапазона ::ffff:0:0/96. При открытии нового сокета для соединения система может открыть его для IPv4 адресов, для IPv6 адресов или всех типов адресов одновременно. При этом возникает проблема, что адреса удалённой стороны могут быть двух разных типов. Логичное решение проблемы — отображение IPv4 адреса в IPv6 с использованием этого диапазона. Например, если вы хоть раз настраивали веб-сервер nginx, то могли заметить, что при использовании IPv6 адресации есть возможность включить опцию ipv6only=off. При этом отдельной директивы для использования IPv4 адресов больше не требуется. Всё работает аналогично, за исключением того, что при получении адреса удалённой стороны (например, в веб-приложении или при записи в журнал), адреса IPv4 будут записаны как ::ffff:x.y.z.a, например, ::ffff:203.0.113.10.

Конечно, такой способ записи адресов не даёт никаких преимуществ для устройство, но значительно облегчается восприятие адресов человеком избавляя от необходимости выполнять преобразование из одной системы счисления в другую.

Немного про безопасность IPv6

Очень часто в интернет одним из аргументов против IPv6 является то, что, якобы, в IPv4 трансляция адресов (NAT) обеспечивает защиту сети. Якобы, благодаря ему устройства внутри сети недоступны извне. Отчасти это так. Внутренняя адресация не может быть доступна из интернета напрямую. Однако исследователями найдено множество способов обойти ограничения NAT. Самым простым является заражение машины внутри сети, которая уже сама будет связываться с удалённым центром управления. Есть способы проброса пакетов на нужный узел внутри сети даже при наличии NAT. Защититься от этого метода можно только используя брандмауэр, который как раз и предназначен для защиты! Таким образом мы приходим к выводу, для того, чтобы обеспечить защиту вашей локальной сети от атак из интернет — использовать брандмауэр.

Для примера, рассмотрим настройки по умолчанию на маршрутизаторе с OpenWRT. Правила брандмауэра (межсетевого экрана) запрещают входящие пакеты из сети интернет и разрешают исходящие. При этом именно брандмауэр обеспечивает защиту вашей сети, а не NAT! NAT мы вынуждены применять по причине того, что мы не можем обеспечить нашу сеть достаточным количеством публичных IP адресов и нам необходимо на границе модифицировать адрес источника, записывать то, что мы сделали в специальную таблицу, чтобы при ответе отправить его на нужный узел сети, тоже модифицировав его соответствующим образом. Это сильно усложняет обработку транзитных пакетов, при этом нам не нужно забывать о правилах брандмауэра, который и защищает нашу сеть от вторжения!

А что нужно будет сделать, чтобы обеспечить доступ к сервису на одной из наших машин по IPv6? Достаточно создать правило для трафика, где указать адрес нашего сервиса и необходимые порты. После этого всё начинает работать. А что нужно сделать для IPv4? Во-первых, озадачиться выбором порта для сервиса, который будет перенаправлен на один из портов на внутреннем адресе, а также создать правило для трафика, как это было для IPv6. Если вы захотите вывести в интернет два веб-сервера, то у вас не получится этого сделать, поскольку порты 80 и 443 у вас в одном экземпляре на один IPv4 адрес. Направив трафик веб на одну из машин, вторую вы уже не сможете открыть не меняя номеров портов. Можно, конечно, получить ещё один внешний IPv4 адрес и перенаправлять соединения с одного адреса на одну машину, а с другого на другую. Но, согласитесь, схема очень уж сильно усложняется, если сравнивать с тем, что нужно было сделать при использовании IPv6.

Что нам даёт IPv6

Даже не смотря на то, что размер заголовков пакетов вырос, но он вырос не так значительно. При росте размеров адреса источника и получателя в 4 раза сам заголовок вырос только в 2 раза. При этом его размер стал фиксированным, что упрощает его обработку. Кроме этого, теперь заголовок не имеет контрольной суммы, что позволяет избавиться от необходимость её пересчёта на каждом промежуточном узле. Целостность самих данных контролируются на вышележащих уровнях (например, TCP и UDP). Надёжность передачи данных в сети возросла, а эти особенности протокола могут обеспечить более высокую скорость обработки на промежуточных узлах.

Администраторы получают гораздо более простые для понимания человеком правила управления трафиком. Теперь не нужно заботиться о том, что пакеты приходят на ваш узел с одним адресом, уходят с другим. Вы просто создаёте правила что можно, а что нельзя.

Пользователь же получает то, что он теперь может обмениваться данными с другими напрямую, минуя промежуточные серверы, которые перенаправляют трафик. Это особенно критично, если вы общаетесь через видео. Ваш трафик пересылается изначально на промежуточный сервер, который может пересылать сотни подобных звонков и уже потом передаёт адресату. Теперь у вас появляется возможность обмениваться этим трафиком напрямую и качество видеосвязи будет зависеть только от пропускной способности ваших каналов.

Распределение адресов IPv6 иерархично и маршруты легко агрегируются. Изначально в IPv4 это было так, но, позже, из-за нехватки адресов, адресное пространство сильно сегментировалось, в результате значительно выросла глобальная таблица маршрутизации, что не добавляет скорости, а просто дополнительно загружает сетевое оборудование.

IPv4 ценный ресурс сети и их аренда стоит денег. Эта цена закладывается в стоимость вашего интернета, стоимость ваших серверов, которые вы арендуете.

В современном мире нет необходимости использовать IPv4 адреса. ОС Windows научилась их использовать полноценно как минимум с Windows 7. Другие системы умеют использовать их, также, с незапамятных времён. Самые беспроблемные устройства — современные смартфоны. Они просто появились практически одновременно со всемирным запуском IPv6. В конце концов, если вас так устраивают IPv4 адреса внутри вашей сети, используйте их. Но их использование в глобальной сети замедляет её и заставляет решать проблемы, которых просто нет в IPv6.

А можно полностью избавиться от IPv4 сейчас?

Да, но есть нюансы. Вы можете отключить IPv4 адрес на своей машине, но при этом потеряете доступ к сети IPv4. Доступ можно восстановить с помощью NAT64 и DNS64. NAT64 можно установить на ваш маршрутизатор, либо использовать сторонний сервис, поскольку вся адресация IPv4 легко вписывается в стандартную сеть IPv6. DNS64 обеспечивает преобразование IPv4 адресов в IPv6, которые будут указывать на ваш NAT64. Можно использовать для NAT64 стандартный диапазон 64:ff9b::/96, тогда вы даже можете использовать публичные сервисы DNS64, напрмиер, от Google и Cloudflare.

Адреса серверов Google DNS64:

Адреса серверов Cloudflare DNS64:

В качестве NAT вы можете использовать jool и tayga. Например, автор этой заметки использует jool на своём маршрутизаторе с прошивкой OpenWRT.

Что такое NAT64? Чтобы стало понятней, то ваш домашний маршрутизатор выполняет ту же функцию NAT, но он преобразует ваш внутренний адрес IPv4 в другой внешний адрес IPv4. Таким образом ваш NAT можно обозначить как NAT44. Соответственно NAT64 преобразует ваш IPv6 адрес в IPv4. Возможно, с точки зрения ресурсов, операция более затратная, чем NAT44, но она нужна только на время перехода от IPv4 к IPv6 для ресурсов, которые не работают с IPv6. Т.е. чем меньше IPv4, тем меньше нагрузка на NAT64. В перспективе он вообще становится ненужным.

Увы, но NAT64 с DNS64 не поможет вам, если ваше приложение использует IPv4 адреса напрямую. Из часто встречающихся ситуаций — торренты. Но и для этого есть отдельное решение — CLAT (Customer-side transLATor). По сути это NAT46, когда обращение к IPv4 преобразуется в обращение к NAT64, который произведёт обратное преобразование. Однако это решение необходимо устанавливать на каждое ваше устройство. Но есть вариант переноса его на ваш маршрутизатор. По сложности работы этой схемы это сопоставимо с тем, когда вы от провайдера получаете не публичный IPv4 адрес. Именно эти преобразования происходят на вашем маршрутизаторе и на сервере провайдера. Кстати, Европейские провайдеры успешно используют схему, при которой сервис CLAT переносится на маршрутизатор, который провайдер выдаёт пользователю (привет Ростелекому с его кривыми CPE, спасибо они хотя бы базовые возможности дают для IPv6). При этом его сеть полностью построена на IPv6, а доступ в IPv4 сеть он предоставляет через свои серверы равномерно распределяя ресурсы IPv4 между пользователями.

Заключение

IPv6 только на первый взгляд выглядит страшным и непонятным. На самом деле его разработка велась ещё 90-х годов прошлого тысячелетия. Инженеры, проектировавшие протокол, учли все те недостатки, которые были выявлены при использовании IPv4 и избавили от них новый протокол. Все изменения в нём логичны и удобны. Если вы раньше настраивали сети IPv4, то теперь это сделать намного проще. Увы, но вопросы безопасности придётся изучать заново. Но если вы пользовались настройками по умолчанию, то для вас что-то вряд-ли изменится, скорее даже безопасность вашей сети вырастет.

Всемирный запуск состоялся 6 июня 2012 года, которому, почти год назад, предшествовал «Международный день IPv6» 8 июня 2011 года, когда производилось всемирное тестирование нового протокола. Уже в это время протокол был достаточно зрелым. Большинство оборудования с этого времени выпускалось и выпускается с поддержкой IPv6.

Уже сегодня можно полностью перейти на новый протокол IPv6 и сделать свою жизнь легче (для администраторов сетей), но, единственным сдерживающим фактором является сеть IPv4. Давайте уже все вместе начнём использовать IPv6 и забудем об IPv4 как ночном кошмаре.


Обратите внимание, что заметки могут обновляться со временем. Это может быть как исправление найденных ошибок, так и доработка содержания с целью более полного раскрытия темы. Информация об изменениях доступна в репозитории на github. Там же вы можете оставить в Issue ваши замечания по данной заметке.


Если данная заметка оказалась вам полезной, можете поблагодарить автора финансово.