Запуск Quagga BGPD без экспорта маршрутов в таблицы ядра

Quagga — популярный сервис для организации динамической маршрутизации. Обычно, он используется по своему прямому назначению на узлах, которые участвуют в маршрутизации и должны устанавливать принимаемые маршруты в ядро сети. Сегодня мы рассмотрим недокументированные возможности, которые достаточно плохо гуглятся, но требуются для реализации специальных кейсов: BGP Route Reflector и сервер реализации BGP Blackhole.

Данные кейсы примечательны тем, что сам сервер, на котором установлен BGPD никак не занимается маршрутизацией, поэтому установка маршрутов в таблицу ядра малополезна, а зачастую вредна. Недавно мы настраивали сервер для реализации BGP Blackhole и столкнулись с необходимостью настройки BGPD для предотвращения экспорта маршрутов в таблицы ядра. Для того, чтобы BGPD не экспортировал маршруты из BGP в ядро, можно использовать два способа, которые не описаны в man-страницах сервиса.

Первый способ основывается на использовании специального параметра «-n» или «—no_kernel», который не описан в документации. В Ubuntu 16.04 и старше указать этот параметр можно в соотвествующем элементе systemd:

# cat /lib/systemd/system/bgpd.service

[Unit]
Description=BGP routing daemon
BindTo=zebra.service
After=network.target zebra.service
ConditionPathExists=/etc/quagga/bgpd.conf
Documentation=man:bgpd

[Service]
Type=forking
ExecStartPre=-/bin/chmod -f 640 /etc/quagga/bgpd.conf
ExecStartPre=-/bin/chown -f quagga:quagga /etc/quagga/bgpd.conf
ExecStart=/usr/sbin/bgpd -n -d -A 127.0.0.1 -f /etc/quagga/bgpd.conf
Restart=on-abort

[Install]
WantedBy=network.target

Обратите внимание на строку ExecStart. Здесь и добавлен данный параметр. После внесения данного изменения выполните команды для перезапуска сервиса BGPD:

# systemctl daemon-reload
# service bgpd restart

Теперь при поступлении маршрутной информации через BGPD эти маршруты в ядро устанавливаться не будут. Данный способ может не подойти, если вы хотите иметь избирательную установку, в зависимости от VRF или локальной ASN. В этом случае вам подойдет способ, основанный на изменении параметра «distance bgp» в секции «router bgp»:

router bgp 11111
  distance bgp 255 255 255

Указание данных значений (255) препятствует установке маршрутов в ядро.

Таким образом, с помощью этих несложных настроек можно решить задачи, в которых требуется обмен маршрутной информацией без установки ее в ядро маршрутизатора под управлением ОС Linux.