DualWAN и резервирование L2-тоннелей

Есть две площадки, на каждой по два провайдера – основной 100мбит/с и резервный 30мбит/с. Задача организовать доступ к роутерам через любого из провайдеров, зарезервировать доступ к интернет для клиентов за роутерами, а так же обеспечить отказоустойчивость тоннелей между роутерами.

Итак, согласно условия – роутеры настроены, клиенты за ними получают адреса от DHCP. RB1 раздаёт сеть 172.16.0.0/24, RB2 – 192.168.0.0/24. Основной провайдер для RB1 – 1.1.1.1/30 резерв – 2.2.2.2/30, для RB2 – 3.3.3.2/30 и резерв 4.4.4.2/30. Доступ для компьютеров в мир осуществляется через основные каналы.

Настроим доступ к роутерам через любой из их внешних адресов, научим их отвечать через тот интерфейс откуда пришел запрос соединения. Так же сделаем доступными ресурсы за NAT роутеров через любого провайдера. Реализаций резервирования доступа к внешней сети при использовании нескольких провайдеров существует не мало, в данном случае используем самый простой – Сheck Gateway для маршрута по умолчанию

Настройки RB1:

/ip address
add address=172.16.0.1/24 interface=bridge-local network=172.16.0.0
add address=1.1.1.2/30 interface=ether1 network=1.1.1.0
add address=2.2.2.2/30 interface=ether2 network=2.2.2.0

/ip firewall address-list
add address=172.16.0.0/24 list=LAN
add address=0.0.0.0/8 list=BOGON
add address=10.0.0.0/8 list=BOGON
add address=127.0.0.0/8 list=BOGON
add address=169.254.0.0/16 list=BOGON
add address=172.16.0.0/12 list=BOGON
add address=192.0.0.0/24 list=BOGON
add address=192.0.2.0/24 list=BOGON
add address=192.88.99.0/24 list=BOGON
add address=192.168.0.0/16 list=BOGON
add address=198.18.0.0/15 list=BOGON
add address=198.51.100.0/24 list=BOGON
add address=203.0.113.0/24 list=BOGON
add address=224.0.0.0/4 list=BOGON
add address=240.0.0.0/4 list=BOGON
add address=255.255.255.255 list=BOGON

/ip firewall filter
add action=accept chain=input comment="Allow Ping" in-interface-list=WAN protocol=icmp
add action=accept chain=input comment="Allow GRE" in-interface-list=WAN protocol=gre

/ip firewall mangle
add action=mark-connection chain=prerouting comment="allow access to RB" connection-state=new dst-address=1.1.1.2 in-interface=ether1 new-connection-mark=Prerouting/GW/1.1.1.1 passthrough=no
add action=mark-connection chain=prerouting connection-state=new dst-address=2.2.2.2 in-interface=ether2 new-connection-mark=Prerouting/GW/2.2.2.1 passthrough=no
add action=mark-routing chain=output connection-mark=Prerouting/GW/1.1.1.1 new-routing-mark=Next-Hop/1.1.1.1 passthrough=no
add action=mark-routing chain=prerouting connection-mark=Prerouting/GW/2.2.2.1 new-routing-mark=Next-Hop/2.2.2.1 passthrough=no
add action=mark-routing chain=output comment="allow out from RB" dst-address-list=!BOGON new-routing-mark=Next-Hop/1.1.1.1 passthrough=no src-address=1.1.1.2
add action=mark-routing chain=output dst-address-list=!BOGON new-routing-mark=Next-Hop/2.2.2.1 passthrough=no src-address=2.2.2.2
add action=mark-routing chain=prerouting comment="allow access over NAT" connection-mark=Prerouting/GW/1.1.1.1 in-interface=!ether1 new-routing-mark=Next-Hop/1.1.1.1 passthrough=no
add action=mark-routing chain=prerouting connection-mark=Prerouting/GW/2.2.2.1 in-interface=!ether2 new-routing-mark=Next-Hop/2.2.2.1 passthrough=no

/ip firewall nat
add action=masquerade chain=srcnat out-interface-list=WAN
add action=dst-nat chain=dstnat dst-address=1.1.1.2 dst-port=25,465,993 in-interface=ether1 protocol=tcp to-addresses=172.16.0.100
add action=dst-nat chain=dstnat dst-address=2.2.2.2 dst-port=25,465,993 in-interface=ether2 protocol=tcp to-addresses=172.16.0.100

/ip route
add distance=1 gateway=1.1.1.1 routing-mark=Next-Hop/1.1.1.1
add distance=1 gateway=2.2.2.1 routing-mark=Next-Hop/2.2.2.1
add check-gateway=ping comment=ISP1 distance=1 gateway=1.1.1.1
add comment=ISP2 distance=2 gateway=2.2.2.1

