Многостраничная маршрутизация OpenBSD в случае проблем

Я пытаюсь управлять настройкой "отработки отказа" для частной сети под управлением NAT с двумя не очень стабильными соединениями WAN (LTE/3g).

Топология довольно типична: хосты из внутренней сети подключаются к внутреннему интерфейсу [int_if] блока OpenBSD, затем трафик передается через NAT с PF на один из двух внешних интерфейсов [ext_if1 и ext_if2].

LAN---->[int_if]--NAT--[ext_if1 or ext_if2]---->WAN1 or WAN2 (depending on kernel decision).

Я использую статические IP-адреса на обоих выходных интерфейсах, каждый в отдельной подсети и с маршрутами по умолчанию для нескольких путей к блокам маршрутизатора LTE / 3g интернет-провайдера, как описано в Faq OpenBSD для балансировки нагрузки с одинаковой стоимостью.

К сожалению, я страдаю от этого раздражающего поведения:

  1. Многолучевые маршруты не работают, если они установлены в файле hostname.interface. В этом случае оба маршрута по умолчанию присутствуют в таблице маршрутизации, но без флагов "P". Пока я не сбрасываю маршруты и не устанавливаю их снова вручную, весь трафик передается только через один из двух шлюзов, выбранный, как я полагаю, в зависимости от алфавитного порядка имени интерфейса. Выглядит так, как если бы он был просто "стандартным" шлюзом по умолчанию, многолучевая передача не включена (net.inet.ip.multipath конечно установлен на 1).

  2. Хотя многолучевые маршруты по умолчанию, установленные "вручную", похоже, работают хорошо - в таблице маршрутизации появляется флаг "P", а neststat -r показывает растущий трафик на обоих маршрутах, а также последовательность команд traceroute, а затем возникает еще один беспорядок.

  3. ping -I one_of_ext_if's_ip some.internet.host работает, я бы сказал... случайно, не в зависимости от фактического состояния соединения с провайдером. Иногда использование ip-адреса вместо cname помогает на одном интерфейсе, в то время как другой "предпочитает" cname. Пинги случайным образом аннулируются, в то время как трафик http из локальной сети сбалансирован по нагрузке без задержек. Я не блокирую исходящий трафик с помощью PF, так что это не главное, отключение pf вообще ничего не меняет (кроме отключения локальной сети от мира). Если все вернуть обратно к стандартному, единственная настройка шлюза по умолчанию устраняет проблему - я могу вручную переключаться между обоими маршрутами по умолчанию, и пингс подойдет, если интернет-провайдер жив.

Я потратил две ночи на поиск и тестирование, чтобы выяснить, что я делаю неправильно, и до сих пор не понимаю, почему этот конфиг работает так странно. И, конечно же, понятия не имею, как я могу отслеживать соединения для переключения при сбое с помощью ifstated, когда ping-мир не работает, даже если мои провайдеры еще живы. И когда они действительно умерли на какое-то время, балансировка нагрузки отправила запросы локальной сети, чтобы лишить возможности обнаружить необнаруженное мертвое соединение.

Я хотел бы обнаружить такое событие и изменить маршрут к одному шлюзу по умолчанию на рабочем соединении, пока другой провайдер не начнет отвечать снова. Без рабочих пингов я застрял с бесполезной вставкой в ​​фоновом режиме.

Я ценю любую помощь...

1 ответ

This is now covered in the OpenBSD FAQ in the Equal-cost Multipath Routing section . The trick is to add the route commands in on each hostname.if file.

From the example, substitute whatever your NICs actually are and their correct gateways for fxp1 and fxp2:

Since the mygate(5) file does not yet support multipath default routes, the above commands should be added to the bottom of the hostname.if(5) files for the fxp1 а также fxp2 интерфейсы. /etc/mygate file should then be deleted.

$ tail -1 /etc/hostname.fxp1  
!route add -mpath default 10.130.128.1  
$ tail -1 /etc/hostname.fxp2  
!route add -mpath default 10.132.0.1  
Другие вопросы по тегам