EoIP Tunnel на MikroTik — Ethernet over IP
EoIP туннель на MikroTik — L2 через интернет
EoIP (Ethernet over IP) — проприетарный протокол MikroTik, позволяющий создать виртуальный Ethernet-линк между двумя маршрутизаторами поверх IP-сети. В отличие от VPN-протоколов, работающих на L3 (маршрутизация), EoIP передаёт полные Ethernet-фреймы, что делает удалённые сети частью одного широковещательного домена. Это незаменимо для сценариев, где необходим L2-мост между географически разнесёнными площадками: миграция виртуальных машин, единый DHCP-сервер на несколько офисов, transparent bridging.
Описание
Как работает EoIP
EoIP инкапсулирует Ethernet-фреймы в GRE-пакеты (IP protocol 47) и передаёт их через любую IP-сеть, включая интернет. Каждый туннель идентифицируется уникальным tunnel-id — числом, которое должно совпадать на обоих концах.
code[Устройство в LAN A] → [MikroTik A] → EoIP (GRE) → Интернет → [MikroTik B] → [Устройство в LAN B] bridge ←────── L2 туннель ──────→ bridge
Ключевые характеристики:
| Параметр | Значение |
|---|---|
| Уровень OSI | L2 (Ethernet) |
| Инкапсуляция | GRE (IP protocol 47) |
| Шифрование | Нет (по умолчанию). Опционально — IPsec |
| Overhead | ~42 байта (IP header 20 + GRE header 4 + EoIP header 18) |
| Совместимость | Только между RouterOS-устройствами |
| MTU | Ethernet MTU минус overhead (~1458 при стандартном MTU 1500) |
| Поддержка | RouterOS 6.x и 7.x |
Когда использовать EoIP
Подходит для:
- Объединение удалённых LAN в один broadcast-домен (единый DHCP, ARP, NetBIOS)
- Transparent bridging между офисами для протоколов, не работающих через L3
- Быстрое подключение удалённой площадки к существующей сети без изменения IP-адресации
- Миграция серверов/VM между площадками без смены IP
Не подходит для:
- Высоконагруженные соединения (overhead GRE + L2 broadcast)
- Сети с большим количеством broadcast-трафика (ARP, DHCP, mDNS)
- Сценарии, где достаточно L3-маршрутизации (WireGuard, OSPF)
- Подключение более чем 3–4 площадок в один L2-сегмент (broadcast storm risk)
Сравнение с другими L2-туннелями
| Параметр | EoIP | VXLAN | L2TP | VPLS |
|---|---|---|---|---|
| Уровень | L2 | L2 | L2 | L2 |
| Стандарт | Проприетарный MikroTik | RFC 7348 | RFC 2661 | RFC 4761/4762 |
| Инкапсуляция | GRE | UDP (порт 4789) | UDP (порт 1701) | MPLS |
| Мультивендорность | Нет | Да | Да | Да |
| Multipoint | Нет (point-to-point) | Да | Да (LAC/LNS) | Да |
| Поддержка в RouterOS | Полная | С версии 7.x | Полная | Полная |
| Overhead | ~42 байта | ~54 байта | ~40 байт | Зависит от MPLS |
Рекомендация: если оба конца — MikroTik и нужен простой L2-мост между двумя точками, EoIP — самый лёгкий в настройке вариант. Для мультивендорных сред или multipoint-топологий предпочтительнее VXLAN (RouterOS 7) или L2TP.
Настройка
Схема: L2-мост между двумя офисами
codeОфис A Офис B LAN: 192.168.10.0/24 LAN: 192.168.10.0/24 DHCP-сервер: 192.168.10.1 Нет DHCP (получают от Офиса A) [MikroTik A] [MikroTik B] WAN IP: 203.0.113.1 WAN IP: 198.51.100.1 ether1 → WAN ether1 → WAN ether2–5 → bridge-LAN ether2–5 → bridge-LAN └── EoIP tunnel (tunnel-id=100) ──────────┘
Обе LAN находятся в одной подсети 192.168.10.0/24. DHCP-сервер только в Офисе A, клиенты Офиса B получают адреса через EoIP-туннель.
Шаг 1: Создание EoIP-туннеля
На MikroTik A (Офис A):
[admin@MikroTik] >/interface/eoip add \ name=eoip-to-office-b \ remote-address=198.51.100.1 \ tunnel-id=100 \ mtu=1458 \ comment="L2 tunnel to Office B"
На MikroTik B (Офис B):
[admin@MikroTik] >/interface/eoip add \ name=eoip-to-office-a \ remote-address=203.0.113.1 \ tunnel-id=100 \ mtu=1458 \ comment="L2 tunnel to Office A"
Критически важно:
tunnel-idдолжен совпадать на обоих концах. При несовпадении туннель не поднимется.remote-addressуказывает на WAN IP другой стороныmtu=1458— стандартный MTU 1500 минус overhead EoIP (~42 байта). Если между маршрутизаторами есть дополнительная инкапсуляция (PPPoE, VPN), MTU нужно уменьшить ещё.
Шаг 2: Добавление EoIP в Bridge
Чтобы EoIP-туннель стал частью локальной сети, его нужно добавить в Bridge:
На MikroTik A:
[admin@MikroTik] >/interface/bridge/port add bridge=bridge-LAN interface=eoip-to-office-b
На MikroTik B:
[admin@MikroTik] >/interface/bridge/port add bridge=bridge-LAN interface=eoip-to-office-a
После этого устройства в Офисе B смогут получать IP-адреса от DHCP-сервера в Офисе A и видеть все устройства в подсети 192.168.10.0/24.
Шаг 3: Настройка Firewall для GRE
EoIP использует GRE (IP protocol 47). Если на маршрутизаторах есть firewall, нужно разрешить GRE-трафик:
[admin@MikroTik] >/ip/firewall/filter add \ chain=input \ protocol=gre \ src-address=198.51.100.1 \ action=accept \ comment="Allow GRE from Office B" \ place-before=0
Если используется connection tracker, достаточно правила для input — ответные GRE-пакеты пройдут как established/related.
Шаг 4: Добавление IPsec-шифрования
По умолчанию EoIP не шифрует трафик. Всё содержимое Ethernet-фреймов передаётся в открытом виде. Для шифрования используется IPsec:
Вариант А — встроенная опция ipsec-secret (простой способ):
[admin@MikroTik] ># На MikroTik A /interface/eoip set eoip-to-office-b ipsec-secret="MyStr0ngP@ssw0rd!" # На MikroTik B /interface/eoip set eoip-to-office-a ipsec-secret="MyStr0ngP@ssw0rd!"
При задании ipsec-secret RouterOS автоматически создаёт IPsec policy и peer для этого туннеля. Это самый простой способ, но с ограниченными настройками (используется IKEv1, AES-128).
Вариант Б — ручная настройка IPsec (рекомендуется для production):
[admin@MikroTik] ># На MikroTik A — IPsec profile /ip/ipsec/profile add \ name=eoip-profile \ hash-algorithm=sha256 \ enc-algorithm=aes-256 \ dh-group=modp2048 \ lifetime=1d # IPsec peer /ip/ipsec/peer add \ name=office-b \ address=198.51.100.1/32 \ profile=eoip-profile \ exchange-mode=ike2 # IPsec identity (authentication) /ip/ipsec/identity add \ peer=office-b \ auth-method=pre-shared-key \ secret="MyStr0ngP@ssw0rd!" # IPsec proposal /ip/ipsec/proposal add \ name=eoip-proposal \ enc-algorithms=aes-256-cbc \ auth-algorithms=sha256 \ lifetime=8h # IPsec policy — шифровать GRE-трафик между WAN-адресами /ip/ipsec/policy add \ src-address=203.0.113.1/32 \ dst-address=198.51.100.1/32 \ protocol=gre \ action=encrypt \ proposal=eoip-proposal \ peer=office-b
Аналогичную конфигурацию (с зеркальными адресами) нужно создать на MikroTik B.
EoIP с динамическим IP (DDNS)
Если одна из сторон имеет динамический IP, можно использовать доменное имя вместо IP:
[admin@MikroTik] ># Сначала настроить IP Cloud или стороний DDNS /ip/cloud set ddns-enabled=yes # Затем в EoIP использовать доменное имя /interface/eoip set eoip-to-office-a remote-address=office-a.sn.mynetname.net
RouterOS будет периодически разрешать DNS-имя и обновлять remote-address.
Проверка
Проверка состояния туннеля
[admin@MikroTik] >/interface/eoip/print detail
Ожидаемый вывод:
codename="eoip-to-office-b" mtu=1458 mac-address=FE:xx:xx:xx:xx:xx remote-address=198.51.100.1 tunnel-id=100 running=yes disabled=no
Флаг running=yes означает, что туннель активен. Если running=no:
- Проверьте доступность remote-address через ping
- Убедитесь что GRE (protocol 47) не блокируется firewall/провайдером
- Проверьте совпадение tunnel-id на обоих концах
Проверка связности через туннель
Пинг устройства в удалённой сети:
[admin@MikroTik] >/ping 192.168.10.100 count=5
Проверка ARP — если bridge работает корректно, ARP-таблица должна содержать MAC-адреса устройств из удалённого офиса:
[admin@MikroTik] >/ip/arp/print where interface=bridge-LAN
Проверка MTU
Частая проблема EoIP — фрагментация из-за уменьшенного MTU. Проверьте, что пакеты максимального размера проходят:
[admin@MikroTik] >/ping 192.168.10.100 size=1458 do-not-fragment count=5
Если пакеты не проходят — уменьшите MTU на EoIP-интерфейсе. Для PPPoE-подключений типичный MTU EoIP составляет ~1450.
Проверка IPsec (если настроен)
[admin@MikroTik] >/ip/ipsec/installed-sa/print /ip/ipsec/policy/print where peer=office-b
В installed-sa должны быть активные SA с ненулевыми счётчиками пакетов.
Типичные ошибки
1. Несовпадение tunnel-id
Симптом: интерфейс EoIP создан, но running=no. Пакеты не проходят.
Причина: tunnel-id на одном конце — 100, на другом — 101 (опечатка).
Решение: привести tunnel-id к одному значению на обоих маршрутизаторах:
[admin@MikroTik] >/interface/eoip set eoip-to-office-b tunnel-id=100
2. Broadcast storm через EoIP
Симптом: резкий рост трафика на WAN, потеря связи, высокая CPU-нагрузка на обоих маршрутизаторах.
Причина: L2-петля — EoIP в bridge, и при этом существует альтернативный L2-путь между площадками. Broadcast-пакеты бесконечно циркулируют.
Решение: включить RSTP на bridge:
[admin@MikroTik] >/interface/bridge set bridge-LAN protocol-mode=rstp
Также рекомендуется ограничить broadcast на EoIP-порту в bridge:
[admin@MikroTik] >/interface/bridge/port set [find interface~"eoip"] broadcast-flood=no unknown-multicast-flood=no
3. Провайдер блокирует GRE
Симптом: EoIP не поднимается, хотя ping между WAN-адресами работает.
Причина: провайдер или промежуточный NAT блокирует IP protocol 47 (GRE).
Решение: если GRE заблокирован — EoIP работать не будет. Альтернативы:
- Использовать L2TP (UDP, проходит через NAT)
- Использовать VXLAN поверх WireGuard (RouterOS 7)
- Использовать EoIP поверх VPN-туннеля (WireGuard/L2TP), но это добавит ещё один уровень overhead
4. Проблемы с MTU и фрагментация
Симптом: ping работает, но крупные файлы передаются очень медленно или вообще не передаются. SSH работает, но SCP/HTTP зависают.
Причина: MTU туннеля слишком велик, пакеты фрагментируются или отбрасываются (если выставлен DF bit).
Решение: уменьшите MTU на EoIP-интерфейсе и включите MSS clamping:
[admin@MikroTik] >/interface/eoip set eoip-to-office-b mtu=1400 # MSS clamping для TCP /ip/firewall/mangle add \ chain=forward \ in-interface=eoip-to-office-b \ protocol=tcp \ tcp-flags=syn \ action=change-mss \ new-mss=clamp-to-pmtu
5. EoIP и NAT — работает только в одну сторону
Симптом: EoIP поднимается, но трафик идёт только от одной стороны.
Причина: один из маршрутизаторов находится за NAT. GRE не поддерживает NAT traversal нативно (в отличие от IKE/ESP).
Решение: EoIP через NAT не работает надёжно. Варианты:
- Пробросить IP protocol 47 на NAT-устройстве (не все NAT это поддерживают)
- Поднять WireGuard или L2TP/IPsec VPN между площадками, а EoIP пустить внутри VPN-туннеля
- Использовать VXLAN (UDP-based, NAT-friendly) в RouterOS 7
6. Высокая нагрузка CPU из-за broadcast
Симптом: CPU маршрутизатора 80–100%, большая часть трафика — broadcast через EoIP.
Причина: все broadcast-пакеты из LAN одного офиса передаются через EoIP в LAN другого офиса (ARP, DHCP Discover, NetBIOS, mDNS).
Решение: ограничить broadcast через bridge filter:
[admin@MikroTik] >/interface/bridge/filter add \ chain=forward \ in-interface=eoip-to-office-b \ mac-protocol=ip \ dst-address=FF:FF:FF:FF:FF:FF \ action=drop \ comment="Limit broadcast from EoIP"
Или рассмотрите переход на L3-маршрутизацию (отдельные подсети для каждого офиса + WireGuard/OSPF) — это масштабируется значительно лучше, чем L2-мост.
[Устройство в LAN A] → [MikroTik A] → EoIP (GRE) → Интернет → [MikroTik B] → [Устройство в LAN B]
bridge ←────── L2 туннель ──────→ bridge
Офис A Офис B
LAN: 192.168.10.0/24 LAN: 192.168.10.0/24
DHCP-сервер: 192.168.10.1 Нет DHCP (получают от Офиса A)
[MikroTik A] [MikroTik B]
WAN IP: 203.0.113.1 WAN IP: 198.51.100.1
ether1 → WAN ether1 → WAN
ether2–5 → bridge-LAN ether2–5 → bridge-LAN
└── EoIP tunnel (tunnel-id=100) ──────────┘
/interface/eoip add \
name=eoip-to-office-b \
remote-address=198.51.100.1 \
tunnel-id=100 \
mtu=1458 \
comment="L2 tunnel to Office B"
/interface/eoip add \
name=eoip-to-office-a \
remote-address=203.0.113.1 \
tunnel-id=100 \
mtu=1458 \
comment="L2 tunnel to Office A"
/interface/bridge/port add bridge=bridge-LAN interface=eoip-to-office-b
/interface/bridge/port add bridge=bridge-LAN interface=eoip-to-office-a
/ip/firewall/filter add \
chain=input \
protocol=gre \
src-address=198.51.100.1 \
action=accept \
comment="Allow GRE from Office B" \
place-before=0
# На MikroTik A
/interface/eoip set eoip-to-office-b ipsec-secret="MyStr0ngP@ssw0rd!"
# На MikroTik B
/interface/eoip set eoip-to-office-a ipsec-secret="MyStr0ngP@ssw0rd!"
# На MikroTik A — IPsec profile
/ip/ipsec/profile add \
name=eoip-profile \
hash-algorithm=sha256 \
enc-algorithm=aes-256 \
dh-group=modp2048 \
lifetime=1d
# IPsec peer
/ip/ipsec/peer add \
name=office-b \
address=198.51.100.1/32 \
profile=eoip-profile \
exchange-mode=ike2
# IPsec identity (authentication)
/ip/ipsec/identity add \
peer=office-b \
auth-method=pre-shared-key \
secret="MyStr0ngP@ssw0rd!"
# IPsec proposal
/ip/ipsec/proposal add \
name=eoip-proposal \
enc-algorithms=aes-256-cbc \
auth-algorithms=sha256 \
lifetime=8h
# IPsec policy — шифровать GRE-трафик между WAN-адресами
/ip/ipsec/policy add \
src-address=203.0.113.1/32 \
dst-address=198.51.100.1/32 \
protocol=gre \
action=encrypt \
proposal=eoip-proposal \
peer=office-b
# Сначала настроить IP Cloud или стороний DDNS
/ip/cloud set ddns-enabled=yes
# Затем в EoIP использовать доменное имя
/interface/eoip set eoip-to-office-a remote-address=office-a.sn.mynetname.net
/interface/eoip/print detail
name="eoip-to-office-b" mtu=1458 mac-address=FE:xx:xx:xx:xx:xx
remote-address=198.51.100.1 tunnel-id=100 running=yes disabled=no
/ping 192.168.10.100 count=5
/ip/arp/print where interface=bridge-LAN
/ping 192.168.10.100 size=1458 do-not-fragment count=5
/ip/ipsec/installed-sa/print
/ip/ipsec/policy/print where peer=office-b
/interface/eoip set eoip-to-office-b tunnel-id=100
/interface/bridge set bridge-LAN protocol-mode=rstp
/interface/bridge/port set [find interface~"eoip"] broadcast-flood=no unknown-multicast-flood=no
/interface/eoip set eoip-to-office-b mtu=1400
# MSS clamping для TCP
/ip/firewall/mangle add \
chain=forward \
in-interface=eoip-to-office-b \
protocol=tcp \
tcp-flags=syn \
action=change-mss \
new-mss=clamp-to-pmtu
/interface/bridge/filter add \
chain=forward \
in-interface=eoip-to-office-b \
mac-protocol=ip \
dst-address=FF:FF:FF:FF:FF:FF \
action=drop \
comment="Limit broadcast from EoIP"