Mikrotik 6to4 автоматизация при динамическом IPv4

  • Tutorial
Эта статья будет полезна тем, кто хочет испытать IPv6 по протоколу инкапсуляции 6to4, но имеющего динамический IPv4.

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 EXTif "ext"
:local TUNif "6to4tun"
:local LOCif "local"
###############################################

:local EXTipv4 [/ip address get [find interface=$EXTif] address];
:local TUNipv4 [/interface 6to4 get [find name=$TUNif] local-address];

:for i from=( [:len $EXTipv4] - 1) to=0 do={ 
	:if ( [:pick $EXTipv4 $i] = "/") do={ 
		:set $EXTipv4 ([:pick $EXTipv4 0 $i]);
	}
}

: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 oct
	:local ipv6 "2002:"
	:local tmp 0
	:local c 0
	:local ipv4 $1
	:for i from=0 to=( [:len $ipv4] - 1) do={ 
		:if ( [:pick $ipv4 $i] = "." || [:pick $ipv4 $i] = "/") do={ 
			:set oct ([:pick $ipv4 $tmp $i])
			:set tmp ($i+1)
			:set ipv6 ("$ipv6".[$dec2hex $oct])
			:if ( c =1 || c =3) do={ 
				:set ipv6 ("$ipv6".":")
			}
			:set c (c+1)
		}
	}
	:return ($ipv6)
}
:if ( $TUNipv4 != $EXTipv4 ) do={
	/interface 6to4 set [find name=$TUNif] local-address=$EXTipv4
	/ipv6 address remove  [find interface=$TUNif]
	/ipv6 address remove  [find interface=$LOCif]
	:local ipv6new [$6to4prefix ($EXTipv4."/")]
	:log info ($ipv6new)
	/ipv6 address add interface=$TUNif advertise=no address=("$ipv6new".":1/48")
	/ipv6 address add interface=$LOCif advertise=yes address=("$ipv6new".":1/64")
}

В скрипте нужно установить переменные, отвечающие за интерфейсы, которые мы настраиваем:

  • EXTif — внешний интерфейс
  • TUNif — туннельный интерфейс
  • LOCif — локальный интерфейс

Запустив скрипт, мы получим сконфигурированный туннель и локальный интерфейс с префиксом /64.

Теперь добавим этот скрипт в планировщик (я запускаю каждые 5 минут), и при смене внешнего IPv4, с небольшой задержкой 6to4 будет перенастроен.

Какие сложности вас ждут?


Клиенты получают IPv6 с помощью SLAAC, и нет возможности задать DNS и шлюз (Win клиенты получают только шлюз через RA). В Mikrotik есть DHCPv6, но толку от него ещё мало (не доделан он в полной мере).

Для поддержки DNS в самом Mikrotik выставляем известные публичные сервера (к примеру 2620:0:ccc::2 и 2620:0:ccd::2), у клиентов можно настроить link local адрес Mikrotik.
Поделиться публикацией

Похожие публикации

Комментарии 10

    0
    >нет возможности задать DNS и шлюз
    Шлюз через Router Advert прекрасно анонсируется (Микротик это умеет).
    Даже DHCPv6 предполагает использование RA для определения шлюза.
    DNS, в принципе, также можно анонсировать в RA (Галочка Advertise DNS в настройках ND), но вот этого Win не понимает.

    А еще есть специальный anycast адрес т.н. «subnet-router», только о нем мало кто слышал…
      0
      Я это и имел в виду, что Win клиент не понимает многое. Внесу это уточнение.
      0
      EXTif — внешний интерфейс
      понятно — это WAN
      TUNif — туннельный интерфейс
      понятно — это туннель
      LOCif — локальный интерфейс
      непонятно, что тут подразумевается под local int?
        0
        Int там нет, там if, от interface (или как еще сокращают, iface)
        LOCif обозначает интерфейс локальной сети. Вроде все ясно… Или я не понял вопроса.
          0
          Спасибо, стало понятно.
          А адрес-то 2002:: не настоящий, даешь в массы чистый IPv6.
          0
          Лупбэк на локалхосте, вестимо.
          0
          Не работает скрипт почему-то.
          Если запускать его через import filename verbose=yes, то выполнение останавливается
          в самом начале:
          image

          Если попробовать убрать настроечные переменные и заменить их везде на реальные имена интерфейсов, то скрипт останавливается
          здесь:
          image

          Версия ОС — была 6.31, обновил до 6.39 — одинаково не работает.
            0
            Вопрос к вам, а зачем вы используете команду import для запуска скрипта?
            Вообще, скрипт нужно поместить в хранилище скриптов (winbox -> system -> scripts), задать ему права (для этого скрипта достаточно read, write, test).
            И уже после этого, скрипт можно запускать командой run (или из меню winbox).
              0
              Import — просто для отладки. Я с Mikrotik не очень близко знаком, и не знаю, как еще отлаживать скрипты. Так-то я, конечно, сначала поместил скрипт именно в хранилище скриптов, и запускал через кнопку Run, а к import перешел уже после того, как увидел, что выполнение скрипта не дает никакого результата.
              Может, дело в разнице версий? У вас какая версия RouterOS?
                0
                Писал скрипт под 6.38.1, но работает и под 6.39.1
                Попробуйте разбавить скрипт конструкцией
                :log info ("Отладочный текст")
                

                В логах увидите, где тормозится скрипт.
                Обратите внимание на вот этот участок кода, почти в самом конце:
                :if ( $TUNipv4 != $EXTipv4 ) do={
                


                Как я писал в статье, что-бы вам настроил скрипт, у вас должен стоять «не правильный» локальный адрес на туннельном интерфейсе.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое