Привет! Я сделал балансировку нагрузки на 10 wan (dsl) с помощью PCC, но столкнулся с большой проблемой. У нас в стране иногда одновременно происходит прерывание работы нескольких adsl-линий, иногда у меня 4 или 5 wan падают одновременно. Это серьёзная проблема, потому что RouterOS отправляет весь трафик с этих 5 упавших wan на шлюз по умолчанию, перегружая этот канал. Я написал скрипт, который сначала считает количество активных маршрутов, а потом пересоздаёт правила mangle, меняя параметр PCC и вставляя новые правила. Возможно, есть более простой способ решить эту проблему (жду мнений), но сейчас так я это вижу. Я мало знаю о скриптинге, возможно, есть более лучший и простой вариант, буду ждать советов.
:global activeroutesold;
:local activeroutes 0;
:local route;
:local tes;
:local divs 0;
:local less;
:local routingmarks;
:local arrayrouting;
:local routemark;
:log info "НАЧАЛО***********************************************************"
:foreach route in=[/ip route find where comment~"^[a-z]*balanceo" active=yes] do={
:set tes [ /ip route get $route routing-mark ];
:set activeroutes ($activeroutes + 1)
:set routingmarks ($routingmarks, $tes);
}
:log info $activeroutes;
:log info $activeroutesold;
:if ($activeroutes != $activeroutesold) do={
/ip firewall
mangle {
:foreach a in=[find where comment~"^[a-z]*balance" ] do={
remove $a }
}
:set arrayrouting [:toarray $routingmarks]
:set divs $activeroutes;
:set less $activeroutes;
:for i from=0 to=($activeroutes-1) do={
:set routemark [:pick $routingmarks $i]
:set divs ($activeroutes - $less);
:set less ($less - 1);
:log info "$routemark";
:log info "$activeroutes/$divs"
/ip firewall mangle
:log info "Устанавливаю фильтры";
add action=mark-connection chain=prerouting comment="balance conn $routemark" \
disabled=no dst-address-type=!local in-interface=local \
new-connection-mark="$routemark" passthrough=yes per-connection-classifier=\
"both-addresses:$activeroutes/$divs" place-before=3
add action=mark-routing chain=prerouting comment="balance route $routemark" \
connection-mark="$routemark" disabled=no in-interface=local new-routing-mark=\
"$routemark" passthrough=no place-before=3
}
} else={:log info "маршруты не изменились"};
:log info ("$activeroute активных маршрутов");
:set activeroutesold $activeroutes;
:log info "КОНЕЦ********************************************************************"
:global activeroutesold;
:local activeroutes 0;
:local route;
:local tes;
:local divs 0;
:local less;
:local routingmarks;
:local arrayrouting;
:local routemark;
:log info "НАЧАЛО***********************************************************"
:foreach route in=[/ip route find where comment~"^[a-z]*balanceo" active=yes] do={
:set tes [ /ip route get $route routing-mark ];
:set activeroutes ($activeroutes + 1)
:set routingmarks ($routingmarks, $tes);
}
:log info $activeroutes;
:log info $activeroutesold;
:if ($activeroutes != $activeroutesold) do={
/ip firewall
mangle {
:foreach a in=[find where comment~"^[a-z]*balance" ] do={
remove $a }
}
:set arrayrouting [:toarray $routingmarks]
:set divs $activeroutes;
:set less $activeroutes;
:for i from=0 to=($activeroutes-1) do={
:set routemark [:pick $routingmarks $i]
:set divs ($activeroutes - $less);
:set less ($less - 1);
:log info "$routemark";
:log info "$activeroutes/$divs"
/ip firewall mangle
:log info "Устанавливаю фильтры";
add action=mark-connection chain=prerouting comment="balance conn $routemark" \
disabled=no dst-address-type=!local in-interface=local \
new-connection-mark="$routemark" passthrough=yes per-connection-classifier=\
"both-addresses:$activeroutes/$divs" place-before=3
add action=mark-routing chain=prerouting comment="balance route $routemark" \
connection-mark="$routemark" disabled=no in-interface=local new-routing-mark=\
"$routemark" passthrough=no place-before=3
}
} else={:log info "маршруты не изменились"};
:log info ("$activeroute активных маршрутов");
:set activeroutesold $activeroutes;
:log info "КОНЕЦ********************************************************************"
