Содержание
Балансировка с помощью опции PCC в Mangle
— lonebuddha 2024/03/02 18:00
Алгоритм
- Исключение для трафика из LAN в сеть провайдера.
- Маркировка соединений, инициированных извне.
- Балансировка и маркировка соединений, исходящих из LAN.
- Маркировка маршрутов на основании соединений.
- Создание именованных маршрутов.
- Создание резервных маршрутов.
Исключение для трафика из LAN в сеть провайдера
Может возникнуть ситуация, при которой из LAN надо связаться с каким-либо хостом в сети провайдера. Если не сделать исключения, то трафик будет направлен не на нужный хост, а на шлюз провайдера:
/ ip firewall mangle add chain=prerouting dst-address=<сеть ISP1> action=accept in-interface=ether-LAN add chain=prerouting dst-address=<сеть ISP2> action=accept in-interface=ether-LAN
Маркировка соединений, инициированных извне
Без приведенных ниже правил может сложиться ситуация, когда запрос пришел на один внешний интерфейс, а ответ на этот запрос уйдет с другого интерфейса. Такая ситуация чревата проблемами.
Соединения, пришедшие на 1-й WAN-интерфейс, маркируются как ISP1, а соединения, пришедшие на 2-й WAN-интерфейс, маркируются как ISP2. По сути, мы «запоминаем», что откуда пришло, чтобы в дальнейшем мы могли отправить ответ по принципу «откуда пришло, оттуда и ушло»:
add chain=prerouting in-interface=ether-ISP1 connection-mark=no-mark action=mark-connection newconnection-mark=ISP1 add chain=prerouting in-interface=ether-ISP2 connection-mark=no-mark action=mark-connection newconnection-mark=ISP2
Балансировка и маркировка соединений, исходящих из LAN
С помощью этих правил мы в случайном порядке делаем балансировку между двумя внешними интернет-каналами в пропорции 50 на 50:
add chain=prerouting in-interface=ether-LAN connection-mark=no-mark dst-address-type=!local perconnection-classifier=both-addresses:2/0 action=mark-connection new-connection-mark=ISP1 add chain=prerouting in-interface=ether-LAN connection-mark=no-mark dst-address-type=!local perconnection-classifier=both-addresses:2/1 action=mark-connection new-connection-mark=ISP2
Маркировка маршрутов на основании соединений
add chain=output connection-mark=ISP1 action=mark-routing new-routing-mark=ISP1-route add chain=output connection-mark=ISP2 action=mark-routing new-routing-mark=ISP2-route add chain=prerouting connection-mark=ISP1 in-interface=ether-LAN action=mark-routing new-routingmark=ISP1-route add chain=prerouting connection-mark=ISP2 in-interface=ether-LAN action=mark-routing new-routingmark=ISP2-route
С помощью этих правил мы маркируем маршруты на основании соединений, которые мы уже промаркировали ранее.
Создание именованных маршрутов
/ ip route add dst-address=0.0.0.0/0 gateway=<gateway ISP1> routing-mark=ISP1-route check-gateway=ping add dst-address=0.0.0.0/0 gateway=<gateway ISP2> routing-mark=ISP2-route check-gateway=ping
С помощью этих правил мы отправляем промаркированные маршруты либо через шлюз 1-го провайдера, либо через шлюз 2-го провайдера.
Создание резервных маршрутов
add dst-address=0.0.0.0/0 gateway=<gateway ISP1> check-gateway=ping add dst-address=0.0.0.0/0 gateway=<gateway ISP1> check-gateway=ping distance=2
Резервные маршруты нужны на случай, если какой-то из шлюзов станет недоступным. С помощью этих правил промаркированные маршруты, для которых не окажется правила в именованной таблице маршрутизации, будут отправлены через одно из правил в основной таблице маршрутизации.
Создание таблиц маршрутизации
В последних версиях RouterOS задать напрямую routing-mark нельзя, необходимо создать именованные таблицы маршрутизации.
/routing table add disabled=no fib name=ISP1-route add disabled=no fib name=ISP2-route
