Ноя
11

FreeBSD, несколько FIB’ов и динамическая маршрутизация




  • История Олимпийских Игр

  • Мои твиты


  • Какое-то время назад возникла необходимость отдать клиенту несколько VRF'ов, используя FreeBSD и quagga.
    В качестве showstopper'ов выступали:
    * так и не закоммиченный kern/134931
    * большое нежелание держать на рутере пачку джейлов, в каждом из которых будет крутиться только quagga.
    * MAXFIBS=16

    В силу того, что нынешний routing socket protocol ничего не знает про fib'ы (в отличие от квагги, в которой вроде бы есть  VRF'ы) вариантов было несколько:
    * поломать ABI, добавить fib в routing messages, пропатчить кваггу на работу с этим новым ABI
    * ABI не ломать, а пропатчить кваггу на предмет открытия столько routing socket'ов, сколько у неее есть VRF'ов
    * просто починить routing socket и запускать пачку квагг, каждую в своем fib'е

    Варианты 1 и 2 плохи тем, что надо разбираться в том, как работает квагга, что при более чем полном отсутствии документации на код и комментариев в самом коде - более чем неблагодарное занятие, а в варианте 2 - еще и беспеспективное в плане включения кода в апстим.

    В результате решено было пойти по пути наименьшего сопротивления и просто починить routing socket. Очень кстати обнаружился патч из PR выше. Патч при коннекте (к routing socket'у) запоминает текущий fib сокета и позволяет работать (и получать события) только для соответствующего fib. По крайней мере, в случае unicast.

    Путем применения небольшого напильника из коллекции патч накатился на 7.2-pчего-то там и вполне себе начал работать, судя по route monitor

    Касательно максимального количества таблиц маршрутизации быстро ничего не сделать - в mbuf'е на них выделено 4 бита. В -current ведется обсуждение по поводу поднятия этого числа до хоть сколько-нибудь разумного, но работать хочется уже сейчас.

    Оставался вопрос с джейлами (или чрутами). Если запускать несколько квагг без них, то они будут драться за:
    1) TCP-порт к зебре (2600/zebrasrv)
    2) unix-socket с zserv.api
    3) unix socket'ы для vtysh
    4) пути к pid-файлам
    5)TCP-порты (bgpd)
    6) мультикаст (ospf)

    Насколько я понял, zserv.api - deprecated, поэтому он сразу отпал. OSPF'а мне было не надо, поэтому с ним я ничего не делал.
    Пути к pid-файлам и порт для bgpd настраиваются из коробки, итого остались: пути к unix-сокетам и зебра.

    В этом месте квагга была пропатчена, чтобы все стало хорошо. Сразу говорюсь, патч писался для решения локальных задач и никакого смысла толкать его в апстрим нет, т.к. это все надо делать по-другому (vrf'ы и понимающий их routing socket). Поэтому смысла "причесывать" и делать красиво смысла не было.

    Итого, патч для версии 0.99.16, можно сразу положить в порт.

    Далее, для использования нужен какой-нибудь rc.-скрипт, который позволит эти кваги удобно запускать и добавлять новые при необходимости.

    Скрипт написался, как пользоваться: придумываем какой-нибудь символьный идентификатор для соотв. квагги, например client1
    делаем симлинк на /usr/local/etc/rc.d/quagga_client1.
    Далее настраиваем rc.conf примерно так:
    quagga_client1_enable="YES"
    quagga_client1_fib=1
    quagga_client1_zport=3600
    quagga_client1_daemons="zebra bgpd"
    quagga_client1_bgpd_flags="-d -p 1179"

    Последний штрих - для корректной работы bgpd имеет смысл сделать что-то вроде ipfw fwd a.b.c.d,174 ip4 from ... to me dst-port 179 [recv ...], иначе основная квага будет удивляться и ругаться незнакомым пирам, стучащимся на порт 179.

    Упоминавшиеся файлы:
    Патч к ядру (7.2-p3) тут
    Патч к квагге (0.99.16) тут
    rc-скрипт тут




























  • История Олимпийских Игр

  • Мои твиты



  • Социальные сети

    Рубрики

    Последние записи