Несколько машрутов к одному источнику.

По умолчанию во FreeBSD можно использовать только 1 маршрут к одному и тому же источнику (в отличии от linux и Solaris этот функционал существует уже давно) Но Qing Li добавил , а Kip Macy дополнил такую поддержку и теперь можно не только задавать множество маршрутов к одному источнику, но и задавать «вес», делать балансировку на уровне соединений.

Данная функциональность работает, начиная с версии 8.0

Что бы добавить такую возможность, нужно пересобрать ядро с опцией

options RADIX_MPATH

На данный момент существует баг (http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/173477) с невозможностью удаления некоторых маршрутов. Будьте внимательно.

После этого можно полноценно использовать множественные маршруты. Вот примеры использования:

— добавим несколько маршрутов:

#route add -net 192.103.54.0/24 10.10.10.44
add net 192.103.54.0: gateway 10.10.10.44
#route add -net 192.103.54.0/24 10.10.10.66
add net 192.103.54.0: gateway 10.10.10.66

— удаление только определённого машрута:

#route del 192.103.54.0/24 10.10.10.66
del net 192.103.54.0: gateway 10.10.10.66

— смотрим информацию о конкретном маршруте:

# route show 192.103.54.0/24 10.10.10.1
   route to: 192.103.54.0
destination: 192.103.54.0
       mask: 255.255.255.0
    gateway: 10.10.10.1
  interface: em0
      flags: <UP,GATEWAY,DONE,STATIC>
 recvpipe  sendpipe  ssthresh  rtt,msec    mtu        weight    expire
       0         0         0         0      1500        1         0

— меняем «вес» маршрута (чем меньше число, тем больше приоритет данного маршрута)

#route change -weight 10 192.103.54.0/24 10.10.10.1
#route show 192.103.54.0/24 10.10.10.1
   route to: 192.103.54.0
destination: 192.103.54.0
       mask: 255.255.255.0
    gateway: 10.10.10.1
  interface: em0
      flags: <UP,GATEWAY,DONE,STATIC>
 recvpipe  sendpipe  ssthresh  rtt,msec    mtu        weight    expire
       0         0         0         0      1500        10         0

— добавляем балансировку (задаём шлюзы 10.10.10.1 и 10.10.10.88 для балансировки соединений, при этом можно регулировать балансировку с помощью параметра weight, значения которого будут обратно пропорциональными к распределению трафика):

freebsd9# route change -sticky 192.103.54.0/24 10.10.10.1
change net 192.103.54.0: gateway 10.10.10.1
freebsd9# route change -sticky 192.103.54.0/24 10.10.10.88
change net 192.103.54.0: gateway 10.10.10.88
freebsd9# route show 192.103.54.0/24 10.10.10.1
   route to: 192.103.54.0
destination: 192.103.54.0
       mask: 255.255.255.0
    gateway: 10.10.10.1
  interface: em0
      flags: <UP,GATEWAY,DONE,STATIC,STICKY>
 recvpipe  sendpipe  ssthresh  rtt,msec    mtu        weight    expire
       0         0         0         0      1500        10         0
freebsd9# route show 192.103.54.0/24 10.10.10.88
   route to: 192.103.54.0
destination: 192.103.54.0
       mask: 255.255.255.0
    gateway: 10.10.10.88
  interface: em0
      flags: <UP,GATEWAY,DONE,STATIC,STICKY>
 recvpipe  sendpipe  ssthresh  rtt,msec    mtu        weight    expire
       0         0         0         0      1500         1         0

в данном примере трафик поделиться в соотношении 1:10. Убрать балансировку можно с помощью параметра nostick

FIB

Пару слов хочется сказать о FIB — множественные таблицы маршрутизации. Это возможность позволяет для разных приложений использовать свои таблицы маршрутизации. Например. Для почты используется один маршрут, для VPN — совсем другой.

Для включения этой возможности нужно пересобрать ядро с опцией

options ROUTETABLES=N

где N число таблиц маршрутизации. Максимальное значение N=15 (начиная с 10-ой версии доступно 65536 таблиц маршрутизации) Итого, максимально получаем 16 возможных (нулевая — это обычная таблица).

Для работы с разными таблицами используется команда setfib. Данный функционал доступен, начиная с версии 7.0

Что бы иметь возможность указывать fib для конкретного демона, например, так:

apache22_enable="YES"
apache22_fib="1"

используем патч отсюда

Несколько машрутов к одному источнику.: 9 комментариев

  1. DNK

    Как хорошо что есть люди, которым проще изобрести велосипед чем освоить протоколы RIP EIGRP OSPF BGP — хотя б один из них…

    1. skeletor Автор записи

      Как хорошо, что есть люди, которые думают, что АБСОЛЮТНО ВСЕ провайдеры могут предоставить хотя бы один из них.
      Да, и если разобрать предложенные вами протоколы, то имеем следующее:
      — OSPF — вообще не подходит
      — RIP — устаревший и мало кто использует
      — EIGRP — не на любом оборудовании можно завести, особенно не на железных роутерах (например, *nix)
      — BGP — для него нужно иметь AS+PI и для небольшой организации получить это очень проблематично, учитывая, что IPv4 уже не раздают, а IPv6 сейчас мало где реально поддерживается, особенно у нас.
      Так, что вы не правы.

  2. andrian

    Якщо у вас більше одного каналу і на одному із них, наприклад BGP чи OSPF, і т.д. недоступне, тоді саме ця стаття й допоможе задіяти усі канали, отже «skeletor» — правий на усі 100%.
    А «DNK» забув, що динамічна маршрутизація без neighbor працювати не буде!

  3. Vic

    Бред какой-то, честное слово.
    Сначала вы добавляете
    #route add -net 192.103.54.0/24 10.10.10.44
    а потом ниже
    # route change -sticky 192.103.54.0/24 10.10.10.1

    Ну и откуда 10.10.10.44 взялось? Зачем добавлять, а потом изменять со stiсky?
    Следуя вашей инструкции, никакого эффекта нет, трафик так и дальше идет через шлюз из последней команды.
    Да, ядро пересобрано, толку 0. Баланса нет.
    И опять же, вы пишите о EQUAL COST, а сами тыкаете weight 10:1 и в чем суть статьи? Мне нужно что бы трафик рандомно распределялся через оба шлюза, то есть выставить одинаковый weight, но как я уже сказал, никакого эффекта нет.

    1. skeletor Автор записи

      Бред — это ваш комментарий. В статье рассмотрены возможности мультироутинга с примерами, а не то, как вам распределять трафик между вашими серверами. Не вырывайте фразы из контекста и не делайте из них последовательность действий, а лучше прочтите ещё раз, если не поняли с первого раза суть статьи.

      1. Vic

        Я все прекрасно понял:
        1) FreeBSD оказывается полным УГ, где по сравнению с Linux уже сто лет как можно достичь ECMP одной командой «add default scope global nexthop via x.x.x.x dev eth0 weight 1 nexthop via y.y.y.y dev eth2 weight 1»

        1. skeletor Автор записи

          Да, ECMP здесь ни при чём. Имелся ввиду мультироутинг. Статью поправил.

Добавить комментарий для Песец Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *