Внедорожник Интернета: балансировка трафика между 4-мя провайдерами в Mikrotik

Что ж, друзья, недавно меня посетила идея создания максимально надежного подключения к сети Интернет с помощью роутера Mikrotik, при котором все 4 WAN-порта использовались бы для выхода в Интернет и по двум из них можно было бы «проникнуть» внутрь моей сети с определенных внешних адресов, например, используя подключение к Удаленному рабочему столу Windows или Apple Remote Desktop. На просторах Интернета я нашел вот такой скрипт, который реализует одновременное использование четырех портов WAN:

/ip address
add address=192.168.0.1/24 network=192.168.0.0 broadcast=192.168.0.255 interface=Local
add address=192.168.1.2/24 network=192.168.1.0 broadcast=192.168.1.255 interface=WAN1
add address=192.168.2.2/24 network=192.168.2.0 broadcast=192.168.2.255 interface=WAN2
add address=192.168.3.2/24 network=192.168.3.0 broadcast=192.168.3.255 interface=WAN3
add address=192.168.4.2/24 network=192.168.4.0 broadcast=192.168.4.255 interface=WAN4

/ip firewall mangle
add chain=input in-interface=WAN1 action=mark-connection new-connection-mark=WAN1_conn
add chain=input in-interface=WAN2 action=mark-connection new-connection-mark=WAN2_conn
add chain=input in-interface=WAN3 action=mark-connection new-connection-mark=WAN3_conn
add chain=input in-interface=WAN4 action=mark-connection new-connection-mark=WAN4_conn

add chain=output connection-mark=WAN1_conn action=mark-routing new-routing-mark=to_WAN1
add chain=output connection-mark=WAN2_conn action=mark-routing new-routing-mark=to_WAN2
add chain=output connection-mark=WAN3_conn action=mark-routing new-routing-mark=to_WAN3
add chain=output connection-mark=WAN4_conn action=mark-routing new-routing-mark=to_WAN4

add chain=prerouting dst-address=192.168.1.0/24 action=accept in-interface=Local
add chain=prerouting dst-address=192.168.2.0/24 action=accept in-interface=Local
add chain=prerouting dst-address=192.168.3.0/24 action=accept in-interface=Local
add chain=prerouting dst-address=192.168.4.0/24 action=accept in-interface=Local

add chain=prerouting dst-address-type=!local in-interface=Local per-connection-classifier=both-addresses-and-ports:4/0 action=mark-connection new-connection-mark=WAN1_conn passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=Local per-connection-classifier=both-addresses-and-ports:4/1 action=mark-connection new-connection-mark=WAN2_conn passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=Local per-connection-classifier=both-addresses-and-ports:4/2 action=mark-connection new-connection-mark=WAN3_conn passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=Local per-connection-classifier=both-addresses-and-ports:4/3 action=mark-connection new-connection-mark=WAN4_conn passthrough=yes

add chain=prerouting connection-mark=WAN1_conn in-interface=Local action=mark-routing new-routing-mark=to_WAN1
add chain=prerouting connection-mark=WAN2_conn in-interface=Local action=mark-routing new-routing-mark=to_WAN2
add chain=prerouting connection-mark=WAN3_conn in-interface=Local action=mark-routing new-routing-mark=to_WAN3
add chain=prerouting connection-mark=WAN4_conn in-interface=Local action=mark-routing new-routing-mark=to_WAN4

/ip route
add dst-address=0.0.0.0/0 gateway=192.168.1.1 routing-mark=to_WAN1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.2.1 routing-mark=to_WAN2 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.3.1 routing-mark=to_WAN3 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.4.1 routing-mark=to_WAN4 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.1.1 distance=1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.2.1 distance=2 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.3.1 distance=3 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.4.1 distance=4 check-gateway=ping

/ip firewall nat
add chain=srcnat out-interface=WAN1 action=masquerade
add chain=srcnat out-interface=WAN2 action=masquerade
add chain=srcnat out-interface=WAN3 action=masquerade
add chain=srcnat out-interface=WAN4 action=masquerade

