WAN DHCP с динамическим gateway

Тема в разделе "Вопросы начинающих", создана пользователем Serjik, 21 сен 2015.

  1. Serjik

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

    Добрый день всем.

    Опишу ситуацию:
    - есть два провайдера, которые выдают адреса по DHCP
    - есть внутренняя проводная локальная сеть

    Требуется:
    1. Настроить доступ из локальной сети в интернет
    2. Сделать балансировку для исходящих из локальной сети соединений
    3. Сделать так, чтобы если один из провайдеров "отвалился", все пакеты из локальной сети в интернет уходили через второго

    Появился у меня роутер CRS125-24G-1S-IN и стал я реализовывать идею, описанную выше.
    Обновил Router OS до 6.2x.
    Реализовал первое и второе, а третьим пунктом вышла проблема.

    У меня при балансировке пакеты маркируются (routing mark) для одного провайдера (rout_isp1) и для второго (rout_isp2). Если доступны оба провайдера - всё работает хорошо. А если один "отвалился" (в ip->routes соответствующий gateway становится unreachable - пакеты перестают уходить как надо.

    Маршруты в ip->routes у меня прописаны без указания гейтов, т.е. я указываю только интерфейс:
    ==
    / ip route
    add dst-address=0.0.0.0/0 gateway=wan1 routing-mark=rout_isp1 check-gateway=ping
    add dst-address=0.0.0.0/0 gateway=wan2 routing-mark=rout_isp2 check-gateway=ping
    add dst-address=0.0.0.0/0 gateway=wan1 distance=10 routing-mark=rout_isp2
    add dst-address=0.0.0.0/0 gateway=wan2 distance=10 routing-mark=rout_isp1
    ==

    И вот что я заметил: если я прописываю gateway руками (посмотрев, что выдается по dhcp провайдером), то маршруты начинают работать. А если вместо gateway стоит имя интерфейса, то такой маршрут становится нерабочим. Т.е. по факту он есть и не подсвечен синим, но отправлять он ничего не отправляет.

    Знаю, есть способ сделать маршруты через скрипты (прописать там адрес гейта).
    А есть ли способ сделать без скриптов?

    Скажем, назначение distance в IP->DHCP Client для каждого из провайдеров (для isp1 10, а для isp2 11) и создание правила в Routing->Filters типа dynamic-in и маркировка routing mark в зависимости от distance создает только один маршрут для каждого провайдера. Т.е. для isp1 появляется маршрут с прописанным гейтом и routing mark rout_isp1, а для isp2 - rout_isp2.

    Но это не решает проблему, когда отваливается один из провайдеров, поскольку не пропускаются пакеты с routing mark для другого провайдера. А не пропускаются они маршрутом, в котором вместо gateway указан интерфейс.

    Помогите, пожалуйста. Или скажите, что без скриптов мою задачу решить невозможно.
     
    Последнее редактирование: 21 сен 2015
  2. papuas

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

    так метрику измените у одного из маршрутов.
    все работает без скриптов.
     
  3. Serjik

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

    Поясните как конкретно нужно изменить.

    Ничего не работает, даже если я в ip->route оставляю правила только для одного провайдера, т.е. первое и третье из моего первого поста. Т.е. оставляю только:
    ==
    / ip route
    add dst-address=0.0.0.0/0 gateway=wan1 routing-mark=rout_isp1 check-gateway=ping
    add dst-address=0.0.0.0/0 gateway=wan1 distance=10 routing-mark=rout_isp2
    ==

    Отключаем провод второго провайдера (isp2) и пакеты с routing mark rout_isp2 никуда не выходят.
    А если я меняю на это (где xxx.xxx.xxx.1 - гейт провайдера isp1, который я посмотрел и поставил ручками):
    ==
    / ip route
    add dst-address=0.0.0.0/0 gateway=wan1 routing-mark=rout_isp1 check-gateway=ping
    add dst-address=0.0.0.0/0 gateway=xxx.xxx.xxx.1 distance=10 routing-mark=rout_isp2
    ==

    То всё работает.
     
    Последнее редактирование: 21 сен 2015
  4. papuas

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

    ошибочка наверное c wan1 ?

    distance увеличьте у резервного канала 20
    можно ничего не маркировать.
     
  5. Илья Князев

    Илья Князев Администратор Команда форума

    Возможность есть делать без скриптов, используя VRF.
    Но там приходиться размаркировывать пакеты на входе.
     
  6. Serjik

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

    Ошибки с wan1 нет, потому как при отключении второго провайдера (wan2, isp2) должно всё уходить на первого (на wan1).
    Но из-за балансировки новые соединения маркируются как метками rout_isp1 (и они продолжают ходить), так и метками rout_isp2 (они ходить перестают, если не указать адрес gateway ручками, а не интерфейс подставлять).

    Изменение distance ничего не дает. Уже пробовал.
     
  7. Serjik

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

    А если размаркировывать, то как быть с ситуацией, когда оба провайдера снова становятся доступны?
    У меня входящие соединения через wan1 и wan2 маркируются тоже, чтобы был ответ на тот интерфейс, с которого пришел пакет.
     
  8. Илья Князев

    Илья Князев Администратор Команда форума

    Закину в копилку. Если вы промаркировали маршрут и не создавали отдельных правил в /ip route rule
    то при невозможности найти куда отправить пакет в именованной таблице, роутер будет искать маршрут в основной таблице.
    При пропадании шлюза надо бы вам попробовать зачищать connection tracker
     
  9. Serjik

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

    Спасибо за помощь.

    Еще немного побьюсь и сделаю скрипт по прописыванию gateway в маршрутах вида «ip route add dst-address=0.0.0.0/0 distance=1 gateway=wanx».
    Благо мне это нужно будет только нечасто запускать (по моим оценкам - только при перезапуске роутера).
    Не хотелось использовать скрипты, так как флэш память ограничена в плане частоты перезаписи информации. А когда она полетит - полетит и роутер.

    Вообще, в статьях (http://habrahabr.ru/post/243071/, http://habrahabr.ru/post/231565/#comment_7853459) отмечают, что маршруты "не работают, если указать интерфейс вместо адреса в маршруте (могли бы, в случае PPP соединения)."
    Но кроме скриптов рабочих решений никто не предлагает.
     
  10. Илья Князев

    Илья Князев Администратор Команда форума

    Откройте /ip routes создайте VRF и укажите там один из WAN-интерфейсов. Все маршруты (в т.ч. полученные по DHCP) автоматически получат эту маркировку.
    В данном случае не будет работать правило по поиску неизвестных маршрутов в основной таблице. Поэтому надо в мангле написать правило, что пакеты пришедшие с этого интерфейса имеют route-mark=main.
     
  11. Serjik

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

    Спасибо, попробую. По результатам отпишусь.
     
  12. Serjik

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

    Собственно, описываю ситуацию. Либо я не так понял, либо не так сделал, либо что-то ещё.

    В ip->routes->vrf создал маршрут для одного из интерфейсов (wan1) и повесил на него маркировку rout_isp1. Проверил - она главнее маркировки, которая у меня была в Routing->Filters.
    В этом динамическом маршруте присутствует явно адрес gateway (как и раньше было).
    Однако, создать второй динамический маршрут с проставленным адресом gateway для isp1 не получилось. А статический с указанием только интерфейса НЕ РАБОТАЕТ!

    Если же я снимаю все маркировки (routing mark) с пакетов, то маршруты динамические работают, но балансировка не работает, т.к. пакеты уходят в первый попавшийся маршрут (distance одинаковый у динамических маршрутов поставлен).
    А если я маркирую исходящие пакеты routing mark, то, как я уже говорил:
    - в случае доступности обоих провайдеров всё балансируется (динамические маршруты с разными routing mark работают, т.к. в них появляется адрес gateway)
    - в случае падения одного из провайдеров пакеты с маркировкой для упавшего никуда не уходят (статический маршрут с указанием routing mark для упавшего провайдера и указанием интерфейса НЕ РАБОТАЕТ!)

    Могу прислать конфиг. Даже самый простой, где есть два маршрута для одного провайдера, выдающего по DHCP адрес, но с разными метками (routing mark). И в mangle маркировку цепочки с меткой для маршрута, в котором явно не указан gateway, а указан интерфейс.
    И сможете убедиться, что это не работает.

    Решил проблему скриптом, прописывающим адрес gateway в статическом маршруте.
     
  13. Илья Князев

    Илья Князев Администратор Команда форума

    Там могли и дальше развивать тему. Например маркировать только часть пакетов, дабы они ушли через VRF-интерфейс
    или создать два VRF.
     
  14. Serjik

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

    А можно создать два VRF с различными routing mark для одного физического интерфейса (например, wan1)?
     
  15. Илья Князев

    Илья Князев Администратор Команда форума

    Нет только с одним.
    Чтобы вы понимали VRF это ВЫДЕЛЕННАЯ таблица маршрутизации. Грубо если у вас есть два VRF с подсетью 192.168.0.0/24, то с точки зрения роутера, это разные подсети.
     
  16. Serjik

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

    Илья, я не совсем понимаю в таком случае, как VRF могут мне помочь.
    Мне нужно ведь два рабочих маршрута для одного WAN DHCP интерфейса (на каждый из двух WAN), чтобы работало резервирование канала при падении одного из провайдеров.

    Можете наметить схему, как с помощью VRF решить задачу?

    Давайте даже упростим задачу:
    - пусть есть один WAN DHCP интерфейс (wan1)
    - из локальной сети 192.168.33.0/24 (eth3) интерфейс исходят пакеты с двумя разными routing mark (например, r1 и r2).
    Требуется, чтобы пакеты с обоими марками ходили через wan1.

    P.S. Пока у меня статический маршрут в ip->routes оказывается нерабочим, несмотря на то, что некоторые говорят, что он работает. Во всех примерах Mikrotik у провайдеров статические gateway - это работает.
     
  17. Илья Князев

    Илья Князев Администратор Команда форума

    Делаете два маршрута на один и тот же шлюз с разными марками.
     
  18. Serjik

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

    Правильно ли я понял, что Вы предлагаете сделать так (пусть у меня внешний интерфейс для ISP1 называется wan1):
    ==
    /ip route vrf add disabled=no routing-mark=r1 interfaces=wan1
    /ip route vrf add disabled=no routing-mark=r2 interfaces=wan1
    ==
    ?
     
  19. Илья Князев

    Илья Князев Администратор Команда форума

    Да. С разной дистанцией.
     
  20. Serjik

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

    Хорошо. Я так понимаю, что дистанцию я должен задать исходя из routing-mark?

    С одним интерфейсом понятно. А если два интерфейса?

    ==
    /ip route vrf add disabled=no routing-mark=r1 interfaces=wan1
    /ip route vrf add disabled=no routing-mark=r2 interfaces=wan1
    /ip route vrf add disabled=no routing-mark=r1 interfaces=wan2
    /ip route vrf add disabled=no routing-mark=r2 interfaces=wan2
    ==

    А где прописать дистанции разные ?
    Например для:
    r2,wan1 => 20
    r1,wan1 => 10
    r2,wan2 => 10
    r1,wan2 => 20