Такс ну начнем. Имеем следующий стенд собранный на MetaROUTER
MR1 имеет 2х операторов
MR2 имеет одного оператора
Задача поднять 2 GRE тоннеля
т.к. GRE это тоннель типа точка-точка то обе железки шлют друг другу пакетики и соответсвено для начала нам надо понять с какова оператора пришел пакет на MR1 размечаем трафик
Конфиг MR1 (исходный)
/interface ethernet
set [ find ] name=ether1_isp1
set [ find ] name=ether2_isp2
set [ find ] name=ether3
/interface gre
add allow-fast-path=no clamp-tcp-mss=no local-address=10.0.0.2 name=gre-mr2-isp1 remote-address=10.0.2.2
add allow-fast-path=no clamp-tcp-mss=no local-address=10.0.1.2 name=gre-mr2-isp2 remote-address=10.0.2.2
/interface list
add name=wan
/interface list member
add interface=ether1_isp1 list=wan
add interface=ether2_isp2 list=wan
/ip address
add address=10.0.0.2/30 interface=ether1_isp1 network=10.0.0.0
add address=10.0.1.2/30 interface=ether2_isp2 network=10.0.1.0
/ip firewall mangle
add action=mark-connection chain=input in-interface=ether1_isp1 new-connection-mark=in_isp1 passthrough=yes
add action=mark-routing chain=output connection-mark=in_isp1 new-routing-mark=isp1_route passthrough=yes
add action=mark-connection chain=input in-interface=ether2_isp2 new-connection-mark=in_isp2 passthrough=yes
add action=mark-routing chain=output connection-mark=in_isp2 new-routing-mark=isp2_route passthrough=yes
/ip firewall nat
add action=masquerade chain=srcnat out-interface-list=wan
/ip route
add distance=1 gateway=10.0.0.1 routing-mark=isp1_route
add distance=1 gateway=10.0.1.1 routing-mark=isp2_route
add distance=1 gateway=10.0.0.1
/ip route rule
add action=lookup-only-in-table routing-mark=isp1_route table=isp1_route
add action=lookup-only-in-table routing-mark=isp2_route table=isp2_route
/system identity
set name=mr1
На MR2 один оператор и потому ничего там размечать не надо пусть работает как есть
Конфиг MR2
/interface ethernet
set [ find ] name=ether1_isp
set [ find ] name=ether2
/interface gre
add allow-fast-path=no clamp-tcp-mss=no local-address=10.0.2.2 name=gre-mr1-isp1 remote-address=10.0.0.2
add allow-fast-path=no clamp-tcp-mss=no local-address=10.0.2.2 name=gre-mr1-isp2 remote-address=10.0.1.2
/ip address
add address=10.0.2.2/30 interface=ether1_isp network=10.0.2.0
/ip cloud
set update-time=no
/ip firewall nat
add action=masquerade chain=srcnat out-interface=ether1_isp
/ip route
add distance=1 gateway=10.0.2.1
/system identity
set name=mr2
Роутер по середине просто роутер и все, ничего там нет, типа глобальный роутер всея Интернет
Сходу запускаем с двух сторон GRE и видим жесть. Видим, что тоннели как то неправильно поднялись. Данная картина может меняться как ей угодно и в зависимости от того как вы настроили резервирование и как разметили трафик. В общем хаос.
[admin@mr2] > /interface gre print
Flags: X - disabled, R - running
0 R name="gre-mr1-isp1" mtu=auto actual-mtu=1476 local-address=10.0.2.2
remote-address=10.0.0.2 keepalive=10s,10 dscp=inherit clamp-tcp-mss=no
dont-fragment=no allow-fast-path=no
1 name="gre-mr1-isp2" mtu=auto actual-mtu=1476 local-address=10.0.2.2
remote-address=10.0.1.2 keepalive=10s,10 dscp=inherit clamp-tcp-mss=no
dont-fragment=no allow-fast-path=no
[admin@mr1] > /interface gre print
Flags: X - disabled, R - running
0 name="gre-mr2-isp1" mtu=auto actual-mtu=1476 local-address=10.0.0.2
remote-address=10.0.2.2 keepalive=10s,10 dscp=inherit clamp-tcp-mss=no
dont-fragment=no allow-fast-path=no
1 R name="gre-mr2-isp2" mtu=auto actual-mtu=1476 local-address=10.0.1.2
remote-address=10.0.2.2 keepalive=10s,10 dscp=inherit clamp-tcp-mss=no
dont-fragment=no allow-fast-path=no
А в логе можно увидеть еще более интересную картину
01:00:30 firewall,info output: in:(unknown 0) out:ether1_isp1, proto 47, 10.0.1.2->10.0.2.2, NAT (10.0.1.2->10.0.0.2)->10.0.2.2, len 48
Вроде начинает прояснятся. Микротик отправляет GRE запрос который должен идти через ISP2 отправляет через основной маршрут и в результате каша. Обратимся к схемке
И что видим, оказывается пакет сначала попадает в mangle output потом фильтры и потом пошла в маршрутизацию в Мир, собственно при нашем конфиге понятно по какой причине пакет c MR1 на MR2 для второго тоннеля ушел через ISP1 надо заставить его уйти через ISP2 т.к. микротик сам по себе не понимает че с ним делать и пихает в main таблицу
Заставляем:
/ip firewall mangle
add action=mark-routing chain=output new-routing-mark=isp1_route passthrough=yes src-address=10.0.0.2
add action=mark-routing chain=output new-routing-mark=isp2_route passthrough=yes src-address=10.0.1.2
И т.к. я MetaROUTER использую то оно все маленько лагает и вынужден отправить все в перезагрузку что бы сбросились все соединения, в нормальной ситуации их достаточно сбросить в connections
Далее запускаем тоннели и радуемся жизни и в логах порядок. Правда есть еще один подводный камень. В случае если вы используете несколько таблиц маршрутизации то в момент когда все маршруты в ней отвалились, микротик начинает пихать соединения в main таблицу и GRE у вас упадет (к стати это основа для нормального резервирования и агрегации, но это отдельная песня), поэтому обращаем внимание на ip – route - rules
как то так