Эта статья будет полезна тем, кто хочет испытать IPv6 по протоколу инкапсуляции 6to4, но имеющего динамический IPv4.
Первым делом, проверим, есть ли у вас возможность использовать публичный 6to4 шлюз, пингуем его по адресу: 192.88.99.1. Если пинг идет, читаем дальше.
Итак, для начала, нужно установить модуль поддержки IPv6 (скачиваем Extra packages для вашего устройства с сайта). Из архива вытаскиваем ipv6-*.npk и заливаем его на роутер, затем перезапускаем его.
Теперь у вас есть поддержка IPv6, учтите, что правила firewall для неё нужно делать отдельно.
Далее, создаем специальный интерфейс «6to4 Tunnel», в Remote Adress ставим адрес публичного шлюза, в Local Adress наш текущий публичный IPv4 адрес (или «ошибаемся» в адресе, что-бы скрипт настроил все сам).
В маршрутизации нужно настроить интерфейс туннеля как шлюз по умолчанию (до адреса ::/0).
Теперь можем проверить, есть ли пинг до чего-нибудь из IPv6 (к примеру ipv6.google.com)
Если пинги есть, то идем далее:
В скрипте нужно установить переменные, отвечающие за интерфейсы, которые мы настраиваем:
Скрипт адаптирован для работы в DHCP-CLIENT, так что секцию статических параметров надо закомментировать, если вы будете использовать DHCP.
Запустив скрипт, мы получим сконфигурированный туннель и локальный интерфейс с префиксом /64.
Теперь добавим этот скрипт в планировщик (я запускаю каждые 5 минут), и при смене внешнего IPv4, с небольшой задержкой 6to4 будет перенастроен.
Клиенты получают IPv6 с помощью SLAAC, и нет возможности задать DNS и шлюз (Win клиенты получают только шлюз через RA). В Mikrotik есть DHCPv6, но толку от него ещё мало (не доделан он в полной мере).
Для поддержки DNS в самом Mikrotik выставляем известные публичные сервера (к примеру 2620:0:ccc::2 и 2620:0:ccd::2), у клиентов можно настроить link local адрес Mikrotik.
Mikrotik IPv6
Первым делом, проверим, есть ли у вас возможность использовать публичный 6to4 шлюз, пингуем его по адресу: 192.88.99.1. Если пинг идет, читаем дальше.
Итак, для начала, нужно установить модуль поддержки IPv6 (скачиваем Extra packages для вашего устройства с сайта). Из архива вытаскиваем ipv6-*.npk и заливаем его на роутер, затем перезапускаем его.
Теперь у вас есть поддержка IPv6, учтите, что правила firewall для неё нужно делать отдельно.
Настройка 6to4
Далее, создаем специальный интерфейс «6to4 Tunnel», в Remote Adress ставим адрес публичного шлюза, в Local Adress наш текущий публичный IPv4 адрес (или «ошибаемся» в адресе, что-бы скрипт настроил все сам).
В маршрутизации нужно настроить интерфейс туннеля как шлюз по умолчанию (до адреса ::/0).
Теперь можем проверить, есть ли пинг до чего-нибудь из IPv6 (к примеру ipv6.google.com)
Если пинги есть, то идем далее:
Скрипт автонастройки
##############Script Settings################## :local "IF-TUN" "6to4tun" :local "IF-LOC" "local" :local "POOL-6TO4" "pool_v6-local" :local "force-update" false ############ use then static ip ####################### :local "lease-address" [/ip address get [find interface=$"interface"] address] :local "interface" "ext" :local bound 1 ############################################### :global MAC2EUI64 do={ :local EUI64 "" :local MAC $1 :local HEX2DEC "0123456789ABCDEF" :for i from=0 to=5 step=1 do={ :if ( $i = 0 ) do={ :set EUI64 [:pick $MAC 0] :set EUI64 ($EUI64.[:tostr [:pick $"HEX2DEC" ([:find $"HEX2DEC" [:pick $MAC 1]] ^ 2)]]) } :if ( $i = 1 || $i = 3) do={ :set EUI64 ($EUI64.":") } :if ( $i = 2 ) do={ :set EUI64 ($EUI64."FF:FE") } :if ( [:find $MAC ":"] = 2 ) do={ :set MAC [:pick $MAC 3 [:len $MAC]] :set EUI64 ($EUI64.[:pick $MAC 0 2]) } } :return ($EUI64) } :global dec2hex do={ :local hex "" :local dec [:tonum $1] :for i from=0 to=4 step=4 do={ :set hex ([:pick "0123456789ABCDEF" (($dec>>$i)&0xf) ((($dec>>$i)&0xf)+1)].$hex) } :return ([:tostr $hex]) } :local 6to4prefix do={ :global dec2hex :local ipv4 $1 :local ipv6 "2002:" :for i from=0 to=2 step=1 do={ :if ( $i = 2) do={ :set ipv6 ($ipv6.":") } :local fp [:find $ipv4 "."] :if ( $fp > 0 ) do={ :set ipv6 ($ipv6.[$dec2hex [:pick $ipv4 0 $fp]]) :set ipv4 [:pick $ipv4 ($fp + 1 ) [:len $ipv4]] } } :return ($ipv6.[$dec2hex $ipv4]) } :local "str_replace" do={ :local "str-pos" [:find $1 $2] :local "str-len" [:len $2] :local str "" :local rest $1 :while ($"str-pos" >= 0) do={ :local t [:pick $rest 0 $"str-pos"] :if ( $4 > 0 ) do={ :for i from=1 to=($4 - [:len $t]) step=1 do={ :set str ($str.$5) } } :set str ($str.$t.$3) :set rest [:pick $rest ($"str-pos"+$"str-len") [:len $rest]] :set "str-pos" [:find $rest $2] } :return ($str.$rest) } :if ($bound=1) do={ :local t [:find $"lease-address" "/"] :if ( $t >= 0 ) do={ :set "lease-address" [:pick $"lease-address" 0 $t] } :if ( [/interface 6to4 print count-only where name=$"IF-TUN"] = 0) do={ /interface 6to4 add !keepalive local-address=$"lease-address" mtu=1280 name=$"IF-TUN" remote-address=192.88.99.1 :set "force-update" true } :local "IPv4-TUN" [/interface 6to4 get [find name=$"IF-TUN"] local-address]; :if ( $"lease-address" != $"IPv4-TUN" || $"force-update" = true) do={ /interface 6to4 set [find name=$"IF-TUN"] local-address=$"lease-address" /ipv6 address remove [find interface=$"IF-TUN"] /ipv6 address remove [find interface=$"IF-LOC"] /ipv6 route remove [find gateway ~ $"IF-TUN" and dst-address="::/0"] :local "pool-prefix" [$6to4prefix $"lease-address"] :if ( [/ipv6 pool print count-only where name=$"POOL-6TO4"] = 0) do={ /ipv6 pool add name=$"POOL-6TO4" prefix=($"pool-prefix".":1::/64") prefix-length=64 } else={ /ipv6 pool set [/ipv6 pool find where name=$"POOL-6TO4"] prefix=($"pool-prefix".":1::/64") } /ipv6 address add address=($"pool-prefix"."::".[$MAC2EUI64 [/interface get [find name=$"interface"] mac-address]]."/3") interface=$"IF-TUN" advertise=no /ipv6 address add eui-64=yes from-pool=$"POOL-6TO4" interface=$"IF-LOC" advertise=yes /ipv6 route add dst-address=::/0 gateway=("::192.88.99.1%".$"IF-TUN") :local t [/ipv6 address get [find interface=$"IF-LOC"] address] :set t [:pick $t 0 [:find $t "/"]] :if ( [/ipv6 dhcp-server option print count-only where name=DNS] = 0) do={ /ipv6 dhcp-server option add code=23 name=DNS value=("0x".[$"str_replace" $t ":" "" 4 "0"]) } else={ /ipv6 dhcp-server option set [/ipv6 dhcp-server option find where name=DNS] value=("0x".[$"str_replace" $t ":" "" 4 "0"]) } :if ( [/ipv6 dhcp-server print count-only where interface=$"IF-LOC"] = 0) do={ /ipv6 dhcp-server add address-pool=$"POOL-6TO4" dhcp-option=DNS interface=$"IF-LOC" lease-time=1d name=$"IF-LOC" } :if ( [ipv6 nd print count-only where interface=$"IF-LOC"] = 0) do={ /ipv6 nd add advertise-dns=no interface=$"IF-LOC" other-configuration=yes } } }
В скрипте нужно установить переменные, отвечающие за интерфейсы, которые мы настраиваем:
- interface — внешний интерфейс
- IF-TUN — туннельный интерфейс
- IF-LOC — локальный интерфейс
- POOL-6TO4 — название пула адресов в локальной сети
- force-update — Если установлено true, то считается что ip менялся
- lease-address — Задаем статический адрес
Скрипт адаптирован для работы в DHCP-CLIENT, так что секцию статических параметров надо закомментировать, если вы будете использовать DHCP.
Запустив скрипт, мы получим сконфигурированный туннель и локальный интерфейс с префиксом /64.
Теперь добавим этот скрипт в планировщик (я запускаю каждые 5 минут), и при смене внешнего IPv4, с небольшой задержкой 6to4 будет перенастроен.
Какие сложности вас ждут?
Клиенты получают IPv6 с помощью SLAAC, и нет возможности задать DNS и шлюз (Win клиенты получают только шлюз через RA). В Mikrotik есть DHCPv6, но толку от него ещё мало (не доделан он в полной мере).
Для поддержки DNS в самом Mikrotik выставляем известные публичные сервера (к примеру 2620:0:ccc::2 и 2620:0:ccd::2), у клиентов можно настроить link local адрес Mikrotik.
