posts projects about

Введение в протокол IPv6 в сравнении с IPv4

31 марта 2017 г. ipv6 network

В последнее время все чаще и чаще приходится сталкиваться с протоколом IPv6. Здесь я собрал основную информацию про IPv6, и постарался максимально кратко изложить ее с практической точки зрения. В этой статье описаны базовые термины IPv6.

Адресация в IPv6

Пример IPv6-адреса:

2001:0db8:85a3:0000:0000:8a2e:0370:7334/64

Размер IPv6 адресов – 128 бит. То есть если указана маска /64, то это ровно половина от адреса. Есть правило по которому можно укоротить IPv6 адрес: если в адресе есть последовательные группы с нулями, то их можно заменить на ::. Старшие нули в группе можно не писать.

То есть адрес выше можно записать так:

2001:db8:85a3::8a2e:370:7334/64

IPv6 адрес

Как и в IPv4, в IPv6 есть anycast, multicast и unicast адреса. Broadcast-а больше нет, вместо него есть мультикаст группа “вообще все” ff02::1

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

  • Global anycast, например 2a03:b0c0:0:1010::424:8001/64. Грубо говоря, это “белый” IP-адрес, он маршрутизируется в интернете, и выдается провайдером по DHCPv6 или RA (об этом ниже)

  • Link local адреса из сети fe80::/10. Пример такого адреса – fe80::601:4eff:fe9b:4e01/64. Это подобие 169.254.0.0-ipv4 адресов, которы существуют для адресации внутри канала, когда нам никто не дал никакого глобального адреса. ОС сама выберет и присвоит интерфейсу такой адрес. В IPv6 на одном интерфейсе может висеть множество адресов, и это норма. Такие адреса обычно создаются на основе MAC-адреса интерфейса. В приведенном примере MAC-адрес машинки такой – 04:01:4e:9b:4e:01. Видно что взяли MAC, посередине вставили ff:fe и получили link-local адрес.

  • Unique local unicast адреса из сети fc00::/7. Это адреса подобные 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/16. В жизни практически нигде не используются.

Получение IPv6 адресов

Получение IPv6 адресов немного отличается от IPv4, но в целом все осталось как прежде – запрос/ответ. В IPv6 расширили протокол ICMP, и теперь процедура получения адреса начинается с того, что клиент на multicast-адрес “все роутеры” со своего link-local адреса отправляет ICMPv6-пакет типа Router solicitation (RS), как бы говоря – “эй, есть тут кто? дайте адрес”. Если в сети есть роутер, он отвечает ICMPv6-пакетом типа Router advertisement (RA). В этом пакете содержится минимально необходимая информация, с помощью которой клиент сможет настроить свой интерфейс – префикс сети и DNS сервер.

Пакет RA в wireshark: IPv6 Router advertisement

И тут могут быть два варианта:

  1. Если в пакете RA есть флаг managed, то клиент сам назначает себе IP-адрес из той сети которая указана в RA. В этом случае клиент также будет использовать Duplicate Address Detection (DAD), чтобы удостовериться, что назначенный адрес ни с кем не пересекается.

  2. Если флага нет, то клиент должен пойти на DHCP-сервер, и арендовать себе адрес там. В этом случае процедура аналогична IPv4. DHCPv4-request=DHCPv6-solicit, DHCPv4-response=DHCPv6 advertise.

Существует еще вариант быстрого получения адреса, когда клиент в сеть посылает RS, а в ответ уже получает адрес от DHCP-сервера. Такой механизм называется Rapid Commit

После получения global unicast адреса сервер становится доступен по ipv6 из интернета. HTTP (и вообще любой другой протокол более высокго уровня) по IPv6, естественно, никак не отличается от IPv4, просто в пакетах в адресе отправителя/получателя указывается v6 адрес.

ARP в IPv6

В IPv4, чтобы узнать канальный адрес соседа, использовался протокол ARP, в IPv6 его нет, вместо него есть Neighbor Discovery Protocol (NDP). Когда мы хотим узнать MAC-адрес какого-то IP-адреса, то с нашего link-local адреса посылаем ICMPv6 пакет типа Neighbor Solicitation (NS) на специальную multicast-группу SNMA. Адрес этой группы связан с искомым IP-адресом. В итоге этот пакет получит только хост с искомым адресом. На NS искомый хост отвечает пакетом Neighbor Advertisement (NA) на наш link-local адрес – “это я, вот мой MAC”. Вот так это выглядит в wireshark:

Neighbor Solicitation и Neighbor Advertisement в Wireshark

Посмотреть список MAC-адресов в linux можно командой:

#ip -6 neigh show
2a03:b0c0:0:1010::1 dev eth0 lladdr 00:00:5e:00:02:96 router STALE
fe80::1 dev eth0 lladdr 00:00:5e:00:02:96 router STALE
Это аналог команды arp -n – он показывает кэш MAC-адресов в локальной сети. У них есть несколько состояний, вот граф возможных переходов с сайта technet:

Возможные состояния IPv6 адресов

Сбросить этот кэш можно так:

#ip neigh flush dev eth0

После этого все записи переходят в состояние FAILED, и через несколько секунд удаляются:

#ip -6 neigh show
2001:db8:0:2::1 dev eth0  router FAILED
fe80::85d:8fff:fe1b:7590 dev eth0  router FAILED

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

Дополнительные материалы по теме IPv6:

  1. Курс лекций на youtube – https://www.youtube.com/playlist?list=PLVxaI3iD653BJ9vGb7U03au7JpR4wM-kY
  2. How to IPv6 works – https://technet.microsoft.com/en-us/library/cc781672(v=ws.10).aspx