====== Балансировка с помощью опции PCC в Mangle ====== --- //[[winogradov@list.ru|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= routing-mark=ISP1-route check-gateway=ping add dst-address=0.0.0.0/0 gateway= routing-mark=ISP2-route check-gateway=ping С помощью этих правил мы отправляем промаркированные маршруты либо через шлюз 1-го провайдера, либо через шлюз 2-го провайдера. ===== Создание резервных маршрутов ===== add dst-address=0.0.0.0/0 gateway= check-gateway=ping add dst-address=0.0.0.0/0 gateway= check-gateway=ping distance=2 Резервные маршруты нужны на случай, если какой-то из шлюзов станет недоступным. С помощью этих правил промаркированные маршруты, для которых не окажется правила в именованной таблице маршрутизации, будут отправлены через одно из правил в основной таблице маршрутизации. ===== Создание таблиц маршрутизации ===== В последних версиях RouterOS задать напрямую routing-mark нельзя, необходимо создать именованные таблицы маршрутизации. /routing table add disabled=no fib name=ISP1-route add disabled=no fib name=ISP2-route {{tag>RouterOS MikroTik}}