Корректная настройка ECMP с несколькими локальными сетями

Тема в разделе "Маршрутизация", создана пользователем HeyHo~, 14 июл 2021.

  1. HeyHo~

    HeyHo~ Новый участник

    Добрый день. Прошу помочь с настройкой ECMP при нескольких локальных сетях.

    Для начала имеем простой случай:
    1. Два провайдера
    2. Одна локальная сеть
    1.jpg

    В таком случае настройка ECMP достаточно проста (конфигурация из официальной Вики):
    Код:
     / ip address
    add address=192.168.0.1/24 network=192.168.0.0 broadcast=192.168.0.255 interface=LAN
    add address=10.111.0.2/24 network=10.111.0.0 broadcast=10.111.0.255 interface=ISP1
    add address=10.112.0.2/24 network=10.112.0.0 broadcast=10.112.0.255 interface=ISP2
     
    / ip firewall mangle
    add chain=prerouting dst-address=10.111.0.0/24  action=accept in-interface=LAN
    add chain=prerouting dst-address=10.112.0.0/24  action=accept in-interface=LAN
    add chain=prerouting in-interface=ISP1 connection-mark=no-mark action=mark-connection \
         new-connection-mark=ISP1_conn
    add chain=prerouting in-interface=ISP2 connection-mark=no-mark action=mark-connection \
         new-connection-mark=ISP2_conn
    add chain=prerouting  in-interface=LAN connection-mark=no-mark dst-address-type=!local \
         per-connection-classifier=both-addresses:2/0 action=mark-connection new-connection-mark=ISP1_conn
    add chain=prerouting  in-interface=LAN connection-mark=no-mark dst-address-type=!local \
         per-connection-classifier=both-addresses:2/1 action=mark-connection new-connection-mark=ISP2_conn
    add chain=prerouting connection-mark=ISP1_conn in-interface=LAN action=mark-routing \
         new-routing-mark=to_ISP1
    add chain=prerouting connection-mark=ISP2_conn in-interface=LAN action=mark-routing \
         new-routing-mark=to_ISP2
    add chain=output connection-mark=ISP1_conn action=mark-routing new-routing-mark=to_ISP1    
    add chain=output connection-mark=ISP2_conn action=mark-routing new-routing-mark=to_ISP2
     
    / ip route
    add dst-address=0.0.0.0/0 gateway=10.111.0.1 routing-mark=to_ISP1 check-gateway=ping
    add dst-address=0.0.0.0/0 gateway=10.112.0.1 routing-mark=to_ISP2 check-gateway=ping
    add dst-address=0.0.0.0/0 gateway=10.111.0.1 distance=1 check-gateway=ping
    add dst-address=0.0.0.0/0 gateway=10.112.0.1 distance=2 check-gateway=ping
     
    / ip firewall nat
    add chain=srcnat out-interface=ISP1 action=masquerade
    add chain=srcnat out-interface=ISP2 action=masquerade

    У меня же более сложная конфигурация:
    1. Офис и филиал
    2. В обоих местах по два провайдера
    3. Два EOIP тонеля
    4. Самое главное - несколько подсетей в каждом подразделении
    2.jpg

    Если применить настройку из простого случая к R1, то все тоже работает, кроме маршрутизации между подсетями.

    То есть, если с компьютера из 192.168.2.0 сети отправить запрос на сервер в 192.168.1.0 сети, то насколько я понимаю, на правилах:

    Код:
    add chain=prerouting  in-interface=LAN connection-mark=no-mark dst-address-type=!local \
         per-connection-classifier=both-addresses:2/0 action=mark-connection new-connection-mark=ISP1_conn
    add chain=prerouting  in-interface=LAN connection-mark=no-mark dst-address-type=!local \
         per-connection-classifier=both-addresses:2/1 action=mark-connection new-connection-mark=ISP2_conn
    он успешно маркируется и отправляется не в 192.168.1.0, а дальше провайдеру. Хотя, казалось бы, из-за опции "dst-address-type=!local" такого не должно происходить. Или должно?

    В любом случае, как корректно настроить mangle, чтобы пакеты успешно ходили между локальными сетями?
    Я нашел только один вариант, это совсем исключить из маркировки входящий из локальных сетей траффик правилом:

    Код:
    chain=prerouting action=mark-connection new-connection-mark=no-mark passthrough=no dst-address=192.168.1.0/24 log=no log-prefix=""
    chain=prerouting action=mark-connection new-connection-mark=no-mark passthrough=no dst-address=192.168.2.0/24 log=no log-prefix=""
    Это работает, если сетей по 3 с каждой стороны, но это проблема если сетей по 20, придется каждую прописывать в исключения.

    Возможно ли как то решить проблему изящнее?

    Спасибо заранее!
     

    Вложения:

    • 1.jpg
      1.jpg
      Размер файла:
      31,9 КБ
      Просмотров:
      1
  2. HeyHo~

    HeyHo~ Новый участник

    Все оказалось донельзя просто, нужно было всего лишь добавить все локальные сети в исключения перед основными правилами маркировки по аналогии с первым правилом:
    add chain=prerouting dst-address=10.111.0.0/24 action=accept in-interface=LAN