У меня возникла небольшая проблема с настройкой рабочей маршрутизации на паре MikroTik. Моя конфигурация состоит из двух роутеров RB750, каждый из которых подключён к отдельному сетевому свитчу через eth2 (порт 3). Свитчи соединены между собой одним портом. Роутеры подключены друг к другу через eth1 (порт 2). Каждый из роутеров имеет подключение к провайдеру через eth0 (порт 1). Интерфейсы eth0 у обоих роутеров имеют подсеть /30 для маршрутизации к провайдеру. На обоих роутерах установлен маршрут по умолчанию через этот интерфейс, а шлюз проверяется пингом. Это конфигурация с «ручным переключением» (manual fail-over). Интерфейсы eth0 на обоих роутерах имеют одинаковый IP-адрес, чтобы можно было просто переключить кабель, если один из роутеров выйдет из строя. Да, я знаю, не спрашивайте. Эта часть работает именно так, как задумано.
Интерфейсы eth1 имеют адреса из сети 10.0.20.0/30. Это сделано так, чтобы независимо от того, что происходит на eth2, роутеры всегда могли между собой общаться. Этот интерфейс тоже настроен как маршрут по умолчанию, но с метрикой 2. Это гарантирует, что если на роутере не подключён кабель к eth0, он всё равно сможет отправлять пакеты во внешний мир через другой роутер. Эта часть работает неправильно из-за того, что происходит на eth2.
На интерфейсах eth2 настроен VRRP. И у самих eth2, и у VRRP интерфейса адреса из сети 10.0.10.0/24. VRRP работает прекрасно, и остальные устройства, подключённые к свитчам, без проблем переключаются на разный шлюз. Проблема возникает, когда свитч, подключённый к роутеру с активным uplink (назовём его router1), выходит из строя. Или когда связь от этого роутера к свитчу пропадает — без разницы. В этом случае VRRP меняет шлюз на роутер без uplink (router2). Пакеты, предназначенные для внешних сетей, отправляются на router2, как и должно быть. Так как у router2 нет uplink, маршрут по умолчанию с метрикой 1 не активен, и router2 использует маршрут с метрикой 2, чтобы переслать пакеты на router1 через сеть 10.0.20.0/30 по eth1. Затем router1 отправляет пакеты дальше наружу. Тут вроде бы всё работает.
Входящий трафик — совсем другая история. Пакеты приходят на router1 по uplink. Адрес сети назначения присутствует на одном из интерфейсов роутера, поэтому выбирается этот подключённый маршрут, даже когда линк сломан. В итоге эти пакеты так и не перенаправляются на router2, чтобы выйти дальше в сеть. При тестировании, если на router1 отключить адрес 10.0.10.x и тем самым убрать подключённый маршрут, всё начинает работать идеально.
Вот в чём загвоздка. Мне нужно как-то заставить роутер не маршрутизировать пакеты, если интерфейс считается неработающим. Я понимаю словосочетание «неработающий» достаточно широко, потому что мне важно, чтобы другие хосты оставались доступны, даже если линк поднят. Думаю, можно использовать netwatch и скрипты, чтобы просто отключать адреса, как я делаю в тестах, но хотелось бы знать, нет ли какого-то более эффективного решения, которое я пропускаю.
Что менять нельзя: один uplink. VRRP — я должен поддерживать клиентов, которые могут работать только с одним шлюзом. Если не существует другого способа переносить IP-адрес шлюза, то остаётся только VRRP.
Буду благодарен за любые советы. Спасибо!
Интерфейсы eth1 имеют адреса из сети 10.0.20.0/30. Это сделано так, чтобы независимо от того, что происходит на eth2, роутеры всегда могли между собой общаться. Этот интерфейс тоже настроен как маршрут по умолчанию, но с метрикой 2. Это гарантирует, что если на роутере не подключён кабель к eth0, он всё равно сможет отправлять пакеты во внешний мир через другой роутер. Эта часть работает неправильно из-за того, что происходит на eth2.
На интерфейсах eth2 настроен VRRP. И у самих eth2, и у VRRP интерфейса адреса из сети 10.0.10.0/24. VRRP работает прекрасно, и остальные устройства, подключённые к свитчам, без проблем переключаются на разный шлюз. Проблема возникает, когда свитч, подключённый к роутеру с активным uplink (назовём его router1), выходит из строя. Или когда связь от этого роутера к свитчу пропадает — без разницы. В этом случае VRRP меняет шлюз на роутер без uplink (router2). Пакеты, предназначенные для внешних сетей, отправляются на router2, как и должно быть. Так как у router2 нет uplink, маршрут по умолчанию с метрикой 1 не активен, и router2 использует маршрут с метрикой 2, чтобы переслать пакеты на router1 через сеть 10.0.20.0/30 по eth1. Затем router1 отправляет пакеты дальше наружу. Тут вроде бы всё работает.
Входящий трафик — совсем другая история. Пакеты приходят на router1 по uplink. Адрес сети назначения присутствует на одном из интерфейсов роутера, поэтому выбирается этот подключённый маршрут, даже когда линк сломан. В итоге эти пакеты так и не перенаправляются на router2, чтобы выйти дальше в сеть. При тестировании, если на router1 отключить адрес 10.0.10.x и тем самым убрать подключённый маршрут, всё начинает работать идеально.
Вот в чём загвоздка. Мне нужно как-то заставить роутер не маршрутизировать пакеты, если интерфейс считается неработающим. Я понимаю словосочетание «неработающий» достаточно широко, потому что мне важно, чтобы другие хосты оставались доступны, даже если линк поднят. Думаю, можно использовать netwatch и скрипты, чтобы просто отключать адреса, как я делаю в тестах, но хотелось бы знать, нет ли какого-то более эффективного решения, которое я пропускаю.
Что менять нельзя: один uplink. VRRP — я должен поддерживать клиентов, которые могут работать только с одним шлюзом. Если не существует другого способа переносить IP-адрес шлюза, то остаётся только VRRP.
Буду благодарен за любые советы. Спасибо!