/ip route rule
add action=lookup-only-in-table routing-mark=Next-Hop/1.1.1.1 table=Next-Hop/1.1.1.1
add action=lookup-only-in-table routing-mark=Next-Hop/2.2.2.1 table=Next-Hop/2.2.2.1

/interface bridge
add name=Br-Loopback

/ip route
add distance=254 gateway=Br-Loopback pref-src=1.1.1.2

Настройки RB2:

/ip address
add address=3.3.3.2/30 interface=ether1 network=3.3.3.0
add address=4.4.4.2/30 interface=ether2 network=4.4.4.0
add address=192.168.0.1/24 interface=bridge-local network=192.168.0.0


/ip firewall address-list
add address=192.168.0.0/24 list=LAN
add address=0.0.0.0/8 list=BOGON
add address=10.0.0.0/8 list=BOGON
add address=127.0.0.0/8 list=BOGON
add address=169.254.0.0/16 list=BOGON
add address=172.16.0.0/12 list=BOGON
add address=192.0.0.0/24 list=BOGON
add address=192.0.2.0/24 list=BOGON
add address=192.88.99.0/24 list=BOGON
add address=192.168.0.0/16 list=BOGON
add address=198.18.0.0/15 list=BOGON
add address=198.51.100.0/24 list=BOGON
add address=203.0.113.0/24 list=BOGON
add address=224.0.0.0/4 list=BOGON
add address=240.0.0.0/4 list=BOGON
add address=255.255.255.255 list=BOGON

/ip firewall filter
add action=accept chain=input comment="Allow Ping" in-interface-list=WAN protocol=icmp
add action=accept chain=input comment="Allow GRE" in-interface-list=WAN protocol=gre

/ip firewall mangle
add action=mark-connection chain=prerouting comment="allow access to RB" connection-state=new dst-address=3.3.3.1 in-interface=ether1 new-connection-mark=Prerouting/GW/3.3.3.1 passthrough=no
add action=mark-connection chain=prerouting connection-state=new dst-address=4.4.4.1 in-interface=ether2 new-connection-mark=Prerouting/GW/4.4.4.1 passthrough=no
add action=mark-routing chain=output connection-mark=Prerouting/GW/3.3.3.1 new-routing-mark=Next-Hop/3.3.3.1 passthrough=no
add action=mark-routing chain=output connection-mark=Prerouting/GW/4.4.4.1 new-routing-mark=Next-Hop/4.4.4.1 passthrough=no
add action=mark-routing chain=output comment="allow out from RB" dst-address-list=!BOGON new-routing-mark=Next-Hop/3.3.3.1 passthrough=no src-address=3.3.3.2
add action=mark-routing chain=output dst-address-list=!BOGON new-routing-mark=Next-Hop/4.4.4.1 passthrough=no src-address=4.4.4.2
add action=mark-routing chain=prerouting comment="allow access over NAT" connection-mark=Prerouting/GW/3.3.3.1 in-interface=!ether1 new-routing-mark=Next-Hop/3.3.3.1 passthrough=no
add action=mark-routing chain=prerouting connection-mark=Prerouting/GW/4.4.4.1 in-interface=!ether2 new-routing-mark=Next-Hop/4.4.4.1 passthrough=no

/ip firewall nat
add action=masquerade chain=srcnat out-interface-list=WAN
add action=dst-nat chain=dstnat dst-address=3.3.3.2 dst-port=25,465,993 in-interface=ether1 protocol=tcp to-addresses=192.168.0.100
add action=dst-nat chain=dstnat dst-address=4.4.4.2 dst-port=25,465,993 in-interface=ether2 protocol=tcp to-addresses=192.168.0.100

/ip route
add distance=1 gateway=3.3.3.1 routing-mark=Next-Hop/3.3.3.1
add distance=1 gateway=4.4.4.1 routing-mark=Next-Hop/4.4.4.1
add check-gateway=ping comment=ISP1 distance=1 gateway=3.3.3.1
add comment=ISP2 distance=2 gateway=4.4.4.1

/ip route rule
add action=lookup-only-in-table routing-mark=Next-Hop/3.3.3.1 table=Next-Hop/3.3.3.1
add action=lookup-only-in-table routing-mark=Next-Hop/4.4.4.1 table=Next-Hop/4.4.4.1

/interface bridge
add name=Br-Loopback

/ip route
add distance=254 gateway=Br-Loopback pref-src=3.3.3.2

Отключим доступ к основному провайдеру для RB1 и проверим доступ к внешней сети для компьютеров из сети 172.16.0.0/24.

