null

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

Еще в FreeBSD 7.1 были добавлены множественные таблицы маршрутизации (FIB - Forwarding Information Base), которые можно использовать, например, для того, чтобы на узле, имеющем основной и резервный каналы в интернет, запустить некий сервис, который по умолчанию будет использовать резервный канал.

Для этого при загрузке ядра нужно указать необходимое количество таблиц маршрутизации, дописав в /boot/loader.conf:

net.fibs="4"

В /etc/rc.conf для соответствующих таблиц добавить их маршрутизаторы по умолчанию:

static_routes="secondary"
route_secondary="default A.B.C.D -fib 1"

И указать там же необходимую таблицу маршрутизации требуемому сервису:

servicename_fib="1"

И всё это замечательно работает до тех пор, пока нашему сервису не становятся нужны маршруты, получаемые от OpenVPN. Дублирование настроек OpenVPN (в том числе настроек удалённого сервера, от которого тоже могут получаться дополнительные маршруты) в локальных конфигурационных файлах по объяснимым причинам является плохой идеей. Что же делать?

К счастью, OpenVPN сделан довольно топорно и для добавления маршрутов запускает /sbin/route, и путь к этому файлу может быть переопределён на этапе компиляции. Поэтому, дабы не портить системный /sbin/route, потребуется пересобрать порт security/openvpn, предварительно добавив в /etc/make.conf:

.if ${.CURDIR} == "/usr/ports/security/openvpn"
CONFIGURE_ARGS+=ROUTE=/sbin/route2fibs
.endif

И написать небольшой костыль скрипт /sbin/route2fibs, которые будет добавлять маршруты во все необходимые таблицы:

#!/bin/sh
for fib in 0 1
do
  /sbin/route "$@" -fib $fib
done

И контрольная перезагрузка, чтобы убедиться, что у нас всё получилось.

PS. В некоторых how-to почему-то пишут о необходимости перекомпиляции ядра для изменения количества таблиц маршрутизации, тогда как это очень просто делается через /boot/loader.conf приведённым выше способом.

Коротко о себе:

Работаю в компании Tune-IT и тьютором кафедры Вычислительной техники в СПбГУИТМО.

Очень люблю команду cat, core solaris и IPv6.