Поскольку я впервые столкнулся с подобной довольно сложной конфигурацией, я по началу даже не понял, что мне делать с конфигурацией, которую я нашел, куда и как ее вставлять, но буквально через пару минут стало ясно, что вводить их нужно в окне терминала, того, который находится внутри программы WinBox через пункт «New Terminal».

К примеру, сначала вводим в окне терминала команду:

/ip address

а затем уже вводим все остальные команды.

В целом такая конфигурация мне подошла, единственное, что первую часть, где идет настройка IP адресов по каждому интерфейсу я для себя решил пропустить, поскольку они уже были у меня настроены: пятый порт отвечал за мою локальную сеть и от него провод шел к отдельному неуправляемому коммутатору, а остальные порты со 1-го по 4-й были настроены на автоматическое получение IP-адресов и как раз должны были стать четырьмя «провайдерскими» портами.  Чтобы не было ни какой путаницы, номер WAN порта соответствует номеру порта на Микротике, а также -подсети использованы тоже по аналогии: 192.168.1.X-192.168.4.X, что достигается использованию дополнительных коммутаторов, которые в моем случае выполняют роли WI-FI клиентов и предварительных DNS-фильтров, но это уже  совсем отдельная история и предмет для отдельной статьи. Если кому будет интересно как это реализовано, пишите, и я с удовольствием поделюсь и этим опытом.

Вообще перед тем как подключать провода ко всем WAN портам, каждый провайдерский кабель был проверен на предмет корректности получения IP адреса по DHCP и наличию Интернета. Только после этого начинаем подключать провода в соответствующие разъемы WAN1-WAN4.

Изначально в найденной конфигурации все входящие пакеты маркировались префиксами «_conn», а исходящие как «to_», но для лучшего понимания я их заменил на «in» (входящие из Интернета) и «out» (исходящие в сторону Интернета).

В конечном итоге, если настраивать Mikrotik с нуля, у меня получилась вот такая конфигурация:

/ip dhcp-client add interface WAN1
/ip dhcp-client add interface WAN2
/ip dhcp-client add interface WAN3
/ip dhcp-client add interface WAN4
/ip dhcp-client enable 0
/ip dhcp-client enable 1
/ip dhcp-client enable 2
/ip dhcp-client enable 3
/ip address add address=192.168.79.50/24 network=192.168.79.0 broadcast=192.168.78.255 interface=LAN5
/ip pool add name=dhcp79x ranges=192.168.79.100-192.168.79.200
/ip dhcp-server add address-pool=dhcp79x interface=LAN5 name=dhcp-server79x disabled=no
/ip dhcp-server network add address=192.168.79.0/24 dns-server=192.168.79.50 gateway=192.168.79.50

/ip firewall mangle
add chain=input in-interface=WAN1 action=mark-connection new-connection-mark=WAN1_in
add chain=input in-interface=WAN2 action=mark-connection new-connection-mark=WAN2_in
add chain=input in-interface=WAN3 action=mark-connection new-connection-mark=WAN3_in
add chain=input in-interface=WAN4 action=mark-connection new-connection-mark=WAN4_in

add chain=output connection-mark=WAN1_in action=mark-routing new-routing-mark=WAN1_out
add chain=output connection-mark=WAN2_in action=mark-routing new-routing-mark=WAN2_out
add chain=output connection-mark=WAN3_in action=mark-routing new-routing-mark=WAN3_out
add chain=output connection-mark=WAN4_in action=mark-routing new-routing-mark=WAN4_out

add chain=prerouting dst-address=192.168.1.0/24 action=accept in-interface=LAN5
add chain=prerouting dst-address=192.168.2.0/24 action=accept in-interface=LAN5
add chain=prerouting dst-address=192.168.103.0/24 action=accept in-interface=LAN5
add chain=prerouting dst-address=192.168.4.0/24 action=accept in-interface=LAN5

add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:4/0 action=mark-connection new-connection-mark=WAN1_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:4/1 action=mark-connection new-connection-mark=WAN2_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:4/2 action=mark-connection new-connection-mark=WAN3_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:4/3 action=mark-connection new-connection-mark=WAN4_in passthrough=yes

