Przewodnik: Tunele GRE i EoIP w MikroTik RouterOS – L3, L2, broadcasty, multicasty
Podłączenie dwóch routerów MikroTik RouterOS tunelem GRE i EoIP
Kompletny przewodnik z przykładami, weryfikacja na żywo na RouterOS 7.16.1
1. Wstęp – protokoły tunelowe w RouterOS
RouterOS udostępnia trzy główne protokoły tunelowe do łączenia dwóch routerów przez sieć IP (transport):
- GRE(Generic Routing Encapsulation, RFC 2784) – tunel warstwy 3, przekazuje pakiety IP i IPv6
- IPIP(IP-in-IP, RFC 2003) – tunel warstwy 3, przekazuje tylko pakiety IPv4
- EoIP (Ethernet over IP) – tunel warstwy 2, oparty na RFC 1701 (GRE), przekazuje ramki Ethernet wraz z broadcastami, multicastami i całym ruchem L2. Protokół własnościowy MikroTik (działa między routerami RouterOS)
Ważne różnice w skrócie:
| Cecha |
GRE |
IPIP |
EoIP |
| Warstwa OSI |
Warstwa 3 (IP) |
Warstwa 3 (IP) |
Warstwa 2 (Ethernet) |
| Nagłówek overhead |
24 bajty (4 GRE + 20 IP) |
20 bajtów |
42+ bajtów (20 IP + 8 GRE + 14 Ethernet) |
| Co przekazuje |
Pakiety IP i IPv6 |
Tylko pakiety IPv4 |
Pełne ramki Ethernet (wszystkie protokoły L2) |
| Możliwość bridgowania |
NIE |
NIE |
TAK – łączenie mostkami (bridge) |
| Protocol IP |
47 (GRE) |
4 (IPIP) |
47 (GRE) |
| RFC |
RFC 2784 |
RFC 2003 |
Proprietary MikroTik (bazuje na RFC 1701) |
| Kompatybilność |
Cisco, Juniper, Linux… |
Cisco, Linux… |
Tylko MikroTik RouterOS |
| Keepalive |
TAK |
TAK (ROS 7) |
TAK |
| Przekazywanie multicastów IP |
TAK (pakiet multicastowy to nadal pakiet IP) |
NIE |
TAK (jako ramki Ethernet multicast) |
| Przekazywanie broadcastów L2 (ARP, DHCP) |
NIE |
NIE |
TAK |
Kluczowa informacja: Jeśli potrzebujesz tunelu, który przekazuje broadcasty (ARP, DHCP discovery), multicasty i cały ruch warstwy 2 (L2) – potrzebujesz EoIP. GRE przekazuje multicasty IP (np. pakiety OSPF lub RIPv2, bo to są nadal pakiety IP), ale NIE przekazuje broadcastów Ethernet ani ruchu L2.
2. GRE vs EoIP – kiedy co wybrać
Kiedy używać GRE (warstwa 3)
- Potrzebujesz routingu między sieciami (site-to-site VPN na warstwie IP)
- Chcesz uruchomić dynamiczne protokoły routingu przez tunel – GRE przekazuje multicasty IP, których wymagają OSPF (224.0.0.5) i RIPv2 (224.0.0.9). Uwaga: BGP NIE używa multicastów (działa na TCP/unicast), więc dla samego BGP wystarczy dowolny tunel IP
- Jeden lub oba końce tunelu to routery nie-MikroTik (Cisco, Juniper, Linux) – GRE jest standardowym protokołem
- Zależy Ci na niskim overheadzie (24 bajty vs 42+ bajty w EoIP)
- Potrzebujesz keepalive do wykrywania przerw w połączeniu
Kiedy używać EoIP (warstwa 2)
- Potrzebujesz rozszerzyć sieć LAN między dwoma lokalizacjami (ten sam broadcast domain, ta sama podsieć)
- Potrzebujesz przekazywać broadcasty (np. DHCP, ARP)
- Potrzebujesz przekazywać ruch nie-IP (IPX, AppleTalk, legacy)
- Chcesz bridgować porty switcha między dwoma routerami jakby były połączone kablem
- Oba routery to MikroTik RouterOS (EoIP jest protokołem własnościowym MikroTik)
- Potrzebujesz przenosić VLANy między lokalizacjami (EoIP przekazuje ramki 802.1Q)
Uwaga: Jeśli potrzebujesz interoperacyjności z routerami innych producentów i równocześnie L2 bridgingu, użyj VXLAN (UDP port 4789) zamiast EoIP. VXLAN jest standardowym protokołem (RFC 7348) i działa między różnymi producentami.
3. Topologia testowa i środowisko
W tym przewodniku konfigurujemy dwa routery MikroTik CHR (Cloud Hosted Router) z RouterOS w wersji 7.16.1 (stable) działające w środowisku wirtualnym (VirtualBox):

