Настройка IPv6 на Cisco IOS: включение маршрутизации, назначение адресов и проверка связности.
Какая команда включает IPv6-маршрутизацию на Cisco?
Какая команда является аналогом show ip arp для IPv6?
Что нужно указать при настройке статического IPv6-маршрута с Link-Local next-hop?
Когда создаётся Link-Local адрес на интерфейсе Cisco?
Какой код маршрута в show ipv6 route означает подключённую сеть?
После того, как мы прошли теорию, касающуюся IPv6, по большому счету там всё то же самое, что в IPv4, только есть небольшие отличия. Небольшие отличия заключаются в первую очередь в том, что IP-адреса больше, потому что их самих больше. И заголовок немножко другой. А так всё взаимодействие то же самое. Cisco старается сделать настройку IPv6 очень похожей на настройку IPv4. Поэтому, по большому счету, все команды, которые вы будете видеть сейчас про настройку IPv6, точно такие же, как мы привыкли работать с IPv4. В Cisco всё, если мы говорим про какие-то актуальные версии софта, поддерживает IPv6. Может быть такое, что IPv6 на вашей железке будет немножко, скажем, придушенный, деактивированный, и вы должны будете его как-то включить. Но тем не менее, в любом случае, IPv6 на современных Cisco вы включить можете без особых проблем. Если это роутер, достаточно будет включить маршрутизацию IPv6,
потому что по умолчанию IPv6 на роутерах выключен. Вы можете повесить IPv6-адрес на роутер, но это не включает функцию маршрутизации. Если у вас есть железка, на которой у вас четыре разных интерфейса, вы можете на них включить IPv6-адреса. У вас будет здесь адрес, здесь адрес, здесь адрес и здесь адрес. Но роутер не будет по умолчанию заниматься маршрутизацией трафика, и пакеты, которые приходят на его собственный IP-адрес, он обрабатывать будет. А пакеты, которые приходят не на его собственный IP-адрес, он обрабатывать не будет. Что касается цисковских свитчей, там тоже IPv6-адрес повесить можно, но есть нюанс. Нюанс заключается в том, что на цисковских свитчах есть специальная хитрая быстрая память. И эта быстрая память распределяется под разные механизмы. Немножко под таблицу коммутации, немножко под таблицу маршрутизации. Это на самом деле одна и та же память, по большому счету одна и та же микросхема ей занимается.
Но под разные механизмы вы должны будете выделять разное количество памяти, при том что всего этой памяти фиксированное и ограниченное количество. И вы не можете в совершенно произвольных пропорциях разделять на свитчах эту память по разным механизмам. Вы можете воспользоваться только готовыми шаблонными разделениями, если хотите. И команда, которая включает IPv6 на свитче, которая выделяет немножко памяти под IPv6, выглядит таким образом. Если вы на свитче захотите включить IPv6, по умолчанию контекста IPv6 у вас может не быть, но если вы введёте эту команду и перезагрузитесь, у вас контекст IPv6 появится. Дальше, если вы хотите маршрутизацию IPv6 включить, вы должны будете включить её вот такой командой. На самом деле для IPv4 есть аналогичная команда, которая включает и выключает маршрутизацию. Это ip routing. Если вы хотите, вы можете выключить маршрутизацию на роутере командой no ip routing, и ваш роутер превратится тоже в такого ежика,
у которого много интерфейсов, на них есть IP-адреса, но только он между этими интерфейсами трафик не перекладывает. Но в IPv6 это надо включать в явном виде, а в IPv4 эта штука уже включена изначально из коробки. Дальше. Вы можете, если захотите, посмотреть текущее состояние IPv6 на интерфейсе командой show ipv6 interface. В IPv4 было show ip interface, здесь show ipv6 interface. Если вы хотите, чтобы у вас на интерфейсе IPv6 включился, то вам надо иметь на интерфейсе хотя бы что-то, относящееся к IPv6, хотя бы link-local address. Если вы не хотите задавать другие IPv6-адреса, а хотите только link-local address задать, для этого есть специальная команда ipv6 enable. В принципе, IPv6 включается путём повешения любого адреса. Вы можете что угодно сказать. Можете ручками повесить IP-адрес, можете сконфигурировать автоматический адрес. Но если вы хотите, чтобы никаких маршрутизируемых адресов не было,
а был только link-local address, то вы указываете ipv6 enable, и этого достаточно. После чего show ipv6 interface вам покажет, что IPv6 на интерфейсе работает, link-local address у вас сгенерировался, команда ipv6 enable, и показывается, что ваш интерфейс сгенерировал этот адрес, и по факту того, что вы имеете IPv6-адрес на интерфейсе, вы присоединились к двум мультикастовым группам. Первая группа — вообще все, FF02::1, и вторая группа — это SNMA-адрес FF02::1:FF00::1. Это хвостик вашего IPv6-адреса. Обратите внимание на то, что если вы генерируете адрес по схеме EUI-64, у вас MAC-адрес разъезжается на две части. Соответственно, это то, что было OUI с флипнутым битом, а это то, что было vendor assigned ID. И эти последние 24 бита vendor assigned ID
здесь в SNMA-группе 24 бита vendor assigned ID и будут. Поэтому, скорее всего, ни у кого таких же последних 24 битов, как у вас, не будет. И вы в этой мультикастовой группе — все узлы, которые заканчиваются на определённые 24 бита — будете один-единственный. Далее. Что ещё здесь интересного есть? Наверное, ничего. Здесь таймеры Neighbor Discovery. У вас по умолчанию включен механизм Neighbor Discovery Duplicate Address Detection. И когда вы пытаетесь назначить себе IP-адрес, например, этот link-local адрес, вы один раз пытаетесь проверить, свободен он или нет. Можно Cisco заставить много раз проверять или вообще не проверять, свободен адрес или нет. Но по умолчанию из коробки один раз она проверяет. И после того, как вы распознали адрес соседа, в течение 30 секунд вы будете знать, что сосед будет доступен. Фича в том, что с помощью механизма обнаружения соседей Neighbor Discovery
вы можете не просто определять канальный адрес соседа, а вы можете ещё и своего рода проверку на живость этого соседа осуществлять. Если вы отправляете Neighbor Solicitation на его юникастовый адрес, на его SNMA-группу, и он вам отвечает, то значит он живой. И вы можете в специальной отдельной табличке вести список живых соседей. Это же, кстати, работает и с роутерами. Если у вас есть какой-то узел IPv6, и у него есть шлюз по умолчанию, и, соответственно, у нас есть какой-то выход в интернет, к примеру, через него, вы можете вести взаимодействие с этим роутером, периодически его подёргивая за хвост, типа «ты ещё живой, ты ещё живой». И как только он вам перестаёт своим Neighbor Advertisement отвечать, вы говорите: «О, у вас интернет сдох». И показывается жёлтая лампочка. Вот такая штуковина. Далее. Если вы хотите вручную заданный адрес повесить,
делается это с помощью той же самой команды, что было в IPv4. В IPv4 было ip address, здесь ipv6 address, и дальше IP-адрес, который вы хотите назначить. Есть нюанс. Вы не должны при этом писать ipv6 enable. ipv6 enable — это «я хочу включить самое простое взаимодействие в IPv6, не генерируя никакие специальные другие адреса, кроме link-local». Если вы включаете вручную заданный IPv6-адрес, то при этом у вас автоматически включается link-local адрес, отдельную команду ipv6 enable делать не нужно. И после того, как вы повесили IP-адрес на интерфейс, если вы при этом являетесь и роутером тоже, то у вас автоматически начинают рассылаться RA, Router Advertisements. А если вы не роутер, если вы не выполнили команду ipv6 unicast-routing, то не начинается. Если вы роутер, то вы автоматически начинаете учить другую жизнь и рассказывать, что в той IP-сети, к которой вы присоединились,
как, например, здесь 2001:DB8:1:6:5:6:6:6, первые 64 бита, вы начинаете рассказывать: «Ребята, присоединяйтесь к той сети, которая есть у меня, и мы все будем с вами в одной сети». Опять же, здесь мы видим, что у нас есть link-local адрес. show ipv6 interface показывает, что link-local адрес у нас сгенерировался, и он сгенерировался, опять же, по схеме EUI-64. Вот оно FFFE, очень хорошо заметное. Соответственно, вторая часть MAC-адреса, первая часть MAC-адреса с флипнутым битом. И показывается, к каким мультикастовым группам мы присоединились. FF02::1 — вообще все безоговорочно присоединяются. FF02::1:FF00::1. Что это за адрес? Это SNMA-адрес для IP-адреса, заканчивающегося на ::1. Вот этот адрес. Это тот IP-адрес, который мы повесили. И рядышком ещё одна SNMA-группа.
SNMA для адреса, заканчивающегося на ::0. Вот он, этот адрес, заканчивающийся на ::0. У нас два IP-адреса, они заканчиваются на разное. Один сгенерирован автоматически, другой ручками. У них разные хвосты. И поэтому мы присоединились к двум мультикастовым SNMA-группам. Если бы на этом роутере была предварительно выполнена команда ipv6 unicast-routing в глобальном конфиге, то тогда наш роутер начал бы рассылать Router Advertisements. И тогда он бы присоединился к группе FF02::2. Все роутеры. Но здесь мы видим, что он не присоединился. Поэтому мы точно знаем, что эту команду он не вводил. И поэтому Router Advertisements не рассылаются. Если бы ввёл, рассылались бы. Если вдруг у вас есть два роутера, соответственно, на одном мы ввели команду ipv6 unicast-routing,
у вас есть другой роутер Cisco, и вы хотите автоматически получить IPv6-адрес на интерфейсе с помощью механизма Router Solicitation, Router Advertisement, который является частью Neighbor Discovery, вы можете это сделать. В нормальной ситуации, если вы возьмёте какой-то обычный узел конечного абонента — Windows, Linux, Android, iPhone — у них уже штатно эта фича включена. Они автоматически желают получать адреса по автоматическому механизму назначения адресов, который называется SLAAC, Stateless Address Autoconfiguration. Но Cisco — это особый случай, потому что Cisco — это роутер, и вообще говоря, все сетевые настройки вы, как администратор, должны ей давать в явном виде. Поэтому если вдруг вы хотите, чтобы какие-то настройки она сама себе придумала, вам нужно выполнить специальную команду. На интерфейсе ipv6 address autoconfig. Это даёте вы разрешение Cisco на автоматическое получение адреса на этом интерфейсе, когда кто-то другой вам пришлёт RA, и вы по этой RA сгенерируете себе адрес.
Если хотите, можете ещё и шлюзом по умолчанию его сделать. По умолчанию Cisco этого не делает. И, соответственно, show ipv6 interface, если у вас сгенерировался таким образом адрес, покажет, что у вас есть link-local address. Вот он. Дальше. Покажется, что у вас генерируется адрес по SLAAC, Stateless Address Autoconfiguration Enabled. Покажется, какой адрес получил ваш интерфейс. 2001:DB8:1:6:5. Это то, что вам рассказал сосед. А дальше всё остальное вы сгенерировали по схеме EUI-64. И видно, что эта часть адреса и эта часть адреса очень похожи друг на друга. Фактически это одно и то же. Всё сгенерировано по схеме EUI-64. Эта часть — это vendor assigned ID, одинаковый. Эта часть — это последний хвост MAC-адреса, тоже одинаковое. И, как следствие, SNMA-группа для обоих этих адресов будет одинаковая. Все адреса, которые у вас есть, заканчиваются на одинаковые биты, и нет необходимости присоединяться к двум разным группам.
Дальше. Показывается, из какой сетки придумался этот IP-адрес. То, что вам прислали — сеть 2001:DB8:16:5. И показывается, как именно и почему именно, с какими свойствами вы сгенерировали адрес. Вот это EUI. Здесь понятно, этот адрес сгенерирован по схеме modified EUI-64. Дальше. Показывается CAL. Вот это CAL. Очень сложно догадаться, что это означает, если вы не знаете. Я же вам ещё не рассказывал, поэтому вы не знаете. Но это обозначает, что у этого адреса есть срок жизни. CAL обозначает «календарь». Да, неочевидное немножко слово. Я иногда ради смеха людей, которые считают, что они знают, как Cisco работает с IPv6, спрашиваю, а что вот это такое? Я заметил, что очень мало кто знает, что это вообще. Обычно даже люди, которые на ежедневной основе работают с IPv6, теряются.
И более того, в документации для того, чтобы добраться, что это за CAL такой, нужно стоптать семь железных башмаков. А PRE обозначает, что у адреса есть срок жизни. И когда у адреса есть срок жизни, этот адрес проходит через определённые стадии. У вас возникает желание назначить себе адрес, и это как бы точка ноль. Дальше. В течение некоторого времени стадия tentative, вы под вопросом, не уверены, можно ли использовать этот адрес, вы запускаете процедуру Duplicate Address Detection. Дальше, после того как вы проверили, что адрес действительно свободный, не занятый, вы запускаете нормальную работу этого адреса. И эта стадия называется preferred. Preferred. В течение срока preferred вы нормально работаете с IP-адресом, вы можете устанавливать новые подключения из-под него, вы можете принимать пакеты на этот адрес, никаких ограничений на работу с ним нет.
После того как заканчивается срок preferred, и вы не можете почему-то продлить этот срок по каким-то соображениям, дальше начинается следующий срок, который называется valid. Valid, но не preferred. Это значит, что вы этим адресом всё ещё можете пользоваться, он всё ещё валидный, но он уже непредпочитаемый. Вы можете принимать пакеты, которые приходят на этот адрес, но вы не должны осуществлять новые подключения из-под этого адреса. И после того как valid заканчивается, адрес становится invalid. Сейчас мы находимся в стадии preferred. Это PRE показывает, что с адресом всё хорошо, всё в порядке, он рабочий, можно пользоваться им без ограничений. Времена, которые к вам приходят, они задаются у вас в настройках, и показывается, что valid lifetime — это 2 591 000 секунд,
и, соответственно, preferred lifetime — это 604 000 секунд. Стандартные настройки Cisco — preferred lifetime неделя и valid lifetime месяц. И здесь больше ничего особого нет. А, вот это ещё штука, последняя строчка, которая не была раньше. После того как вы выполнили команду address autoconfig default, слово default указывает на то, что вы можете поставить шлюзом по умолчанию того, кто вам прислал эту RA. И обратите внимание на такой момент. В IPv4 мы в таблице маршрутизации обычно видим в качестве указания адреса шлюза адреса маршрутизируемые. Это, вообще говоря, ни за чем не нужно. По большому счету этот адрес вообще нигде не фигурирует. Но тем не менее мы просто не можем использовать никакие другие адреса, потому что в IPv4 других адресов нет. Они есть только маршрутизируемые и ещё APIPA, с которыми неудобно работать.
В IPv6 чаще всего шлюзом по умолчанию у вас будет link-local address, потому что чаще всего он назначается автоматически, А все механизмы, которые автоматически работают, они видят, кто в пределах канала является у вас шлюзом. Поэтому никаких проблем здесь не будет. У вас показывается, что шлюз по умолчанию — это link local address. Он не маршрутизируемый, и это не страшно. Это нормально. Когда у вас есть узел, который хочет отправлять пакеты в интернет, ему достаточно знать канальный адрес соседа. Из link local канальный адрес получается точно так же, как из маршрутизируемого. Вы можете вручную добавить шлюз по умолчанию маршрутизируемый, или вы можете вручную добавить шлюз по умолчанию link local. На результат это вообще никак не скажется. Результат будет точно такой же. Пакеты будут посылаться на MAC-адрес роутера, или на канальный адрес роутера. И без разницы, вы узнаете этот MAC-адрес из этого link local или из маршрутизируемого адреса, который вы вручную зададите. Поэтому в IPv6 у вас шлюз по умолчанию или вообще next hop для какого-то маршрута
может быть link local адрес. Это не проблема. Это, напротив, выгодно для маршрутизатора, потому что такие адреса легче обрабатывать. И из этого следует, например, что если у вас есть какой-то узел, компьютер, он подключается к роутеру, он подключается к роутеру, и всё это дело смотрит в интернет. Маршрутизируемые адреса вам достаточно иметь только вот тут. Фишка в том, что если вы хотите сказать, что у вас есть два роутера, которые между собой не имеют IPv4 адресов, они у вас не смогут друг на друга маршруты поставить. А в IPv6 они могут друг на друга поставить маршруты, потому что у них у обоих есть link local адреса. И у вас все маршруты будут устанавливаться именно на эти link local адреса. Это прекрасно работает. Никаких специальных настроек для этого делать не надо. И соответственно у вас получается, что для этих сетей не нужно иметь маршрутизируемые IPv6 адреса. Оно и так будет работать.
В таблице маршрутизации, когда у вас есть роутер для IPv6, у вас всё точно то же самое происходит, как в IPv4. Команда в IPv4 была, которая показывала таблицу маршрутизации — show ip route, в IPv6 — show ipv6 route. Точно так же показывается здесь легенда. И точно так же, когда вы назначаете какой-то адрес себе, у вас появляется маршрут локальный на ваш собственный IP-адрес. По максимально возможной маске: в IPv4 была /32, в IPv6 — /128. И показывается, что все остальные маршруты в этой сети, в которой вы себе назначили IP-адрес, будут connected на интерфейсе. Точно так же вы можете сделать статический маршрут. И этот статический маршрут точно так же будет добавляться. Команда точно та же самая, ничего не меняется. ip route была, только ipv6 route стала. Указываете IP-адрес, указываете маску, только уже не отдельным параметром, а слитно. И указываете шлюз. Можно указать шлюз по умолчанию.
Можно указать шлюз в команде ip route или ipv6 route, маршрутизируемый в нашем случае. Здесь я как раз показал пример, как маршрутизируемый IP-адрес добавляется. Но ничего плохого нет, если вы добавите маршрут по умолчанию ::/0 — это маршрут по умолчанию — через link local адрес. Правда, когда вы работаете с link local адресами, вы должны указывать обязательно интерфейс. Потому что link local адреса одинаковые на всех интерфейсах. Непонятно, из какого именно интерфейса трафик должен уходить. Traceroute не будет показывать примерно ничего, если между маршрутизаторами link local адреса. Да, по большому счёту с traceroute будут некоторые технические сложности, но никто вам не мешает на каждом маршрутизаторе сделать один единственный loopback-адрес /128. И соответственно у вас эти адреса, как единственные неповторимые доступные, будут использоваться при выборе адреса источника
для исходящих IP-пакетов. Traceroute можно заставить, чтобы он работал корректно, и это даже совсем несложно делается. Traceroute в IPv6, конечно же, остался. Никаких сложностей ни с ping, ни с traceroute, ни с чем нет. Буквально следующий слайд у нас показывает на то, что всё работает предсказуемо, привычно. Если хотите попингать соседа — ping и дальше IP-адрес. Хотите протрейсить соседа — traceroute и IP-адрес. Хотите подключиться — telnet и IP-адрес. Более того, в реальности чаще всего мы используем не IPv6-адреса, а DNS. И соответственно вместо этого адреса на самом деле будет router1.company.local. И вы пишете там не ping 2001:db8..., а ping router1.company.local. Он резолвится в DNS в IPv6-адрес, и соответственно Cisco точно так же умеет работать с IPv6-пингами, как с IPv4. Никаких сложностей здесь нет.
Небольшой нюанс заключается в том, что если вы хотите попингать link local address, то вы должны указать, с какого интерфейса этот link local address будет актуален. И вот ping, пробел, дальше link local address, и через процент указываете название интерфейса. И если вы используете такую формулировку, что указание интерфейса через процент после IPv6 link local address, нюанс заключается в том, что вы обязаны указывать название интерфейса полностью именно так, как его называет Cisco. Здесь будет регистрозависимая запись именно с большими буквами GigabitEthernet0/0. Никаких сокращений здесь не допускается. Большие и маленькие буквы тоже будут различаться. Но это вам может один раз в жизни пригодиться, потому что нормальный человек по link local address не работает. Он работает, если работает по IPv6, то либо по каким-то красивым IP-адресам, которые он заранее придумал, либо в 99% случаев, когда это в реальности в продакшене используется,
вы используете DNS. Так что всё то же самое, как в IPv4, ничего не поменялось. Все команды те же самые работают, за очень редкими исключениями. Адрес назначается точно так же. ip address чего-то там превратился в ipv6 address чего-то там. ip route превратилась в ipv6 route. ip routing превратилась в ipv6 unicast-routing. Тонкий намёк на то, что в IPv6 ещё и multicast-routing бывает, но в IPv4 тоже бывает. А в остальном всё то же самое, все те же самые механизмы, всё точно так же привычно работает, ничего не изменилось. Я предлагаю лабу на это не делать, потому что просто обычное назначение IP-адреса на интерфейс — это, конечно, очень увлекательная вещь, но я предлагаю эту лабу оставить на потом, когда у нас будет какая-то более интересная тема. А на сегодня всё. Спасибо за внимание и пока-пока. Спасибо.