add chain=prerouting connection-mark=WAN1_in in-interface=LAN5 action=mark-routing new-routing-mark=WAN1_out
add chain=prerouting connection-mark=WAN2_in in-interface=LAN5 action=mark-routing new-routing-mark=WAN2_out
add chain=prerouting connection-mark=WAN3_in in-interface=LAN5 action=mark-routing new-routing-mark=WAN3_out
add chain=prerouting connection-mark=WAN4_in in-interface=LAN5 action=mark-routing new-routing-mark=WAN4_out

/ip firewall nat 
add chain=srcnat out-interface=WAN1 action=masquerade
add chain=srcnat out-interface=WAN2 action=masquerade
add chain=srcnat out-interface=WAN3 action=masquerade
add chain=srcnat out-interface=WAN4 action=masquerade

/ip route
add dst-address=0.0.0.0/0 gateway=192.168.1.1 routing-mark=WAN1_out check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.2.1 routing-mark=WAN2_out check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.103.1 routing-mark=WAN3_out check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.4.1 routing-mark=WAN4_out check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.1.1 distance=1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.2.1 distance=2 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.103.1 distance=3 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.4.1 distance=4 check-gateway=ping

Предварительные замеры скорости по каждому провайдеру составили:

1 — 35 Мбит, 2 — 20 Мбит, 3 — 55 Мбит, 4 — 5 Мбит

В пропорции определяем количество обращений к каждому порту WAN:

WAN1 — 7 раз, WAN2 — 4 раза, WAN3 — 11 раз, WAN4 — 1 раз, общее количество правил получится целых 24 и все из-за одного четвертого медленного порта…

Поэтому правила предварительной маршрутизации в моем случае должны выстроиться в такую длинную цепочку:

add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/0 action=mark-connection new-connection-mark=WAN1_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/1 action=mark-connection new-connection-mark=WAN1_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/2 action=mark-connection new-connection-mark=WAN1_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/3 action=mark-connection new-connection-mark=WAN1_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/4 action=mark-connection new-connection-mark=WAN1_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/5 action=mark-connection new-connection-mark=WAN1_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/6 action=mark-connection new-connection-mark=WAN1_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/7 action=mark-connection new-connection-mark=WAN2_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/8 action=mark-connection new-connection-mark=WAN2_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/9 action=mark-connection new-connection-mark=WAN2_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/10 action=mark-connection new-connection-mark=WAN2_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/11 action=mark-connection new-connection-mark=WAN3_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/12 action=mark-connection new-connection-mark=WAN3_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/13 action=mark-connection new-connection-mark=WAN3_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/14 action=mark-connection new-connection-mark=WAN3_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/15 action=mark-connection new-connection-mark=WAN3_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/16 action=mark-connection new-connection-mark=WAN3_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/17 action=mark-connection new-connection-mark=WAN3_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/18 action=mark-connection new-connection-mark=WAN3_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/19 action=mark-connection new-connection-mark=WAN3_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/20 action=mark-connection new-connection-mark=WAN3_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/21 action=mark-connection new-connection-mark=WAN3_in passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=LAN5 per-connection-classifier=both-addresses-and-ports:23/22 action=mark-connection new-connection-mark=WAN4_in passthrough=yes

В общем после всех экспериментов пришел к выводу, что такая конфигурация не очень хорошо отрабатывает, т.к. конечная скорость Интернета не то что не суммировалась, а стала даже ниже, чем скорость одного из провайдеров.

Теперь решил взять за основу другую типовую конфигурацию:

# Настроим сети провайдеров:
/ip address add address=10.100.1.1/24 interface=ISP1
/ip address add address=10.200.1.1/24 interface=ISP2

# Настроим локальный интерфейс
/ip address add address=10.1.1.1/24 interface=LAN

# скроем за NAT все что выходит из локальной сети
/ip firewall nat add src-address=10.1.1.0/24 action=masquerade chain=srcnat