Środowisko testowe
Używamy dwóch routerów z dostępem przez SSH. Konfiguracja była weryfikowana na routerze A (192.168.53.83):
# Wersja RouterOS i sprzęt (Router A):
/system resource print
name: MikroTik
uptime: 3m32s
version: 7.16.1 (stable)
build-time: 2024-10-10 14:03:32
free-memory: 20.3MiB
total-memory: 64.0MiB
cpu: Intel(R)
cpu-count: 1
cpu-frequency: 2591MHz
cpu-load: 3%
free-hdd-space: 71.1MiB
total-hdd-space: 89.2MiB
architecture-name: x86_64
board-name: CHR innotek GmbH VirtualBox
# Interfejsy na routerze A:
/interface print
Flags: R - RUNNING
# NAME TYPE ACTUAL-MTU MAC-ADDRESS
0 R ether1 ether 1500 08:00:27:E8:30:07
1 R lo loopback 65536 00:00:00:00:00:00
# Adres IP routera A:
/ip address print
ADDRESS NETWORK INTERFACE
192.168.53.83/24 192.168.53.0 ether1
Dane dostępu do routerów:
Router A: 192.168.53.83 / admin / zaq12wsx (dostępny przez SSH)
Router B: 192.168.53.84 / admin / zaq12wsx (dostępny przez SSH)
Protokół: SSH (port 22), Winbox (port 8291), WebFig (port 80)
4. Scenariusz 1: Tunel GRE (warstwa 3 – routing)
W tym scenariuszu tworzymy tunel GRE między dwoma routerami, który przekazuje pakiety IP. Tunel działa jak wirtualny kabel punkt-do-punkt. Przez tunel GRE można przekazywać multicasty IP (niezbędne dla OSPF/RIPv2), ale NIE można przekazywać broadcastów L2 (ARP, DHCP).
Router A (192.168.53.83) Router B (192.168.53.84) ether1: 192.168.53.83 ——– WAN ——– ether1: 192.168.53.84 gre-tunnel-84: 172.16.1.1/30 —- GRE —- gre-tunnel-83: 172.16.1.2/30 Siec A: 10.10.10.0/24 Siec B: 10.20.20.0/24
4.1. Tworzenie interfejsu GRE
Router A (192.168.53.83)
/interface gre add name=gre-tunnel-84 \
remote-address=192.168.53.84 \
local-address=192.168.53.83 \
keepalive=10s,10 \
comment="Tunel GRE do routera B"
Router B (192.168.53.84)
/interface gre add name=gre-tunnel-83 \
remote-address=192.168.53.83 \
local-address=192.168.53.84 \
keepalive=10s,10 \
comment="Tunel GRE do routera A"
Wyjaśnienie parametrów:
| Parametr |
Opis |
| name |
Nazwa interfejsu tunelu (dowolna, unikalna na routerze) |
| remote-address |
Adres IP zdalnego końca tunelu (transport/underlay) |
| local-address |
Adres IP lokalnego końca tunelu (transport/underlay). Jeśli ustawiony na 0.0.0.0, użyty zostanie adres IP wychodzącego interfejsu |
| keepalive |
Keepalive: interwał,czas_wygaśnięcia. Jeśli router nie otrzyma odpowiedzi przez podany czas, flaga „running” zostanie usunięta. Format: 10s,10 oznacza próbę co 10 sekund, wygaśnięcie po 10 probach (100 sekund) |
Weryfikacja na żywo: RouterOS 7.16.1, router 192.168.53.83
# Wynik po utworzeniu tunelu GRE na routerze A:
/interface gre print detail
Flags: X - disabled; R - running
0 name="gre-tunnel-84" mtu=auto actual-mtu=1476
local-address=192.168.53.83
remote-address=192.168.53.84
keepalive=10s,10 dscp=inherit
clamp-tcp-mss=yes dont-fragment=no allow-fast-path=yes
Uwaga dotycząca MTU: Domyślne MTU tunelu GRE to 1476 bajtów. Wynika to z: 1500 (standardowy Ethernet MTU) minus 20 bajtów nagłówka IP transportowego minus 4 bajty nagłówka GRE = 1476 bajtów. Jeśli tunel przechodzi przez bridge, wartość actual-mtu może się zmienić na podstawie najniższego MTU wśród portów bridge.
4.2. Adresowanie tunelu
Tunel GRE działa jak wirtualny interfejs punkt-do-punkt. Należy mu przypisać adresy IP z sieci punkt-do-punkt (najczęściej /30):
Router A (192.168.53.83)
/ip address add address=172.16.1.1/30 interface=gre-tunnel-84 \
comment="Adres IP tunelu GRE - koniec A"
Router B (192.168.53.84)
/ip address add address=172.16.1.2/30 interface=gre-tunnel-83 \
comment="Adres IP tunelu GRE - koniec B"
Weryfikacja na żywo: RouterOS 7.16.1
# Wynik na routerze A po dodaniu adresu IP:
/ip address print
ADDRESS NETWORK INTERFACE
192.168.53.83/24 192.168.53.0 ether1
172.16.1.1/30 172.16.1.0 gre-tunnel-84
Sieć 172.16.1.0/30 to wewnętrzna sieć tunelu GRE. Używamy /30 ponieważ tunel jest punkt-do-punkt (tylko dwa hosty). Ta sieć służy wyłącznie do komunikacji między końcami tunelu.
4.3. Trasy statyczne
Aby routery mogły przekazywać ruch między sieciami lokalnymi przez tunel, potrzebne są trasy statyczne wskazujące na koniec tunelu jako bramę:
Załóżmy, ze sieć lokalna routera A to 10.10.10.0/24, a sieć lokalna routera B to 10.20.20.0/24.
Router A (192.168.53.83)
# Trasa do sieci lokalnej routera B przez tunel GRE
/ip route add dst-address=10.20.20.0/24 gateway=172.16.1.2 \
comment="Trasa do sieci B przez GRE"
Router B (192.168.53.84)
# Trasa do sieci lokalnej routera A przez tunel GRE
/ip route add dst-address=10.10.10.0/24 gateway=172.16.1.1 \
comment="Trasa do sieci A przez GRE"
Weryfikacja na żywo: RouterOS 7.16.1
# Tabela routingu na routerze A:
/ip route print
Flags: D - DYNAMIC; I - INACTIVE, A - ACTIVE; c - CONNECT, s - STATIC; H - HW-OFFLOADED
# DST-ADDRESS GATEWAY DISTANCE
IsH 10.20.20.0/24 172.16.1.2 1 <--- trasa do sieci B (INACTIVE bo brak lacznosci z .84)
DAc 10.10.10.0/24 lo 0 <--- siec lokalna A
DIcH 172.16.1.0/30 gre-tunnel-84 0 <--- siec tunelu GRE (connected)
DAc 192.168.53.0/24 ether1 0 <--- siec transportowa (WAN)
Uwaga: Trasa do 10.20.20.0/24 jest oznaczona jako INACTIVE ponieważ brama 172.16.1.2 jest nieosiągalna (koniec tunelu .84 nie jest dostępny). Gdy oba routery będą skonfigurowane i połączone, trasa stanie się ACTIVE.
4.4. Multicast przez GRE (OSPF, RIPv2 i inne)
Jedna z kluczowych zalet GRE nad IPIP jest możliwość przekazywania ruchu multicastowego IP. Jest to niezbędne dla dynamicznych protokołów routingu, które używają multicastów do wysyłania pakietów Hello i aktualizacji:
- OSPF – używa multicastów 224.0.0.5 i 224.0.0.6
- RIPv2 – używa multicastu 224.0.0.9
- PIM (Protocol Independent Multicast) – używa multicastu 224.0.0.13 (PIM Hello)
- IGMP – zarządzanie grupami multicastowymi (224.0.0.22)
- BGP – NIE używa multicastów. BGP wymienia trasy po TCP (unicast). Tzw. MP-BGP/MBGP może przenosić INFORMACJE o trasach multicastowych, ale sam działa unicastowo. Do uruchomienia BGP przez tunel nie jest potrzebny multicast
GRE przekazuje te pakiety ponieważ są to zwykle pakiety IP z adresem docelowym multicastowym. Router opakowuje je w nagłówek GRE i wysyła do zdalnego końca tunelu. Tam są rozpakowywane i dostarczane do lokalnej tablicy routingu.
Przykład: OSPF przez tunel GRE
Aby uruchomić OSPF przez tunel GRE, wystarczy dodać interfejs tunelu do processu OSPF. Multicastowe pakiety Hello będą automatycznie przekazywane przez tunel:
Router A
/routing ospf instance
add name=default router-id=10.10.10.1
/routing ospf network
add network=172.16.1.0/30 area=backbone
add network=10.10.10.0/24 area=backbone
Router B
/routing ospf instance
add name=default router-id=10.20.20.1
/routing ospf network
add network=172.16.1.0/30 area=backbone
add network=10.20.20.0/24 area=backbone
Pakiety OSPF Hello (do 224.0.0.5) będą przekazywane przez tunel GRE automatycznie. Zamiast ręcznych tras statycznych, routery naucza się siebie nawzajem przez OSPF:
# Po nawiązaniu OSPF - tablica routingu pokaże dynamiczne trasy:
/ip route print where dst-address~"10\."
# DST-ADDRESS GATEWAY DISTANCE
DAC 10.10.10.0/24 gre-tunnel-84 0
DAo 10.20.20.0/24 172.16.1.2 110 <--- trasa dynamiczna OSPF
GRE a multicast: GRE natywnie przekazuje pakiety multicastowe IP, ponieważ multicastowe adresy IP (224.0.0.0 – 239.255.255.255) są nadal adresami warstwy 3. W przeciwieństwie do EoIP, które przekazuje multicasty jako ramki Ethernet multicast (warstwa 2), GRE przekazuje je jako pakiety IP multicast.
4.5. Weryfikacja tunelu GRE
Podstawowe komendy weryfikacyjne:
# Sprawdzenie stanu interfejsu tunelu GRE
/interface gre print
Flags: X - disabled; R - running
# NAME MTU ACTUAL-MTU LOCAL-ADDRESS REMOTE-ADDRESS
0 R gre-tunnel-84 auto 1476 192.168.53.83 192.168.53.84
# Test łączności przez tunel (z routera A):
/ping 172.16.1.2
# Sprawdzenie ARP na interfejsie tunelu:
/ip arp print where interface=gre-tunnel-84
# Monitorowanie ruchu na interfejsie:
/interface monitor-traffic gre-tunnel-84 once
# Sprawdzenie keepalive:
/interface gre print stats
Ważne: Nie używaj opcji „Check gateway: arp” na trasach, których brama jest interfejs tunelu GRE. GRE nie przekazuje pakietów ARP – interfejs tunelu nie odpowiada na ARP. Używaj statycznych bram (gateway = IP) zamiast ARP.
5. Scenariusz 2: Tunel EoIP (warstwa 2 – bridging, broadcasty, multicasty, L2)
EoIP (Ethernet over IP) to protokół MikroTik oparty na RFC 1701 (GRE), który tworzy tunel Ethernetowy między dwoma routerami. W przeciwieństwie do klasycznego GRE, EoIP przekazuje pełne ramki Ethernet, w tym:
- Broadcasty– ARP requests, DHCP discovery (0.0.0.0 -> 255.255.255.255)
- Multicasty L2 – IGMP, LLDP, STP BPDU, protokoły routingu multicastowego
- Ruch nie-IP – IPX, AppleTalk i inne protokoły warstwy 2
- VLANy– ramki 802.1Q przechodzą przez EoIP niezmiennie
- Wszystkie ramki Ethernet – cały ruch warstwy 2
Router A (192.168.53.83) Router B (192.168.53.84) ether1: 192.168.53.83 ——– WAN ——– ether1: 192.168.53.84 | | bridge1 = ether2 + eoip-to-84 bridge1 = ether2 + eoip-to-83 IP: 10.100.100.1/24 IP: 10.100.100.2/24 Siec: 10.100.100.0/24 Siec: 10.100.100.0/24 (ta sama!) | | <– EoIP Tunnel (L2, ID=100) –> (broadcasty, multicasty, caly ruch L2)
5.1. Tworzenie interfejsu EoIP
Router A (192.168.53.83)
/interface eoip add name=eoip-to-84 \
remote-address=192.168.53.84 \
tunnel-id=100 \
comment="Tunel EoIP L2 do routera B"
Router B (192.168.53.84)
/interface eoip add name=eoip-to-83 \
remote-address=192.168.53.83 \
tunnel-id=100 \
comment="Tunel EoIP L2 do routera A"
Kluczowe: Parametr tunnel-id MUSI być IDENTYCZNY na obu końcach tunelu. Jeśli tunnel-id się różni, tunel nie nawiąże połączenia. Tunnel-id służy do identyfikacji tunelów – jeśli między dwoma routerami jest więcej niż jeden tunel EoIP, każdy musi mieć różny tunnel-id.
Wyjaśnienie parametrów EoIP:
| Parametr |
Opis |
| name |
Nazwa interfejsu tunelu |
| remote-address |
Adres IP zdalnego końca tunelu (transport) |
| tunnel-id |
Identyfikator tunelu (0-65535). Musi być taki sam na obu końcach. Pozwala na wiele tuneli EoIP między tymi samymi routerami |
| local-address |
Adres IP lokalnego końca (domyślnie 0.0.0.0 = automatycznie z wychodzącego interfejsu) |
| mac-address |
Adres MAC interfejsu. Automatyczny jeśli nie podany. WAŻNE przy bridgowaniu – powinien być unikalny |
| mtu |
MTU warstwy 3 (domyślnie auto). Przy standardowym Ethernet 1500: EoIP ustawia auto=1458 (1500 – 42 bajty overhead) |
| keepalive |
Keepalive: interwał,czas_wygaśnięcia (domyślnie 10s,10) |
Weryfikacja na żywo: RouterOS 7.16.1, router 192.168.53.83
# Wynik po utworzeniu tunelu EoIP na routerze A:
/interface eoip print detail
Flags: X - disabled; R - running
0 ;;; Tunel EoIP L2 do routera B
name="eoip-to-84" mtu=auto actual-mtu=1458 l2mtu=65535
mac-address=FE:C6:96:AD:77:E6 arp=enabled arp-timeout=auto
loop-protect=default loop-protect-status=off
loop-protect-send-interval=5s loop-protect-disable-time=5m
local-address=0.0.0.0 remote-address=192.168.53.84
tunnel-id=100
keepalive=10s,10 dscp=inherit clamp-tcp-mss=yes
dont-fragment=no allow-fast-path=yes
Z powyższego wyniku widzimy:
- actual-mtu=1458 – pełna ramka Ethernet (1500) minus 42 bajty overhead EoIP (20 IP + 8 GRE + 14 Ethernet)
- l2mtu=65535 – MTU warstwy 2 (do użytku bridge)
- mac-address=FE:C6:96:AD:77:E6– automatycznie wygenerowany adres MAC
- tunnel-id=100– identyfikator tunelu
5.2. Bridge i porty
Aby EoIP działał jak wirtualny kabel Ethernet, interface tunelu EoIP musi zostać dodany do bridge (mostka) razem z lokalnymi portami Ethernet. Bridge łączy wszystkie porty w jeden broadcast domain:
Ważna uwaga dotycząca portu transportowego: Do bridge z tunelem EoIP dodajemy porty LAN (np. ether2 z hostami), a w testowych scenariuszach – sam interfejs EoIP. Portu TRANSPORTOWEGO (WAN), po którym biegnie sam tunel (tu: ether1 z adresem 192.168.53.x), NIE wolno dodawać do tego samego bridge co EoIP – połączysz wtedy sieć transportowa z tunelowymi sieciami LAN w jeden broadcast domain (pomyłki ARP, niekontrolowany ruch L2).
Gotcha w RouterOS 7 (CHR): Po utworzeniu nowego bridge RouterOS AUTOMATYCZNIE dodaje do niego interfejsy posiadające adres IP (tu: ether1 z 192.168.53.83). To najczęstsza przyczyna nieoczekiwanego ruchu przez tunel. Po utworzeniu bridge zawsze sprawdź /interface bridge port print i usuń niechciany port:
/interface bridge port remove [find where interface=ether1]
Router A (192.168.53.83)
# Utwórz bridge (jeśli jeszcze nie istnieje)
/interface bridge add name=bridge1 protocol-mode=rstp \
comment="Bridge z EoIP i portami LAN"
# Dodaj interfejs EoIP do bridge
/interface bridge port add bridge=bridge1 interface=eoip-to-84 \
comment="EoIP tunel w bridge"
# Dodaj lokalny port LAN do bridge (NIE port transportowy/WAN!)
# UWAGA: w RouterOS 7 ether1 z adresem IP został już dodany automatycznie -
# sprawdź /interface bridge port print i usuń go jeśli nie chcesz bridge'owac
# sieci transportowej.
/interface bridge port add bridge=bridge1 interface=ether2 \
comment="Port Ethernet LAN w bridge"
Router B (192.168.53.84)
# Utwórz bridge
/interface bridge add name=bridge1 protocol-mode=rstp \
comment="Bridge z EoIP i portami LAN"
# Dodaj port EoIP do bridge
/interface bridge port add bridge=bridge1 interface=eoip-to-83 \
comment="EoIP tunel w bridge"
# Dodaj lokalny port LAN do bridge (NIE port transportowy/WAN).
# Sprawdź też czy RouterOS nie dodał automatycznie ether1 (port z IP) do bridge.
/interface bridge port add bridge=bridge1 interface=ether2 \
comment="Port Ethernet LAN w bridge"
Uwaga dotycząca protocol-mode=rstp: Włącz protokół STP/RSTP na bridge, aby zapobiegać pętlom przekazywania. Jeśli masz redundantne połączenia między routerami (np. dwa tunele EoIP lub EoIP + fizyczne połączenie), pętla L2 spowoduje broadcast storm. RSTP automatycznie zablokuje nadmiarowe ścieżki.
Weryfikacja na żywo: RouterOS 7.16.1, router 192.168.53.83
# Bridge na routerze A:
/interface bridge print detail
Flags: X - disabled; R - running
0 R ;;; Bridge z EoIP i portami LAN
name="bridge1" mtu=auto actual-mtu=1458 l2mtu=65535
arp=enabled arp-timeout=auto mac-address=FE:C6:96:AD:77:E6
protocol-mode=rstp fast-forward=yes igmp-snooping=no
auto-mac=yes ageing-time=5m priority=0x8000
max-message-age=20s forward-delay=15s
transmit-hold-count=6 vlan-filtering=no
# Porty bridge (po usunięciu automatycznie dodanego ether1):
# UWAGA: nie ma tu portu TRANSPORTOWEGO - ether1 pozostał poza bridge,
# a jako port LAN dodaliśmy ether2.
/interface bridge port print
INTERFACE BRIDGE HW PVID PRIORITY HORIZON
eoip-to-84 bridge1 1 0x80 none
ether2 bridge1 yes 1 0x80 none
Widzimy, ze bridge1 ma porty LAN, a port transportowy (ether1) jest poza bridge:
- eoip-to-84– Port EoIP (bez HW offloading, ponieważ to interfejs wirtualny)
- ether2– Fizyczny port LAN z hardware offloading (HW=yes)
5.3. Adresowanie i mostkowanie
Adres IP przypisujemy do bridge, NIE DO poszczególnych portów. Mostkowany interfejs (bridge) jest JEDNYM PORTEM broadcastowym:
Router A (192.168.53.83)
/ip address add address=10.100.100.1/24 interface=bridge1 \
comment="Adres IP sieci lokalnej A"
Router B (192.168.53.84)
/ip address add address=10.100.100.2/24 interface=bridge1 \
comment="Adres IP sieci lokalnej B"
Uwaga: oba routery mają adresy z TEJ SAMEJ sieci (10.100.100.0/24). To działa ponieważ są w tym samym broadcast domain dzięki tunelowi EoIP. Broadcast ARP z routera A dotrze do routera B i odwrotnie, tak jakby były połączone fizycznym kablem Ethernet.
Weryfikacja na żywo: RouterOS 7.16.1, router 192.168.53.83
# Przypisanie IP do bridge na routerze A:
/ip address print
ADDRESS NETWORK INTERFACE
192.168.53.83/24 192.168.53.0 ether1
10.100.100.1/24 10.100.100.0 bridge1
5.4. Ustawianie MAC address dla EoIP
Gdy tunele EoIP są dodawane do bridge, ważne jest, aby każdy tunel miał unikalny adres MAC. Dzięki temu algorytmy bridge (STP, learning) działają poprawnie.
IANA zarezerwowała zakres MAC dla tuneli: 00:00:5E:80:00:00 – 00:00:5E:FF:FF:FF
Router A
# Ustaw unikalny MAC na tunelu EoIP
/interface eoip set eoip-to-84 mac-address=00:00:5E:80:00:01
Router B
# Ustaw unikalny MAC na tunelu EoIP
/interface eoip set eoip-to-83 mac-address=00:00:5E:80:00:02
Dlaczego MAC jest ważny? Jeśli dwa tunele EoIP (lub EoIP + fizyczny port) mają ten sam adres MAC, bridge nie będzie mógł rozróżnić między nimi w tablicy MAC. To może prowadzić do błędnego przekazywania ruchu. Unikalne adresy MAC eliminują ten problem.
5.5. Weryfikacja ruchu L2 (broadcasty, multicasty)
Na tunelu EoIP przekazywane są:
Broadcasty (ARP, DHCP)
# Gdy urządzenie w sieci A szuka MAC dla 10.100.100.2:
# 1. Wysyła ARP Request broadcast na wszystkie porty bridge
# 2. Bridge przekazuje ramkę przez EoIP do routera B
# 3. Router B dostarcza ramkę na wszystkie porty swojego bridge
# 4. Urządzenie B odpowiada ARP Reply (unicast)
# 5. Odpowiedź wróci tunelem EoIP do routera A
# Komendy weryfikacyjne na routerze:
# Tablica ARP - pokazuje nauczonych sąsiadów L2
/ip arp print
# Tablica MAC bridge - pokazuje porty i przypisane MAC
/interface bridge host print
# Statystyki bridge
/interface bridge print stats
# Monitorowanie ruchu na tunelu EoIP
/interface monitor-traffic eoip-to-84 once
Multicasty (IGMP, LLDP, BPDU)
# Multicastowe ramki Ethernet są przekazywane przez EoIP tak samo jak broadcasty
# Np. pakiet OSPF Hello (224.0.0.5) jest ramka Ethernet z docelowym
# adresem MAC multicastowym 01:00:5E:00:00:05
# Bridge może opcjonalnie włączyć IGMP snooping (ogranicza rozgłaszanie multicastu):
/interface bridge set bridge1 igmp-snooping=yes
# Jeśli w sieci L2 nie ma zewnętrznego queriera (np. routera PIM/IGMP proxy),
# włącz querier na łącznie jednym bridge w broadcast domain, inaczej
# wpisy w tablicy multicastowej wygasną po kilku minutach:
/interface bridge set bridge1 multicast-querier=yes
# Sprawdź tablice multicast bridge (MDB - Multicast DataBase):
/interface bridge mdb print
VLANy przez EoIP
# EoIP przekazuje ramki 802.1Q niezmiennie - VLAN przechodzi "przezroczyście"
# bez dodatkowej konfiguracji. Jeśli chcesz zakończyć VLAN na routerze (dać mu IP):
# Na routerze A - interfejs VLAN na bazie tunelu EoIP:
/interface vlan add name=vlan10 vlan-id=10 interface=eoip-to-84
# Adres IP dla VLAN 10:
/ip address add address=10.10.10.1/24 interface=vlan10
Ostrzeżenie – vlan-filtering na bridge: Jeśli zamiast interfejsu VLAN zdecydujesz się na vlan-filtering=yes na bridge (model /interface bridge vlan), musisz poprawnie ustawić PVID oraz określić, na których portach VLAN jest tagged/untagged – inaczej ruch z portów untagged (w tym DHCP/ARP) przestanie działać. Użycie /interface vlan na EoIP jest prostsze i bezpieczniejsze.
Uwaga – pętla bridge: Jeśli tunele EoIP są dodane do bridge, a routery są również połączone fizycznym kablem (do tego samego lub innego bridge), może powstać pętla L2. Włącz protocol-mode=rstp na obu bridge, aby temu zapobiec.
Podsumowanie Scenariusza 2: Po skonfigurowaniu EoIP + bridge na obu routerach, sieci lokalne obu routerów są w tym samym broadcast domain. Broadcasty (ARP, DHCP), multicasty i cały ruch L2 przepływa przez tunel tak, jakby routery były połączone fizycznym kablem Ethernet.
6. Testy na żywo – weryfikacja end-to-end (RouterOS 7.16.1)
Poniżej przedstawiam wyniki testów wykonanych na żywo na dwóch routerach MikroTik CHR z RouterOS 7.16.1 (stable):
Router A: 192.168.53.83 (ether1 08:00:27:E8:30:07) Router B: 192.168.53.84 (ether1 08:00:27:76:19:4A) Konfiguracja testowa: Router A Router B /interface gre add gre-test -> .84 /interface gre add gre-test -> .83 /ip address add 172.16.1.1/30 gre-test /ip address add 172.16.1.2/30 gre-test /ip address add 10.10.10.1/24 lo /ip address add 10.20.20.1/24 lo /ip route add 10.20.20.0/24 gw 172.16.1.2 /ip route add 10.10.10.0/24 gw 172.16.1.1 /interface eoip add eoip-test tunnel-id=200 /interface eoip add eoip-test tunnel-id=200 /interface bridge add bridge-lan rstp /interface bridge add bridge-lan rstp /interface bridge port add bridge-lan eoip /interface bridge port add bridge-lan eoip /ip address add 10.100.100.1/24 bridge-lan /ip address add 10.100.100.2/24 bridge-lan
6.1. Test tunelu GRE (warstwa 3)
Po skonfigurowaniu tunelu GRE na obu routerach sprawdzamy działanie przez ping końca tunelu:
# Z routera A - ping końca tunelu GRE (172.16.1.2 to tunel, nie fizyczne IP):
[admin@MikroTik] > /ping 172.16.1.2 count=5
SEQ HOST SIZE TTL TIME STATUS
0 172.16.1.2 56 64 267us
1 172.16.1.2 56 64 575us
2 172.16.1.2 56 64 743us
3 172.16.1.2 56 64 736us
4 172.16.1.2 56 64 853us
sent=5 received=5 packet-loss=0% min-rtt=267us avg-rtt=634us max-rtt=853us
BRAWO – tunel GRE działa. Wszystkie 5 pingów przeszło przez tunel z zerowa utrata pakietów (0% packet-loss).
Dalej: routing między sieciami LAN obu routerów przez tunel GRE. Router A ma LAN 10.10.10.0/24 (na lo), router B ma LAN 10.20.20.0/24 (na lo). Trasy statyczne: na A dodajemy 10.20.20.0/24 przez bramę 172.16.1.2, na B dodajemy 10.10.10.0/24 przez bramę 172.16.1.1.
# Z routera A - ping sieci lokalnej B przez tunel GRE:
[admin@MikroTik] > /ping 10.20.20.1 count=5
SEQ HOST SIZE TTL TIME STATUS
0 10.20.20.1 56 64 534us
1 10.20.20.1 56 64 898us
2 10.20.20.1 56 64 873us
3 10.20.20.1 56 64 771us
4 10.20.20.1 56 64 715us
sent=5 received=5 packet-loss=0% min-rtt=534us avg-rtt=758us max-rtt=898us
# Tablica routingu na routerze A (widać trasę aktywna):
[admin@MikroTik] > /ip route print
Flags: D - DYNAMIC; A - ACTIVE; c - CONNECT, s - STATIC
# DST-ADDRESS GATEWAY DISTANCE
;;; Do sieci B przez GRE
0 As 10.20.20.0/24 172.16.1.2 1
DAc 172.16.1.0/30 gre-test 0
DAc 192.168.53.0/24 ether1 0
Brawo – routing przez GRE działa. Trasa do zdalnej sieci jest oznaczona flaga A (active), a ping do sieci B przez tunel ma 0% utraty.
Multicast IP przez GRE: GRE przekazuje pakiety IP multicast (np. 224.0.0.5 dla OSPF, 224.0.0.9 dla RIPv2). Dzięki temu na tunelu GRE można uruchomić takie protokoły routingu jak OSPF czy RIPv2. BGP nie potrzebuje multicastu (działa na TCP). Jednak GRE nie przekazuje ramek Ethernet (ARP, DHCP discovery, raw L2).
6.2 Test tunelu EoIP (warstwa 2)
Po skonfigurowaniu EoIP + bridge-lan na obu routerach (tunnel-id=200, adresy 10.100.100.1/24 na A i 10.100.100.2/24 na B) testujemy komunikację L2:
# Z routera A - ping po L2 do routera B (przez EoIP/bridge-lan):
[admin@MikroTik] > /ping 10.100.100.2 count=5
SEQ HOST SIZE TTL TIME STATUS
0 10.100.100.2 56 64 507us
1 10.100.100.2 56 64 296us
2 10.100.100.2 56 64 727us
3 10.100.100.2 56 64 955us
4 10.100.100.2 56 64 729us
sent=5 received=5 packet-loss=0% min-rtt=296us avg-rtt=642us max-rtt=955us
Aby ten ping zadziałał, ARP (broadcast L2) MUSI przejść przez tunel EoIP. Gdyby EoIP nie przekazywał broadcastów, router A nie poznałby adresu MAC routera B i nie mógłby wysłać do niego ramki. To jest pierwszy niepozorny dowód, ze broadcasty L2 przechodzą przez EoIP.
6.3. Dowód przekazywania broadcastu i multicastu przez EoIP
Najlepszy dowód: sniffer pakietów na routerze B (przechwytujący na interfejsie eoip-test) i wygenerowanie broadcast/multicast z routera A. Poniżej wynik:
Cel testu
- Uruchamiamy sniffer pakietów na routerze B na interfejsie eoip-test
- Z routera A wysyłamy broadcast ICMP (ping 10.100.100.255) i multicast ICMP (ping 224.0.0.1) na bridge-lan
- Zatrzymujemy sniffer i oglądamy przechwycone ramki
Komendy testu
# Krok 1: na routerze B uruchom sniffer na interfejsie EoIP
/tool sniffer set filter-interface=eoip-test
/tool sniffer start
# Krok 2: z routera A wyślij broadcasty i multicasty
/ping 10.100.100.255 count=4 interface=bridge-lan
/ping 224.0.0.1 count=2 interface=bridge-lan
# Krok 3: na routerze B zatrzymaj sniffer i pokaż przechwycone pakiety
/tool sniffer stop
/tool sniffer packet print detail
Wynik sniffera na routerze B – dowód przekazywania L2 przez EoIP
0 time=0.306 num=1 direction=rx src-mac=FE:2D:B4:D3:8C:9E
dst-mac=01:80:C2:00:00:00 interface=eoip-test protocol=802.2 size=53
1 time=2.182 num=2 direction=tx src-mac=FE:44:3F:F2:73:4F
dst-mac=FF:FF:FF:FF:FF:FF interface=eoip-test
src-address=10.100.100.2:5678 (discovery)
dst-address=255.255.255.255:5678 (discovery) protocol=ip ip-protocol=udp
2 time=2.182 num=3 direction=tx src-mac=FE:44:3F:F2:73:4F
dst-mac=01:00:0C:CC:CC:CC interface=eoip-test protocol=802.2
3 time=2.182 num=4 direction=tx src-mac=FE:44:3F:F2:73:4F
dst-mac=01:80:C2:00:00:0E interface=eoip-test protocol=lldp
5 time=3.506 num=6 direction=rx src-mac=FE:2D:B4:D3:8C:9E
dst-mac=FF:FF:FF:FF:FF:FF interface=eoip-test
src-address=10.100.100.1 dst-address=10.100.100.255
protocol=ip ip-protocol=icmp size=70 ttl=255
7 time=4.508 num=8 direction=rx src-mac=FE:2D:B4:D3:8C:9E
dst-mac=FF:FF:FF:FF:FF:FF interface=eoip-test
src-address=10.100.100.1 dst-address=10.100.100.255
protocol=ip ip-protocol=icmp size=70 ttl=255
11 time=7.517 num=12 direction=rx src-mac=FE:2D:B4:D3:8C:9E
dst-mac=01:00:5E:00:00:01 interface=eoip-test
src-address=10.100.100.1 dst-address=224.0.0.1
protocol=ip ip-protocol=icmp size=70 ttl=1
13 time=8.519 num=14 direction=rx src-mac=FE:2D:B4:D3:8C:9E
dst-mac=01:00:5E:00:00:01 interface=eoip-test
src-address=10.100.100.1 dst-address=224.0.0.1
protocol=ip ip-protocol=icmp size=70 ttl=1
Interpretacja wyników – co pokazuje sniffer
| Ramka |
Adres docelowy MAC |
Co to jest? … |
Dowód |
| IP broadcast (ICMP) |
FF:FF:FF:FF:FF:FF … |
Broadcast IP – ping na 10.100.100.255 z .83 |
Broadcast L2 przeszedł przez EoIP: ramka od 10.100.100.1 do 10.100.100.255 z MAC broadcast |
| IP multicast (ICMP) |
01:00:5E:00:00:01 … |
Multicast IP – ping na 224.0.0.1 z .83 |
Multicast L2 przeszedł przez EoIP: adres MAC multicast 01:00:5E:00:00:01 (mapowanie 224.0.0.1) |
| MNDP discovery … |
FF:FF:FF:FF:FF:FF … |
MikroTik Neighbor Discovery Protocol (rozgłaszanie routerów w sieci) |
Broadcastowe rozgłaszanie MikroTik przeszło przez tunel EoIP |
| STP BPDU … |
01:80:C2:00:00:00 … |
Ramki Spanning Tree Protocol (RSTP) od obu końców |
RSTP BPDU (multicast L2) są wymieniane przez tunel – to dowód poprawnego mostkowania |
| LLDP … |
01:80:C2:00:00:0E … |
Link Layer Discovery Protocol (LLDP) |
Multicast L2 LLDP przeszedł przez tunel |
Dowód na działanie bridge (tablica ARP)
# Tablica ARP na routerze A - widać MAC z drugiej strony tunelu:
/ip arp print where interface=bridge-lan
Flags: D - DYNAMIC; C - COMPLETE
# ADDRESS MAC-ADDRESS INTERFACE STATUS
0 DC 10.100.100.2 FE:44:3F:F2:73:4F bridge-lan reachable
# Z routera B:
/ip arp print where interface=bridge-lan
Flags: D - DYNAMIC; C - COMPLETE
# ADDRESS MAC-ADDRESS INTERFACE STATUS
0 DC 10.100.100.1 FE:2D:B4:D3:8C:9E bridge-lan reachable
Interpretacja: Na routerze A wpis ARP dla 10.100.100.2 wskazuje MAC FE:44:3F:F2:73:4F (to adres MAC interfejsu eoip-test routera B). Na routerze B wpis dla 10.100.100.1 wskazuje FE:2D:B4:D3:8C:9E (MAC eoip-test routera A). Oznacza to, ze ARP (broadcast L2) przeszedł przez tunel EoIP i oba routery poznały swoje adresy MAC mostka – dokładnie tak, jakby były połączone kablem.
Podsumowanie testów na żywo:
1. Tunel GRE (L3): ping 5/5 (0% utraty) – działa routing IP przez tunel.
2. Routing L3 przez GRE: ping 10.20.20.1 z 10.10.10.1 – 5/5 (0% utraty).
3. Tunel EoIP (L2): ping 10.100.100.2 z 10.100.100.1 – 5/5 (0% utraty) – ARP przechodzi.
4. Broadcast IP (10.100.100.255) i multicast IP (224.0.0.1) wysłane z routera A dotarły do routera B w postaci ramek L2 (broadcast FF:FF:FF:FF:FF:FF i multicast 01:00:5E:00:00:01) – potwierdzone snifferem.
5. RSTP BPDU, LLDP i MNDP rozgłaszanie przechodzą przez tunel EoIP – mostkowanie L2 działa jak kabel.
7. Zasady zapory (firewall) dla tuneli
Tunele GRE i EoIP używają protokołu IP numer 47 (nie TCP, nie UDP). Aby tunele działały, firewall musi zezwalać na ten protokół.
Zezwolenie na ruch GRE/EoIP w firewallu
Router A (192.168.53.83)
# Zezwól na GRE/EoIP tylko od znanego routera
/ip firewall filter add chain=input \
protocol=gre \
src-address=192.168.53.84 \
action=accept \
comment="GRE/EoIP od routera B"
# Odrzuć GRE/EoIP z nieznanych źródeł
/ip firewall filter add chain=input \
protocol=gre \
action=drop \
comment="Odrzucenie GRE z nieznanych zrodel"
Router B (192.168.53.84)
# Zezwól na GRE/EoIP tylko od znanego routera
/ip firewall filter add chain=input \
protocol=gre \
src-address=192.168.53.83 \
action=accept \
comment="GRE/EoIP od routera A"
# Odrzuć GRE/EoIP z nieznanych źródeł
/ip firewall filter add chain=input \
protocol=gre \
action=drop \
comment="Odrzucenie GRE z nieznanych zrodel"
Weryfikacja na żywo: RouterOS 7.16.1, router 192.168.53.83
# Reguły firewall po dodaniu na routerze A:
/ip firewall filter print
# CHAIN ACTION PROTOCOL SRC-ADDRESS COMMENT
0 input accept gre 192.168.53.84 GRE od routera B
1 input drop gre Odrzucenie GRE z nieznanych zrodel
Uwaga: Reguły firewall dla GRE/EoIP powinny być dodane PRZED standardowymi regulami drop/accept w chain input. Użyj parametru place-before=0 aby wstawić regule na początek listy.
Ochrona ruchu przepływającego przez tunel
Aby kontrolować jaki ruch może przepływać przez tunel (forward), dodaj reguły w chain forward:
# Zezwól na przepływ ruchu z sieci lokalnych przez tunel
/ip firewall filter add chain=forward \
src-address=10.100.100.0/24 \
out-interface=gre-tunnel-84 \
action=accept \
comment="Ruch z sieci A do B przez GRE"
/ip firewall filter add chain=forward \
src-address=172.16.1.0/30 \
dst-address=10.100.100.0/24 \
in-interface=gre-tunnel-84 \
action=accept \
comment="Ruch z sieci B do A przez GRE"
8. Szyfrowanie – IPsec z tunelami
Oprócz prostej opcji ipsec-secret (pre-shared key), można skonfigurować pełne IPsec transport mode dla tuneli GRE lub EoIP. Jest to zalecane gdy tunele przechodzą przez sieci publiczne (internet).
Szyfrowanie automatyczne (ipsec-secret)
Można automatycznie zaszyfrować tunel GRE lub EoIP używając wbudowanej opcji IPsec. RouterOS sam utworzy peer, proposal i policy (tryb transport, protocol=gre):
# Dodanie klucza IPsec do tunelu GRE (szyfruje cały tunel)
/interface gre set gre-tunnel-84 ipsec-secret="moj-tajny-klucz-123"
# Lub dodanie klucza IPsec do tunelu EoIP
/interface eoip set eoip-to-84 ipsec-secret="moj-tajny-klucz-123"
Uwaga: Przy używaniu ipsec-secret włączenie fast-path na interfejsie tunelu nie jest możliwe – RouterOS blokuje to błędem „cannot enable fastpath together with ipsec yet”. Dlatego wyłącz allow-fast-path:
/interface gre set gre-tunnel-84 allow-fast-path=no
/interface eoip set eoip-to-84 allow-fast-path=no
IPsec transport mode dla GRE
## Router A ##
# Utwórz peer IPsec.
# UWAGA: "transport" nie jest wartością exchange-mode (są do wyboru
# aggressive|base|main|ike2). Tryb transportowy ustala się w policy
# parametrem tunnel=no (poniżej).
/ip ipsec peer add \
name=peer-to-84 \
address=192.168.53.84/32 \
local-address=192.168.53.83 \
exchange-mode=main \
passive=no
# Utwórz proposal
/ip ipsec proposal add name=prop-to-84 \
auth-algorithms=sha256 \
enc-algorithms=aes-256-cbc \
pfs-group=modp2048
# Utwórz profil
/ip ipsec profile add name=prof-to-84 \
hash-algorithm=sha256 \
enc-algorithm=aes-256 \
dh-group=modp2048 \
lifetime=8h \
dpd-interval=120s \
dpd-maximum-failures=5
# Utwórz ID peer (local)
/ip ipsec identity add peer=peer-to-84 \
auth-method=pre-shared-key \
secret="moj-bardzo-tajny-klucz"
# Utwórz policy - co zaszyfrować.
# tunnel=no = tryb TRANSPORT (szyfrujemy ruch GRE/gre między adresami peerów).
# tunnel=yes = tryb TUNELOWY (dodaje dodatkowy nagłówek IP z adresami
# SĄ) - NIE tego chcemy dla GRE.
/ip ipsec policy add \
src-address=192.168.53.83 \
dst-address=192.168.53.84 \
protocol=gre \
action=encrypt \
level=require \
tunnel=no \
sa-src-address=192.168.53.83 \
sa-dst-address=192.168.53.84 \
proposal=prop-to-84 \
peer=peer-to-84
Ważne – tryb transport vs tunelowy w policy IPsec: W RouterOS tryb transportowy i tunelowy różnią się WŁAŚNIE parametrem tunnel w /ip ipsec policy (transport: tunnel=no, tunelowy: tunnel=yes). Exchange-mode peer dotyczy tylko fazy IKE (aggressive/base/main/ike2) i nie ma wartości „transport”. Dla tunelu GRE/EoIP używamy transport mode (tunnel=no) z policy protocol=gre – dokładnie tak, jak robi automatyczna opcja ipsec-secret. Włączenie tunnel=yes dla GRE jest błędem: pakiet GRE zostaje dodatkowo zapakowany w osobny nagłówek IP (z adresami z policy), co wymaga dodatkowych adresów tunelowych i generuje większy overhead.
Na routerze B konfiguracja jest lustrzanym odbiciem (zamień src-address z dst-address).
Alternatywa:Jeśli nie chcesz ręcznej konfiguracji IPsec, użyj wbudowanej opcji ipsec-secret na interfejsie tunelu. Jest to prostsze rozwiązanie z automatyczną konfiguracją IPsec transport mode (domyślna propozycja: szyfrowanie AES-CBC, uwierzytelnianie SHA-1).
9. MTU i problem fragmentacji
Odpowiednie ustawienie MTU jest krytyczne dla poprawnego działania tuneli. Każdy tunel dodaje overhead (dodatkowe bajty nagłówków), co zmniejsza dostępne MTU dla danych użytkownika.
Overhead tunelów
| Tunel |
Overhead |
MTU na interfejsie |
Max danych użytkownika |
| GRE |
24 bajty (20 IP + 4 GRE) |
1476 |
1476 bajtów |
| EoIP |
42+ bajtów (20 IP + 8 GRE + 14 Ethernet) |
1458 |
1458 bajtów |
| GRE + IPsec (transport) |
~80-96 bajtów (24 GRE + ok. 56-72 ESP dla AES-256-CBC + SHA-256) |
orientacyjnie ~1405-1420 |
orientacyjnie ~1400-1420 bajtów |
| EoIP + IPsec (transport) |
~98-114 bajtów (42 EoIP + ok. 56-72 ESP) |
orientacyjnie ~1390-1410 |
orientacyjnie ~1390-1410 bajtów |
Uwaga do wierszy IPsec: Overhead IPsec zależy od użytych algorytmów: ESP dodaje 8 B nagłówka + 16 B IV, padding (0-15 B) oraz ICV (np. 32 B dla HMAC-SHA-256). Dla AES-GCM overhead wynosi ok. 32-47 B (mniej niż CBC). Podane wartości to orientacyjne zakresy dla konfiguracji proponowanej w sekcji 8 (AES-256-CBC + SHA-256) – zawsze weryfikuj faktyczny rozmiar pakietu komenda ping do-not-fragment.
Ważne – MTU a ipsec-secret: RouterOS NIE zmniejsza automatycznie MTU interfejsu tunelu po dodaniu ipsec-secret. W testach na 7.16.1 interfejs GRE z mtu=auto po dodaniu szyfrowania raportował niezredukowane actual-mtu. Po włączeniu IPsec ustaw MTU ręcznie tak, aby zmieścić overhead (użyj zakresów z tabeli powyżej lub pomiaru).
Zalecane ustawienia MTU
# Dla tunelu GRE - ustawienie explicit MTU
/interface gre set gre-tunnel-84 mtu=1476
# Dla tunelu EoIP - ustawienie explicit MTU
/interface eoip set eoip-to-84 mtu=1458
# Jeśli tunel przechodzi przez PPPoE lub inny tunel z mniejszym MTU:
# Np. PPPoE MTU = 1492, to MTU tunelu = 1492 - 24 (GRE) = 1468
/interface gre set gre-tunnel-84 mtu=1468
Wskazówka – clamp-tcp-mss: Domyślnie oba tunele mają włączona opcje clamp-tcp-mss=yes. Opcja ta automatycznie dostosowuje TCP MSS (Maximum Segment Size) do odpowiedniej wartości, aby uniknąć fragmentacji pakietów TCP. Zazwyczaj nie trzeba jej zmieniać.
Testowanie MTU
# Test ping z dużym pakietem i bitem DF (Don't Fragment)
# Na routerze A - testowanie do końca tunelu:
# Test z pełnym pakietem (powinien przejść):
/ping 172.16.1.2 size=1448 do-not-fragment=yes
# Test z za dużym pakietem (powinien się nie powieść):
/ping 172.16.1.2 size=1449 do-not-fragment=yes
# Na Linux/Windows z testowaniem PMTUD (Path MTU Discovery):
# ping -M do -s 1448 172.16.1.2 (powinien przejść)
# ping -M do -s 1449 172.16.1.2 (powinien się nie powieść)
Zasada: Jeśli ping przechodzi z rozmiarem N ale nie przechodzi z rozmiarem N+1, to maksymalny MTU danych = N. Dodaj 28 bajtów (20 IP + 8 ICMP) = minimalny MTU tunelu. Np. ping size=1448 przechodzi -> MTU = 1448 + 28 = 1476 = prawidłowe MTU dla GRE.
10. Diagnostyka i rozwiązywanie problemów
Częsty problem i rozwiązania
| Problem |
Prawdopodobna przyczyna |
Rozwiązanie |
| Interfejs tunelu nie ma flagi „R” (running) |
Brak łączności z zdalnym końcem |
Sprawdź, czy zdalny router jest osiągalny. Sprawdź firewall, czy przepuszcza protocol 47 (GRE). Sprawdź, czy keepalive nie wygasł. |
| Tunel GRE działa, ale EoIP nie przekazuje ruchu |
EoIP nie jest dodany do bridge |
/interface bridge port add bridge=bridge1 interface=eoip-to-84 |
| Broadcasty nie przechodzą przez tunel |
Używasz GRE zamiast EoIP |
GRE przekazuje tylko L3 (IP). Użyj EoIP do przenoszenia broadcastów L2. |
| ARP nie działa przez EoIP |
Interface EoIP nie jest w bridge lub ARP jest wyłączony |
Sprawdź: /interface bridge port print – czy EoIP jest w bridge. Sprawdź: /interface eoip print – czy arp=enabled. |
| DHCP nie działa przez EoIP |
Bridge przekazuje broadcasty, ale serwer DHCP nie widzi klienta |
Sprawdź czy serwer DHCP jest na odpowiednim interfejsie (bridge1, nie ether1). Sprawdź czy broadcasty są forwardowane. |
| tunnel-id się różnią |
Różne wartości tunnel-id na końcach EoIP |
Ustaw identyczny tunnel-id na obu końcach: /interface eoip set tunnel-id=100 |
| Duplikaty MAC w logach |
Domyślne MAC EoIP się powtarzają |
Ustaw unikalne MAC z zakresu IANA: /interface eoip set mac-address=00:00:5E:80:00:01 |
| Wolne prędkości (~20 Mbps zamiast 100+ Mbps) |
Fragmentacja pakietów z powodu złego MTU |
Ustaw odpowiedni MTU: /interface gre set mtu=1476 lub /interface eoip set mtu=1458 |
| IPsec nie szyfruje |
Włączony allow-fast-path lub zły ipsec-secret |
Wyłącz fast-path: /interface gre set allow-fast-path=no. Sprawdź czy klucz jest identyczny na obu końcach. |
| Pętla broadcast (broadcast storm) |
Redundantne L2 ścieżki bez STP |
Włącz RSTP: /interface bridge set bridge1 protocol-mode=rstp |
| Keepalive nie działa, interfejs się nie wyłącza |
Keepalive nie jest skonfigurowany |
Dodaj keepalive: /interface gre set gre-tunnel-84 keepalive=10s,10 |
| Trasa jest INACTIVE |
Brama (gateway) jest nieosiągalna |
Sprawdź czy koniec tunelu ma IP i czy łączność istnieje: /ping 172.16.1.2 |
| Tunel EoIP za NAT-em nie działa dla wielu tuneli |
GRE nie ma portów (nie da się zmapować wielu tuneli przez NAT) |
Użyj jednego publicznego IP na każdy koniec lub użyj VXLAN (port UDP 4789) zamiast EoIP. |
Narzędzia diagnostyczne
# Przegląd wszystkich interfejsów tunelowych:
/interface gre print stats
/interface eoip print stats
# Monitorowanie ruchu na interfejsie (jednorazowy odczyt):
/interface monitor-traffic gre-tunnel-84 once
/interface monitor-traffic eoip-to-84 once
# Sprawdzanie tablicy ARP (sąsiedzi L2):
/ip arp print
# Sprawdzanie tablicy MAC bridge:
/interface bridge host print
# Sprawdzanie logów (czy są błędy):
/log print where topics~"interface"
# Sprawdzanie stanu IPsec (jeśli szyfrowane):
/ip ipsec active-peers print
/ip ipsec installed-sa print
# Sprawdzanie tras (czy brama tunelu jest aktywna):
/ip route print stats
# Pełna diagnostyka interfejsu:
# UWAGA: nie istnieje komenda "gre monitor" ani "eoip monitor".
# Jednorazowy pomiar ruchu robi się tak jak wyżej (monitor-traffic ... once),
# a stan tunelu sprawdza się przez print + kept (+ keepalive) + counters.
/interface gre print stats
/interface eoip print stats
Kompletny zestaw komend do kopiowania – Scenariusz 1 (GRE L3)
Router A (192.168.53.83)
#### KONFIGURACJA TUNELU GRE L3 - ROUTER A ####
# 1. Utwórz interfejs GRE
/interface gre add name=gre-tunnel-84 remote-address=192.168.53.84 local-address=192.168.53.83 keepalive=10s,10 comment="Tunel GRE do routera B"
# 2. Przypisz adres IP tunelu
/ip address add address=172.16.1.1/30 interface=gre-tunnel-84 comment="Tunel GRE - koniec A"
# 3. Utwórz trasę do sieci zdalnej
/ip route add dst-address=10.20.20.0/24 gateway=172.16.1.2 comment="Trasa do sieci B przez GRE"
# 4. Firewall - zezwól na GRE
/ip firewall filter add chain=input protocol=gre src-address=192.168.53.84 action=accept comment="GRE od routera B" place-before=0
# 5. (Opcjonalnie) Szyfrowanie IPsec
/interface gre set gre-tunnel-84 ipsec-secret="moj-tajny-klucz" allow-fast-path=no
Router B (192.168.53.84)
#### KONFIGURACJA TUNELU GRE L3 - ROUTER B ####
# 1. Utwórz interfejs GRE
/interface gre add name=gre-tunnel-83 remote-address=192.168.53.83 local-address=192.168.53.84 keepalive=10s,10 comment="Tunel GRE do routera A"
# 2. Przypisz adres IP tunelu
/ip address add address=172.16.1.2/30 interface=gre-tunnel-83 comment="Tunel GRE - koniec B"
# 3. Utwórz trasę do sieci zdalnej
/ip route add dst-address=10.10.10.0/24 gateway=172.16.1.1 comment="Trasa do sieci A przez GRE"
# 4. Firewall - zezwól na GRE
/ip firewall filter add chain=input protocol=gre src-address=192.168.53.83 action=accept comment="GRE od routera A" place-before=0
# 5. (Opcjonalnie) Szyfrowanie IPsec
/interface gre set gre-tunnel-83 ipsec-secret="moj-tajny-klucz" allow-fast-path=no
Kompletny zestaw komend do kopiowania – Scenariusz 2 (EoIP L2)
Router A (192.168.53.83)
#### KONFIGURACJA TUNELU EoIP L2 - ROUTER A ####
# 1. Utwórz interfejs EoIP
/interface eoip add name=eoip-to-84 remote-address=192.168.53.84 tunnel-id=100 comment="Tunel EoIP L2 do routera B"
# 2. Ustaw unikalny MAC (dla bridgowania)
/interface eoip set eoip-to-84 mac-address=00:00:5E:80:00:01
# 3. Utwórz bridge z RSTP
/interface bridge add name=bridge1 protocol-mode=rstp comment="Bridge L2 z EoIP"
# 4. Dodaj porty do bridge
/interface bridge port add bridge=bridge1 interface=eoip-to-84 comment="EoIP tunel L2"
/interface bridge port add bridge=bridge1 interface=ether2 comment="Port LAN (nie WAN/ether1!)"
# UWAGA: RouterOS 7 mógł automatycznie dodać do bridge ether1 (port z IP).
# Sprawdź i usuń: /interface bridge port remove [find where interface=ether1]
# 5. Przypisz IP do bridge (NIE do portów!)
/ip address add address=10.100.100.1/24 interface=bridge1 comment="Siec lokalna A"
# 6. Firewall - zezwól na EoIP/GRE
/ip firewall filter add chain=input protocol=gre src-address=192.168.53.84 action=accept comment="EoIP od routera B" place-before=0
# 7. (Opcjonalnie) Szyfrowanie IPsec
/interface eoip set eoip-to-84 ipsec-secret="moj-tajny-klucz" allow-fast-path=no
Router B (192.168.53.84)
#### KONFIGURACJA TUNELU EoIP L2 - ROUTER B ####
# 1. Utwórz interfejs EoIP
/interface eoip add name=eoip-to-83 remote-address=192.168.53.83 tunnel-id=100 comment="Tunel EoIP L2 do routera A"
# 2. Ustaw unikalny MAC (dla bridgowania)
/interface eoip set eoip-to-83 mac-address=00:00:5E:80:00:02
# 3. Utwórz bridge z RSTP
/interface bridge add name=bridge1 protocol-mode=rstp comment="Bridge L2 z EoIP"
# 4. Dodaj porty do bridge
/interface bridge port add bridge=bridge1 interface=eoip-to-83 comment="EoIP tunel L2"
/interface bridge port add bridge=bridge1 interface=ether2 comment="Port LAN (nie WAN/ether1!)"
# UWAGA: RouterOS 7 mógł automatycznie dodać do bridge ether1 (port z IP).
# Sprawdź i usuń: /interface bridge port remove [find where interface=ether1]
# 5. Przypisz IP do bridge (NIE do portów!)
/ip address add address=10.100.100.2/24 interface=bridge1 comment="Siec lokalna B"
# 6. Firewall - zezwól na EoIP/GRE
/ip firewall filter add chain=input protocol=gre src-address=192.168.53.83 action=accept comment="EoIP od routera A" place-before=0
# 7. (Opcjonalnie) Szyfrowanie IPsec
/interface eoip set eoip-to-83 ipsec-secret="moj-tajny-klucz" allow-fast-path=no
11. Podsumowanie i szybka ściąga
Co przekazuje każdy tunel?
| Typ ruchu |
GRE (L3) |
EoIP (L2) |
| Ruch IP unicast (ping, TCP, UDP) |
TAK |
TAK |
| Multicast IP (OSPF, RIPv2, PIM) |
TAK |
TAK |
| Broadcast IP (DHCP discovery) |
NIE |
TAK (jako broadcast L2) |
| ARP (Address Resolution Protocol) |
NIE |
TAK |
| Ruch nie-IP (IPX, AppleTalk) |
NIE |
TAK |
| VLAN tagged (802.1Q) |
NIE |
TAK |
| Ruch L2 (wszystkie ramki Ethernet) |
NIE |
TAK |
| Dynamiczne protokoły routingu (OSPF) |
TAK (multicast IP) |
TAK (jako L2 multicast) |
| Kompatybilność z Cisco/Juniper/Linux |
TAK |
NIE (tylko MikroTik) |
Szybka Ściąga Komend
| Czynność |
Komenda |
| Utworzenie tunelu GRE |
/interface gre add name=tunel remote-address=X local-address=Y keepalive=10s,10 |
| Utworzenie tunelu EoIP |
/interface eoip add name=tunel remote-address=X tunnel-id=N |
| Adres IP tunelu GRE |
/ip address add address=172.16.1.1/30 interface=tunel |
| Trasa przez GRE |
/ip route add dst-address=SIEC gateway=IP_KONCA_TUNELU |
| Bridge z EoIP |
/interface bridge add name=br1 protocol-mode=rstp |
| Dodanie portu do bridge |
/interface bridge port add bridge=br1 interface=tunel_eoip |
| IP na bridge |
/ip address add address=IP/MASK interface=br1 |
| Firewall GRE |
/ip firewall filter add chain=input protocol=gre src-address=X action=accept |
| IPsec na GRE |
/interface gre set tunel ipsec-secret="klucz" allow-fast-path=no |
| MAC dla EoIP |
/interface eoip set tunel mac-address=00:00:5E:80:00:01 |
| Sprawdź stan tunelu |
/interface gre print lub /interface eoip print |
| Test łączności |
/ping IP_KONCA_TUNELU |
| Tablica ARP |
/ip arp print |
| Tablica MAC bridge |
/interface bridge host print |
Zalecenia końcowe
- Zawsze używaj keepalivena tunelach GRE i EoIP. Bez keepalive, interfejs tunelu pozostaje „running” nawet gdy zdalny koniec jest niedostępny, co prowadzi do blackholingu ruchu.
- Włącz RSTP na wszystkich bridge, które mają więcej niż jeden port. Chroni przed pętlami L2 i broadcast storm.
- Ustaw unikalne MAC na tunelach EoIP dodawanych do bridge, aby algorytmy MAC learning działały poprawnie.
- Konfiguruj firewall aby zezwalać na GRE (protocol 47) tylko od znanych źródeł. Bez tego reguły tunele mogą nie działać.
- Testuj MTUpingiem z bitem DF (Don’t Fragment), aby upewnić się, że pakiety nie są fragmentowane.
- Nie mieszaj EoIP z GRE do tego samego celu. GRE służy do routingu L3, EoIP do bridgowania L2.
- Szyfruj tunelegdy przechodzą przez sieci publiczne. Używaj IPsec transport mode lub przynajmniej ipsec-secret.
- Włącz logowaniei monitorowanie:
/log add topics=interface aby rejestrować zmiany stanu interfejsów.