Тоннели между роутерами – будем использовать EoIP. Для их резервирования используем Bonding. Причем, чтобы обеспечить приоритет основных провайдеров при условии одновременного использования 4х тоннелей, Объединяем два тоннеля через одного провайдера в bond1, два других тоннеля через второго провайдера в bond2. А затем уже bond1 и bond2 в один общий bond, с указанием приоритетного канала.

Настройка EoIP тоннелей для RB1

 /interface eoip 
add allow-fast-path=no keepalive=3s,3 local-address=1.1.1.2 name=1-eoip-RB1viaISP1-RB2viaISP1 remote-address=3.3.3.2 tunnel-id=1 
add allow-fast-path=no keepalive=3s,3 local-address=2.2.2.2 name=2-eoip-RB1viaISP2-RB2viaISP1 remote-address=3.3.3.2 tunnel-id=2 
add allow-fast-path=no keepalive=3s,3 local-address=1.1.1.2 name=3-eoip-RB1viaISP1-RB2viaISP2 remote-address=4.4.4.2 tunnel-id=3 
add allow-fast-path=no keepalive=3s,3 local-address=2.2.2.2 name=4-eoip-RB1viaISP2-RB2viaISP2 remote-address=4.4.4.2 tunnel-id=4 

/interface bonding 
add mode=active-backup name=1-bonding-eoip-viaISP1 primary=1-eoip-RB1viaISP1-RB2viaISP1 slaves=1-eoip-RB1viaISP1-RB2viaISP1,3-eoip-RB1viaISP1-RB2viaISP2 
add mode=active-backup name=2-bonding-eoip-viaISP2 primary=2-eoip-RB1viaISP2-RB2viaISP1 slaves=2-eoip-RB1viaISP2-RB2viaISP1,4-eoip-RB1viaISP2-RB2viaISP2 
add mode=active-backup name=bonding-eoip-RB2 primary=1-bonding-eoip-viaISP1 slaves=1-bonding-eoip-viaISP1,2-bonding-eoip-viaISP2 

/ip address add address=10.0.0.1/30 interface=bonding-eoip-RB2 network=10.0.0.0 

/ip route add distance=1 dst-address=192.168.0.0/24 gateway=10.0.0.2

Настройка EoIP тоннелей для RB2

/interface eoip 
add allow-fast-path=no keepalive=3s,3 local-address=3.3.3.2 name=1-eoip-RB2viaISP1-RB1viaISP1 remote-address=1.1.1.2 tunnel-id=1 
add allow-fast-path=no keepalive=3s,3 local-address=3.3.3.2 name=2-eoip-RB2viaISP1-RB1viaISP2 remote-address=2.2.2.2 tunnel-id=2 
add allow-fast-path=no keepalive=3s,3 local-address=4.4.4.2 name=3-eoip-RB2viaISP2-RB1viaISP1 remote-address=1.1.1.2 tunnel-id=3 
add allow-fast-path=no keepalive=3s,3 local-address=4.4.4.2 name=4-eoip-RB2viaISP2-RB1viaISP2 remote-address=2.2.2.2 tunnel-id=4 

/interface bonding 
add mode=active-backup name=1-bonding-eoip-viaISP1 primary=1-eoip-RB2viaISP1-RB1viaISP1 slaves=1-eoip-RB2viaISP1-RB1viaISP1,2-eoip-RB2viaISP1-RB1viaISP2 
add mode=active-backup name=2-bonding-eoip-viaISP2 primary=3-eoip-RB2viaISP2-RB1viaISP1 slaves=3-eoip-RB2viaISP2-RB1viaISP1,4-eoip-RB2viaISP2-RB1viaISP2 
add mode=active-backup name=bonding-eoip-RB1 primary=1-bonding-eoip-viaISP1 slaves=1-bonding-eoip-viaISP1,2-bonding-eoip-viaISP2 

/ip address 
add address=10.0.0.2/30 interface=bonding-eoip-RB1 network=10.0.0.0 

/ip route 
add distance=1 dst-address=172.16.0.0/24 gateway=10.0.0.1

Проверка работы тоннелей

Проверяем работу тоннелей при отключении основного провайдера для RB1. Скорость переключения зависит от параметра keepalive для тоннеля.

Видно, что для RB1 остаются активными только тоннели через резервный канал

Далее отключение основного провайдера для RB2. Теперь активны только тоннели через резервные каналы

Восстанавливаем работу основных провайдеров по очереди, сначала для RB1, затем для RB2. Задержки при переключении минимальные или вовсе отсутствуют

За основу данного решения взята презентация Васильева Кирилла с MUM в Ростове-на-Дону, март 2019г.