Начиная с прошивки 2.08.A.10.0-0 появилась возможность создавать туннели EoIP, GRE, IPIP как в простом виде, так и в сочетании с IPsec.
GRE и IPIP-туннели - это туннели уровня L3, на которых видны IP-адреса обоих сторон. Они представляются в системе в виде интерфейсов GreX и IPIPX, и через них можно прокидывать маршрутизацию (в том числе и default route) точно также, как и через любые другие интерфейсы. Плюс ко всему у них также есть security level. Туннели GRE совместимы со всеми Zyxel ZyWall, Mikrotik, а также Linux-роутерами. В теории должно работать вообще со всем оборудованием, которое умеет GRE, в том числе и Cisco, Juniper, etc. Компоненты называются соответственно gre и ipip.
EoIP-туннель - это туннель уровня L2, потому обмен через него идет на уровне Ethernet-кадров. При этом видны все mac-адреса, и можно объединить две локальные сети на уровне L2 через Интернет при помощи этого типа туннеля. На нем кроме IP можно гонять любой трафик, в том числе и ARP, DHCP, PPPoE, IPv6, etc. По умолчанию в туннеле при смене security level на private/protected будет работать сканирование подсети посредством ARP. Туннели EoIP разработаны Mikrotik, потому присутствует совместимость с ними, а также с Linux-роутерами, которые умеют EoIP. Компонент называется eoip.
Важно понимать, что сами по себе EoIP, GRE и IPIP-туннели являются connectionless, то есть невозможно понять находится ли в работоспособном состоянии туннель или нет. Мы можем только настроить обе стороны и после этого проверить передачу.
Плюс ко всему эти туннели в чистом виде никак не проходят через NAT, поэтому сеть между конечными точками для этих туннелей должна обеспечивать прямую связность без трансляции адресов.
GRE, IPIP и EoIP-туннели работают непосредственно поверх IPv4-протокола, EoIP и GRE используют номер IP-протокола 47, IPIP использует номер IP-протокола 4.
Настройка GRE/IPIP туннеля очень проста:
(config)> interface IPIP0
(config-if)> tunnel destination router1.example.com
(config-if)> ip address 192.168.100.1 255.255.255.0
(config-if)> security-level private
(config-if)> up
На другом конце туннеля задаются "зеркальные" настройки:
(config)> interface IPIP0
(config-if)> tunnel destination 8.6.5.4
(config-if)> ip address 192.168.100.2 255.255.255.0
(config-if)> security-level private
(config-if)> up
После этого можно попробовать пропинговать с любой из сторон адрес удаленной стороны в туннеле (это будет подсеть 192.168.100.0/24) для проверки работоспособности туннеля.
Стоит обратить внимание, что в качестве destination можно указать как доменное имя (через Cloud-режим в KeenDNS работать _НЕ_ будет), так и IP-адрес удаленной стороны (WAN-интерфейса устройства).
Для GRE имя интерфейса будет Gre0.
В случае с EoIP настройки абсолютно те же, кроме двух моментов:
- можно задать mac-адрес интерфейса.
- необходимо задать EoIP tunnel ID, идентификатор туннеля (число в диапазоне от 1 до 65535), причем на обоих концах он должен совпадать. Команды будут выглядеть так:
(config)> interface EoIP0
(config-if)> tunnel destination router1.example.com
(config-if)> tunnel eoip id 1500
(config-if)> ip address 192.168.100.1 255.255.255.0
(config-if)> security-level private
(config-if)> up
Другой конец туннеля:
(config)> interface EoIP0
(config-if)> tunnel destination 8.6.5.4
(config-if)> tunnel eoip id 1500
(config-if)> ip address 192.168.100.2 255.255.255.0
(config-if)> security-level private
(config-if)> up
После этого все должно работать.
Для туннелей MTU интерфейса автоматически вычисляется на основе интерфейса, через который будет проходить трафик, но также его можно и задать руками через команду interface ip mtu.
Более того, L2-интерфейс EoIP можно засунуть в Bridge для объединения локальных сетей. Для этого на обоих сторонах нужно настроить EoIP-интерфейс без IP-адреса, и затем включить в Bridge Home:
(config)> interface Home
(config-if)> include EoIP0
после этого можно пытаться связаться с хостом из одной домашней сети с хостом из другой домашней сети.
В случае установки компонента ipsec появляется возможность защищать эти туннели при помощи IPsec, причем как в автоматическом, так и в полностью ручном режиме. Ручной режим здесь описан не будет, поскольку продвинутые юзеры сами всегда могут сперва настроить IPsec с правильным режимом, а затем поверх IPsec поднять туннель. В случае автоматической настройки решается сразу несколько проблем ручного режима:
- правильно выставляется MTU
- соединение становится connection-oriented, и нужно выбирать, кто из концов туннеля становится клиентом, а кто сервером
- автоматически решается проблема с проходом через NAT, поскольку используется IPsec NAT Traversal, при котором весь туннельный трафик превращается в поток UDP на порт 500/4500
- шифрование и проверка целостности данных
Компонент IPsec добавляет следующие настройки к туннелям:
interface ipsec preshared-key <key> - PSK для шифрования
interface ipsec encryption-level <level> - уровень шифрования, по умолчанию задан таким, чтобы охватывал максимально большое число устройств и ускорялся аппаратно. Можно не менять.
Поскольку IPsec разграничивает клиента и сервер, то теперь для настройки клиента (инициатора, той стороны, которая будет пытаться установить соединение) необходимо использовать команду interface tunnel destination, а для включения режима сервера (той стороны, которая будет отвечать на попытки установления соединения) необходимо использовать команду interface tunnel source.
Пример настройки EoIP туннеля с IPsec, где сторона с WAN-адресом 8.6.5.4 является сервером:
Сервер:
(config)> interface EoIP0
(config-if)> tunnel source ISP
(config-if)> tunnel eoip id 1500
(config-if)> ipsec preshared-key mytestingkey
(config-if)> ip address 192.168.100.1 255.255.255.0
(config-if)> security-level private
(config-if)> up
Клиент:
(config)> interface EoIP0
(config-if)> tunnel destination 8.6.5.4
(config-if)> tunnel eoip id 1500
(config-if)> ipsec preshared-key mytestingkey
(config-if)> ip address 192.168.100.2 255.255.255.0
(config-if)> security-level private
(config-if)> up
Во всех случаях важно, чтобы IPsec PSK совпадал на обоих концах соединения.
При этом в команде interface tunnel source можно указать как интерфейс-источник, так и IP-адрес, на котором будет "висеть" сервер. Однако предпочтение отдается интерфейсу, поскольку в данном случае вся перенастройка при смене адреса и прочих событиях будет происходить автоматически.
Также можно указать interface tunnel source auto, для автоматического переключения сервера при смене WAN-интерфейса.
Известные ограничения:
- туннели на базе EoIP/IPsec и GRE/IPsec принципиально несовместимы с PPTP-подключениями из-за использования одного и того же протокола GRE. В этом случае остается использовать всего лишь один доступный вариант: IPIP/IPsec.
Важно:
- не забывайте про isolate-private:
Для тех, кто будет включать EoIP в Bridge:
Правильно делать в таком порядке - выставить вручную MTU 1500 на EoIP, и забриджевать его. Тогда все будет работать нормально, в том числе и фрагментация. Иначе на EoIP выставится MTU < 1500 и будут проблемы.
Команды eoip_allow_fragment на версиях 3.x нет, она устарела. Фрагментация включается автоматически.
Всех желающих прошу подключиться к тестированию, по мере того, как дело будет продвигаться, мануал будет дополняться.