# Mikrotik 6to4

{% stepper %}
{% step %}

### Начальные условия

Провайдер предоставляет Internet через L2TP соединение. IP адрес прямой без NAT, динамический — меняется раз в сутки (или при переподключении L2TP соединения).
{% endstep %}

{% step %}

### Создание туннеля

1. Регистрируемся на сайте <https://tunnelbroker.net/>
2. Создаём обычный туннель: Create Regular Tunnel
3. В поле "IPv4 Endpoint (Your side):" указываем внешний IPv4 адрес. В "Available Tunnel Servers:" выбираем ближайший сервер (или по минимальному ping).
4. После создания туннеля откроется страница с информацией о нём.

На странице туннеля конфигурируем MTU туннеля. На вкладке Advanced изменяем MTU на значение, вычисленное на предыдущем шаге minus 20.

Пример:

```
MTU для Internet = 1460
1460 - 20 = 1440
Задаём значение 1440
```

По умолчанию туннель имеет значение MTU = 1480 (1500 - 20).
{% endstep %}

{% step %}

### Конфигурация Mikrotik

#### Создание туннельного интерфейса

На вкладке Example Configurations выбираем пример конфигурации для Mikrotik — автоматически будут подставлены IP адреса туннеля.

Заменяем значения:

* `local-address` — локальный адрес роутера (обычно `192.168.88.1`)
* `mtu` — значение, заданное для туннеля на предыдущем шаге

Пример (в примере используются несуществующие IPv6 адреса):

```
/interface 6to4 add comment="Hurricane Electric IPv6 Tunnel Broker" disabled=no local-address=<LOCAL_IP_ADDR> mtu=<CALCULATED_MTU> name=sit1 remote-address=216.66.84.46
/ipv6 route add comment="" disabled=no distance=1 dst-address=2000::/3 gateway=2001:db8:1:fcc::1 scope=30 target-scope=10
/ipv6 address add address=2001:db8:2:fcc::2/64 advertise=no disabled=no eui-64=no interface=sit1
```

#### Выделение IPv6 адреса клиентам в локальной сети

Подставляем значения:

* `Routed /64` — IPv6 подсеть, указанная на странице туннеля
* `MTU` — значение, вычисленное ранее. Можно не устанавливать, если MTU Discovery работает.

```
/ipv6 address add address=<Routed /64> interface=bridge advertise=yes
/ipv6 nd set [ find default=yes ] advertise-dns=yes mtu=<MTU>
```

#### Конфигурация DNS

tunnelbroker.net предоставляет свой DNS сервер — можно использовать `2001:470:20::2`. Или, например, DNS серверы от Cloudflare.

```
/ip dns set allow-remote-requests=yes servers=2606:4700:4700::1111,2606:4700:4700::1001,2001:470:20::2,1.1.1.1,1.0.0.1
```

{% endstep %}

{% step %}

### Проверяем что всё работает

Команды и ресурсы для проверки:

```
ping6 google.com
```

Веб-сервисы:

* <https://test-ipv6.com/>
* <http://ipv6-test.com/>
  {% endstep %}

{% step %}

### Обновление настроек туннеля при смене внешнего IPv4 адреса

Tunnelbroker предоставляет API для обновления IPv4 адреса туннеля со стороны пользователя.

Ниже — скрипт для Mikrotik. Замените значения:

* `TUNEL_ID` — значение на вкладке IPv6 Tunnel
* `USER_ID` — значение на вкладке Advanced
* `UPDATE_KEY` — значение на вкладке Advanced
* `WAN_INTERFACE_NAME` — имя интерфейса с внешним IPv4 адресом (в примере — L2TP интерфейс)

Скрипт:

```bash
/system script
add dont-require-permissions=no name=updatet owner=admin policy=read,write,policy,test source="# Update Hurricane Electric IP\
    v6 Tunnel Client IPv4 address\
    \n\
    \n:global wanip\
    \n\
    \n:local userid \"<USER_ID>\"\
    \n:local updatekey \"<UPDATE_KEY>\"\
    \n:local tunnelid \"<TUNEL_ID>\"\
    \n:local remotehostname \"ipv4.tunnelbroker.net\"\
    \n:local waninterface \"<WAN_INTERFACE_NAME>\"\
    \n\
    \n:local outputfile \"tunnel-update-api-output\"\
    \n\
    \n:local currentip [/ip address get [/ip address find interface=\$waninterface] address ]\
    \n\
    \n:put \$wanip\
    \n:put \$currentip\
    \n:if ( \$wanip != \$currentip ) do={\
    \n\
    \n:set \$wanip \$currentip\
    \n\
    \n:log info \"Updating IPv6 Tunnel\"\
    \n\
    \n/tool fetch mode=https \\\
    \n                  host=(\$remotehostname) \\\
    \n                  url=\"https://\$userid:\$updatekey@ipv4.tunnelbroker.net/nic/update\?hostname=\$tunnelid\" \\\
    \n                  dst-path=(\$outputfile)\
    \n\
    \n/file remove \$outputfile\
    \n\
    \n}\
    \n\
    \n"
```

Создаём расписание для выполнения скрипта, например:

```
/system scheduler add interval=10s name=trigger on-event=updatet policy=read,write,policy,test start-date=feb/1/2019 start-time=19:00:00
```

{% endstep %}
{% endstepper %}

#### Настройка IPv6 Firewall еслинет дефконфигурации <a href="#firewall" id="firewall"></a>

Не забываем о безопасности устройств в сети. Добавляем минимум необходимых правил в Firewall (`IPv6 -> Firewall`) от нежелательного трафика:

```
/ipv6 firewall filter add chain=input in-interface=ether10-wan action=drop connection-state=!established,related
/ipv6 firewall filter add chain=input in-interface=sit1 action=drop connection-state=!established,related
/ipv6 firewall filter add chain=forward in-interface=ether10-wan action=drop connection-state=!established,related
/ipv6 firewall filter add chain=forward in-interface=sit1 action=drop connection-state=!established,related
```

ether10-wan - WAN интерфейс, правила с указанием этого интерфейса фильтруют паразитный IPv6 трафик, который может прийти со стороны провайдера.

sit1 - 6to4 туннель, в котором курсирует наш основной IPv6 трафик.