#Пометим каждое соединение пришедшее снаружи и адресованное нашему роутеру:
/ip firewall mangle add action=mark-connection chain=input in-interface=ISP1 new-connection-mark=cin_ISP1
/ip firewall mangle add action=mark-connection chain=input in-interface=ISP2 new-connection-mark=cin_ISP2

#что бы отвечать через те же интерфейсы, откуда пришли запросы, поставим соответствующую роутинг-марку на каждое соединение.
/ip firewall mangle add action=mark-routing chain=output connection-mark=cin_ISP1 new-routing-mark=rout_ISP1 passthrough=no
/ip firewall mangle add action=mark-routing chain=output connection-mark=cin_ISP2 new-routing-mark=rout_ISP2 passthrough=no

#добавим default gateway в каждую из промаркированных таблиц маршрутизации:
/ip route add distance=1 gateway=10.100.1.254 routing-mark=rout_ISP1 check-gateway=ping
/ip route add distance=1 gateway=10.200.1.254 routing-mark=rout_ISP2 check-gateway=ping

#промаркируем весь трафик из локальной сети
/ip firewall mangle add src-address=10.1.1.0/24 action=mark-routing chain=prerouting new-routing-mark=mixed

#используем ECMP для балансировки трафика из локальной сети
/ip route add dst-address=0.0.0.0/0 gateway=10.100.1.254,10.200.1.254 routing-mark=mixed

Для 4-х WAN портов, если не считать настройки интерфейсов, у меня получилось следующее:

# скроем за NAT все что выходит из локальной сети
/ip firewall nat add src-address=192.168.79.0/24 action=masquerade chain=srcnat

#Пометим каждое соединение пришедшее снаружи и адресованное нашему роутеру:
/ip firewall mangle add action=mark-connection chain=input in-interface=WAN1 new-connection-mark=cin_ISP1
/ip firewall mangle add action=mark-connection chain=input in-interface=WAN2 new-connection-mark=cin_ISP2
/ip firewall mangle add action=mark-connection chain=input in-interface=WAN2 new-connection-mark=cin_ISP3
/ip firewall mangle add action=mark-connection chain=input in-interface=WAN2 new-connection-mark=cin_ISP4

#что бы отвечать через те же интерфейсы, откуда пришли запросы, поставим соответствующую роутинг-марку на каждое соединение.
/ip firewall mangle add action=mark-routing chain=output connection-mark=cin_ISP1 new-routing-mark=rout_ISP1 passthrough=no
/ip firewall mangle add action=mark-routing chain=output connection-mark=cin_ISP2 new-routing-mark=rout_ISP2 passthrough=no
/ip firewall mangle add action=mark-routing chain=output connection-mark=cin_ISP3 new-routing-mark=rout_ISP2 passthrough=no 
/ip firewall mangle add action=mark-routing chain=output connection-mark=cin_ISP3 new-routing-mark=rout_ISP2 passthrough=no 

#добавим default gateway в каждую из промаркированных таблиц маршрутизации:
/ip route add distance=1 gateway=192.168.1.1 routing-mark=rout_ISP1 check-gateway=ping
/ip route add distance=1 gateway=192.168.2.1 routing-mark=rout_ISP2 check-gateway=ping
/ip route add distance=1 gateway=192.168.103.1 routing-mark=rout_ISP3 check-gateway=ping
/ip route add distance=1 gateway=192.168.4.1 routing-mark=rout_ISP4 check-gateway=ping

#промаркируем весь трафик из локальной сети
/ip firewall mangle add src-address=192.168.79.0/24 action=mark-routing chain=prerouting new-routing-mark=mixed

#используем ECMP для балансировки трафика из локальной сети
/ip route add dst-address=0.0.0.0/0 gateway=192.168.1.1,192.168.2.1,192.168.103.1,192.168.4.1 routing-mark=mixed

С такой конфигурацией вообще ничего не завелось, хотя все сделал как по учебнику. Даже пропинговать ничего не получается ни внешние ни внутренние адреса.

Нашел пример конфигурации для балансировки по принципу ECMP прямо на сайте микротика:

