Туннелирование «6to4» – переходный механизм, описываемый в RFC 3056. Как и в других подобных костылях, тут используется инкапсуляция пакета IPv6 внутри пакета IPv4 для его транспортировки в IPv4-сетке. Что в этом механизме удобно, так это возможность автоматической трансляции адресов v6 —> v4, и сеть IPv4 рассматривается в нем как одна большая NBMA (non-broadcast multiaccess), а не как набор отдельных линков «точка-точка».
Возьмем типовую схему:
Три узла, за каждым из которых находится IPv6 LAN, связаны через сеть IPv4. Один из способов соединить эти LAN между собой – настроить индивидуальные туннели IPv6 —> IPv4 в стиле «каждый с каждым». Относительно удобное решение, когда узлов действительно всего 3, но этот вариант совершенно не масштабируется, так как для N узлов, получается, понадобится организация N*(N-1)/2 туннелей (для 10 узлов придется рисовать уже 45 штук).
Более эффективное решение – использование автоматического туннелирования 6to4. Работает такой способ благодаря зарезервированному IPv6-префиксу 2002::/16. Для транспортировки IPv6-трафика по IPv4-сети, коей в настоящее время и является обычный Интернет, туннельный интерфейс автоматически преобразует 32 бита собственного адреса, следующие за вышеназванным префиксом, в глобальный юникастовый IPv4-адрес. Взглянем на конфигурацию.
Настройка 6to4
Для организации 6to4 надо создать туннельный интерфейс на каждом маршрутизаторе-участнике процесса. Потребуется обозначить три ключевых момента:
- Режим туннеля (6to4)
- Источник туннеля (интерфейс либо адрес IPv4)
- IPv6-адрес для 6to4 (из сетки 2002::/16)
Для R1 первые два пункта:
R1(config)# interface tunnel0 R1(config-if)# tunnel mode ipv6ip 6to4 R1(config-if)# tunnel source 172.16.1.1
Чтобы определить IPv6-адрес туннельного интерфейса, переводим IPv4, указанный нами в качестве источника туннеля, в шестнадцатеричную форму. Таким образом, 172.16.1.1 превращается в ac10:0101. После чего добавляем результат к префиксу 6to4 (2002::/16), а оставшееся место заполняем нулями. В примере используется маска /128, но допустимы и другие префиксы.
R1(config-if)# ipv6 address 2002:aс10:101::/128
R2(config)# interface tunnel0 R2(config-if)# tunnel mode ipv6ip 6to4 R2(config-if)# tunnel source 172.16.2.1 R2(config-if)# ipv6 address 2002:aс10:201::/128
R3(config)# interface tunnel0 R3(config-if)# tunnel mode ipv6ip 6to4 R3(config-if)# tunnel source 172.16.3.1 R3(config-if)# ipv6 address 2002:aс10:301::/128
Обращаю внимание, что, в отличие от настройки туннелей «точка-точка», здесь не указывается удаленный конец туннеля.
Теперь, когда известен адрес 6to4 каждого маршрутизатора, можно добавить необходимые статические маршруты для организации связности рутеров меж собой. На каждом необходимо добавить по три маршрута. Первый маршрут сообщает, что сеть 2002::/16 доступна через интерфейс Tunnel0. Два других являются маршрутами к префиксам /64 других узлов (см. схему выше), проходящими через туннель 6to4.
R1
ipv6 route 2002::/16 tunnel0 ipv6 route 2012:bd5:0:2::/64 2002:ac10:201:: ipv6 route 2012:bd5:0:3::/64 2002:ac10:301::
R2
ipv6 route 2002::/16 tunnel0 ipv6 route 2012:bd5:0:1::/64 2002:ac10:101:: ipv6 route 2001:bd5:0:3::/64 2002:ac10:301::
R3
ipv6 route 2002::/16 tunnel0 ipv6 route 2012:bd5:0:1::/64 2002:ac10:101:: ipv6 route 2012:bd5:0:2::/64 2002:ac10:201::
R1# ping 2012:bd5:0:2::1 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 2012:BD5:0:2::1, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 8/18/28 ms R1# ping 2012:bd5:0:3::1 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 2012:BD5:0:3::1, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 6/7/8 ms
Принцип действия 6to4
Логика работы туннелирования 6to4 проста как кирзовый сапог. Если проследить путь IPv6-пакета от хоста за R1 до хоста за R2, получится вот что. Пакет формируется обычным образом и включает в себя адрес отправителя + адрес получателя. Эти адреса не меняются в процессе дальнейшей транспортировки этого пакета.
R1 получает этот пакет и заглядывает в свою маршрутную табличку с целью узнать, как найти адресата.
R1# show ipv6 route IPv6 Routing Table - 7 entries Codes: C - Connected, L - Local, S - Static, R - RIP, B - BGP U - Per-user Static route, M - MIPv6 I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea, IS - ISIS summary O - OSPF intra, OI - OSPF inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2 ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2 D - EIGRP, EX - EIGRP external C 2012:BD5:0:1::/64 [0/0] via ::, Loopback0 L 2012:BD5:0:1::1/128 [0/0] via ::, Loopback0 S 2012:BD5:0:2::/64 [1/0] via 2002:AC10:201:: S 2012:BD5:0:3::/64 [1/0] via 2002:AC10:301:: S 2002::/16 [1/0] via ::, Tunnel0 LC 2002:AC10:101::/128 [0/0] via ::, Tunnel0 L FF00::/8 [0/0] via ::, Null0
Лучшее совпадение – статический маршрут 2012:bd5:0:2::/64, next-hop которого 2002:aс10:201::. Тут включается рекурсивный поиск маршрута к 2002:aс10:201::. Лучшее (и единственное) совпадение – маршрут через интерфейс Tunnel0 (обращаю внимание, что IP-адрес для next-hop в этом маршруте не указан).
Вот тут и выходит на сцену 6to4. Наш пакет при отправке в Tunnel0 инкапсулируется внутрь IPv4. Адрес отправителя в заголовке нового пакета берется из источника туннеля. Адрес получателя вычисляется по адресу next-hop маршрута до 2012:bd5:0:2::/64, т. е. 2002:aс10:201:: преобразуется в 172.16.2.1 (аналогично тому, что делалось раньше, но теперь в обратном направлении).
Инкапсулированный пакет маршрутизируется по сети IPv4 и попадает на узел R2. Заголовок IPv4 откусывается по достижении интерфейса 172.16.2.1, а оставшийся пакет IPv6 отправляется в LAN к своему адресату.
В этом примере используются статические маршруты. Обращаю внимание, что протоколы внутренней маршрутизации (например, EIGRP и OSPFv3) не могут использоваться при работе с туннелями 6to4, т. к. IPv6-адреса типа link-local (они нужны при формировании связности рутеров в этих протоколах) в туннелях 6to4 не поддерживаются. А вместо них можно использовать BGP, в котором поддерживаются связи на основе глобальных IPv6-адресов.
Также следует помнить, что, несмотря на NBMA-природу, 6to4 все же остается туннелем, которому нужны входной/выходной интерфейсы с адресами IPv6. Такие туннели не получится использовать для связи узлов IPv4-IPv6 напрямую.