/ ip address
add address=192.168.0.1/24 network=192.168.0.0 broadcast=192.168.0.255 interface=Local 
add address=10.111.0.2/24 network=10.111.0.0 broadcast=10.111.0.255 interface=wlan1
add address=10.112.0.2/24 network=10.112.0.0 broadcast=10.112.0.255 interface=wlan2

/ ip route
add dst-address=0.0.0.0/0 gateway=10.111.0.1,10.112.0.1 check-gateway=ping

/ ip firewall nat 
add chain=srcnat out-interface=wlan1 action=masquerade
add chain=srcnat out-interface=wlan2 action=masquerade

/ ip firewall mangle
add chain=input in-interface=wlan1 action=mark-connection new-connection-mark=wlan1_conn
add chain=input in-interface=wlan2 action=mark-connection new-connection-mark=wlan2_conn 
add chain=output connection-mark=wlan1_conn action=mark-routing new-routing-mark=to_wlan1 
add chain=output connection-mark=wlan2_conn action=mark-routing new-routing-mark=to_wlan2

/ ip route
add dst-address=0.0.0.0/0 gateway=10.111.0.1 routing-mark=to_wlan1 
add dst-address=0.0.0.0/0 gateway=10.112.0.1 routing-mark=to_wlan2

С учетом моих интерфейсов получается следующее:

/ ip address
add address=192.168.0.1/24 network=192.168.79.0 broadcast=192.168.0.255 interface=Local 
add address=192.168.1.221/24 network=192.168.1.0 broadcast=192.168.1.255 interface=WAN1
add address=192.168.2.222/24 network=192.168.2.0 broadcast=192.168.2.255 interface=WAN2
add address=192.168.103.223/24 network=192.168.103.0 broadcast=192.168.103.255 interface=WAN3
add address=192.168.4.224/24 network=192.168.4.0 broadcast=192.168.4.255 interface=WAN4
/ ip route
add dst-address=0.0.0.0/0 gateway=192.168.1.1,192.168.2.1,192.168.103.1,192.168.4.1 check-gateway=ping 

/ ip firewall nat 
add chain=srcnat out-interface=WAN1 action=masquerade
add chain=srcnat out-interface=WAN2 action=masquerade
add chain=srcnat out-interface=WAN3 action=masquerade
add chain=srcnat out-interface=WAN4 action=masquerade

/ ip firewall mangle
add chain=input in-interface=WAN1 action=mark-connection new-connection-mark=wan1_conn
add chain=input in-interface=WAN2 action=mark-connection new-connection-mark=wan2_conn   
add chain=input in-interface=WAN3 action=mark-connection new-connection-mark=wan3_conn 
add chain=input in-interface=WAN4 action=mark-connection new-connection-mark=wan4_conn 
add chain=output connection-mark=wan1_conn action=mark-routing new-routing-mark=to_wan1     
add chain=output connection-mark=wan2_conn action=mark-routing new-routing-mark=to_wan2     
add chain=output connection-mark=wan3_conn action=mark-routing new-routing-mark=to_wan3
add chain=output connection-mark=wan4_conn action=mark-routing new-routing-mark=to_wan4 
/ ip route
add dst-address=0.0.0.0/0 gateway=192.168.1.1 routing-mark=to_wan1 
add dst-address=0.0.0.0/0 gateway=192.168.2.1 routing-mark=to_wan2
add dst-address=0.0.0.0/0 gateway=192.168.103.1 routing-mark=to_wan3
add dst-address=0.0.0.0/0 gateway=192.168.4.1 routing-mark=to_wan4

Всё заработало! Но прироста скорости добиться так и не удалось даже путем «размножения» шлюзов, как рекомендовано на сайте микротика. Сколько я не мерял, максимальная скорость скачивания составила 53Мбит, хотя по идее должна быть под сотку.

Принял решение вернуться на проверенный роутер TP-LINK с функцией балансировки нагрузки. На нем по крайней мере прекрасно суммировалась скорость по моим двум самым «жирным» портам. Остальные два придется использовать в качестве резервных каналов для подключения снаружи или для построения отдельных маршрутов, чтобы получать доступ к определенным сайтам экономя тем самым трафик на основных каналах.

Категории: Оборудование

Комментирование отключено