メモのページ - チラシの裏メモ 3枚目

通信技術や気になった事を黙々とメモし続ける

DebianにFRRを実装しVyOSごっこをやってみた

過去3回に渡りVyOSにてIPsec VPNでセキュアなBGPセッション及びOSPFセッションを試みた。更に遡ればSONiCやCumulus VXでBGPセッションを試みた。
これらの検証でVirtualBoxのゲストOSとして動いていた仮想アプライアンスのNetwork OS(NOS)は、全てDebian GNU/Linuxベースである。
ではDebian GNU/LinuxにQuaggaやFRRを実装すれば、VyOSやSONiCみたいな事が出来るのではないか...という事で、今回は素で動作するDebian GNU/LinuxにFRRをインストールし、VyOSみたいな事をやらせてみた。
VyOSごっこの初回という事で、今回はFRRのインストールとOSPFによるネイバ確立の確認までのメモ。
Debian GNU/Linuxのデプロイとインストール、FRRの実装、vtyshの動作確認とトラブルシューティング、対向先との確認...といった感じの流れになっている。


FRRとは
FRRouting(Free Range Routing)の事。LinuxなどUNIX系OS向けのインターネットルーティングプロトコルスイート(Internet Routing Protocol Suite)であり、Quaggaからフォークされた。オープンソースとして公開されている。
FRRはBGP、EIGRP、OSPF、RIP、IS-IS等のL3ルーティングプロトコルやPIM、LDP、BFD、Babel、PBR、OpenFabric、VRRP等の機能を実装し、Linux等UNIX系OSのIPネットワーキングスタックと統合されている。よって、Linuxや他のUNIX系OSをベースとしたNetwork OS(NOS)を搭載したルータやスイッチといった通信機器にてルーティングや冗長化プロトコル等を動作させる事が可能となる。
FRRで動作可能なルーティングプロトコル及び機能は、下記リンク先(Feature Matrix)を参照。
http://docs.frrouting.org/en/latest/overview.html#feature-matrix


当方の環境
ホストOS:macOS 10.13.6 / MacBook Air 2011 / RAM: 4GB / CPU: Intel Core i7 1.8GHz
Oracle VirtualBox:6.1.32
ゲストOS:Debian GNU/Linux 9.13.0 (Stretch)
ゲストOS:VyOS 1.4 rolling-202104111334

Debian GNU/Linuxは、FRRの公式サイト内でサポート対象となっているバージョン9(9.13.0)を使用。バージョン9のisoファイルは下記リンク先にて入手可能。
https://cdimage.debian.org/mirror/cdimage/archive/9.13.0/amd64/iso-cd/
debian-9.13.0-amd64-netinst.iso

DebianではなくUbuntuの場合、aptコマンドでFRRのインストールが可能である。
しかし、著者が目指しているのはDebianベースのNOSでVyOSごっこをする事である為、敢えてDebianを選んだ。


Debianのデプロイとインストール
FRRを実装するDebian GNU/Linuxはゲスト機としてVirtualBoxにデプロイした。
当記事ではVirtualBoxの設定の詳細に関しては割愛する。RAMは1024MB、ネットワークアダプタはWAN側LAN側共にIntel PRO/1000 MT Serverを選択している。
DebianのインストーラーはGraphical InstallではなくInstallから実施。
Software Selectionの画面では、SH ServerとStandard system utilitiesのみ選択。

インストールの完了後、sshログインの為にip address showコマンドを打ちIPアドレスを確認。
ホスト機や外部と通信する為のネットワークアダプタはDebianのインタフェースenp0s17に紐付けされ、IPアドレスはDHCPで192.168.3.26がアサインされた。
今回限りではなくこの先もルータとして使用するのであれば、IPアドレスはDHCPによる自動取得ではなく静的に固定する方が望ましい。
apt updateとapt upgradeの実行と、sudoとgitのインストールはsshログインの前に済ませた。
尚、作成したユーザhogeがsudoを実行出来るよう、gpasswdコマンドでsudoのグループにアサインしている。

root@jpmtkvmrt99:~# ip addr s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 08:00:27:f8:98:49 brd ff:ff:ff:ff:ff:ff
3: enp0s9: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 08:00:27:38:ab:76 brd ff:ff:ff:ff:ff:ff
4: enp0s17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:e5:cf:b1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.26/24 brd 192.168.3.255 scope global enp0s17
       valid_lft forever preferred_lft forever
    inet6 2400:2410:d441:a900:a00:27ff:fee5:cfb1/64 scope global mngtmpaddr dynamic
       valid_lft 86338sec preferred_lft 14338sec
    inet6 fe80::a00:27ff:fee5:cfb1/64 scope link
       valid_lft forever preferred_lft forever
root@jpmtkvmrt99:~#
root@jpmtkvmrt99:~# apt install sudo git
:
root@jpmtkvmrt99:~# gpasswd -a hoge sudo
Adding user hoge to group sudo
root@jpmtkvmrt99:~#



FRRの実装
VirtualBoxのウインドウ内ではコマンドや出力内容のコピーや貼り付けが容易でない事や、見切れた出力内容を見る事が出来ない為、Terminalツール(自分の環境ではiTerm-2)を使用。
Terminalツールを立ち上げ、sshでDebianに一般ユーザでログインする。

jpmtkmcbk01:~ mac$ ssh hoge@192.168.3.26
hoge@192.168.3.26's password:
Linux jpmtkvmrt99 4.9.0-17-amd64 #1 SMP Debian 4.9.290-1 (2021-12-12) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Feb 12 19:47:46 2022 from 192.168.3.3
hoge@jpmtkvmrt99:~$


FRRのビルドの為のツールをインストール
sudo apt installコマンドでインストールしたいパッケージを指定。パッケージの依存関係の為に指定したパッケージ以外の沢山のパッケージがインストールされるが我慢。

hoge@jpmtkvmrt99:~$ sudo apt install autoconf automake libtool make \
  libreadline-dev texinfo libjson-c-dev pkg-config bison flex \
  libc-ares-dev python3-dev python3-pytest python3-sphinx build-essential \
  libsnmp-dev libcap-dev libelf-dev libunwind-dev
:
Setting up libxml-sax-expat-perl (0.40-2) ...
update-perl-sax-parsers: Registering Perl SAX parser XML::SAX::Expat with priority 50...
update-perl-sax-parsers: Updating overall Perl SAX parser modules info file...
Replacing config file /etc/perl/XML/SAX/ParserDetails.ini with new version
Processing triggers for libc-bin (2.24-11+deb9u4) ...
hoge@jpmtkvmrt99:~$


FRR用にユーザとグループの作成
frrとfrrvtyグループ、frrユーザをGID指定で作成。frrユーザのホームディレクトリをここで指定する。

hoge@jpmtkvmrt99:~$ sudo addgroup --system --gid 92 frr
Adding group `frr' (GID 92) ...
Done.
hoge@jpmtkvmrt99:~$ sudo addgroup --system --gid 85 frrvty
Adding group `frrvty' (GID 85) ...
Done.
hoge@jpmtkvmrt99:~$ sudo adduser --system --ingroup frr --home /var/opt/frr/ --gecos "FRR suite" --shell /bin/false frr
Adding system user `frr' (UID 109) ...
Adding new user `frr' (UID 109) with group `frr' ...
Creating home directory `/var/opt/frr/' ...
hoge@jpmtkvmrt99:~$
hoge@jpmtkvmrt99:~$ sudo usermod -a -G frrvty frr
hoge@jpmtkvmrt99:~$


libyangの導入
YANGとは、NETCONFやRESTCONF等のネットワーク管理用プロトコルで対象の通信機器にアクセスし、設定やステータスや通知等をモデル化するために開発されたデータモデル言語であり、libyangはAPIを提供する為のYANGのツールキットである。
FRRをビルドする為にlibyangバージョン2.0.0以降が必要となっている為、libyangをインストールする必要が有る。
libyangのビルドの際cmakeとlibpcre2-devが必要である為、前もってaptコマンドでcmakeとlibpcre2-devをインストールする。

hoge@jpmtkvmrt99:~$ sudo apt install cmake libpcre2-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  cmake-data libarchive13 libcurl3 libjsoncpp1 libpcre2-16-0 libpcre2-32-0 libpcre2-8-0 libpcre2-posix0 libuv1
Suggested packages:
  codeblocks eclipse ninja-build lrzip
:
:
hoge@jpmtkvmrt99:~$


cmakeとlibpcre2-devのインストールを終えたら、git cloneコマンドを打ちlibyangのクローンを生成する。

hoge@jpmtkvmrt99:~$ git clone https://github.com/CESNET/libyang.git
Cloning into 'libyang'...
remote: Enumerating objects: 59403, done.
remote: Counting objects: 100% (7339/7339), done.
remote: Compressing objects: 100% (2385/2385), done.
remote: Total 59403 (delta 5470), reused 6434 (delta 4898), pack-reused 52064
Receiving objects: 100% (59403/59403), 42.05 MiB | 4.29 MiB/s, done.
Resolving deltas: 100% (44671/44671), done.
hoge@jpmtkvmrt99:~$


生成されたlibyangディレクトリに移動し、git checkoutコマンドを打ちリモートのブランチをチェックアウト。

hoge@jpmtkvmrt99:~$ cd libyang
hoge@jpmtkvmrt99:~/libyang$ git checkout v2.0.0
Note: checking out 'v2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at b45499b8... readme DOC updated
hoge@jpmtkvmrt99:~/libyang$


buildディレクトリを作成し移動。
buildディレクトリ内でcmakeを実行。libyangのインストール先を/usr配下に指定。/usrオプションの後にピリオドを2つ入力してからEnterキーを叩く。
ピリオドが無いとcmakeが開始されない。

hoge@jpmtkvmrt99:~/libyang$ mkdir build; cd build
hoge@jpmtkvmrt99:~/libyang/build$
hoge@jpmtkvmrt99:~/libyang/build$ cmake -D CMAKE_INSTALL_PREFIX=/usr ..
-- The C compiler identification is GNU 6.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
:
-- Build files have been written to: /home/hoge/libyang/build
hoge@jpmtkvmrt99:~/libyang/build$


cmakeが完了したら、makeコマンドを打ちコンパイルおよびビルドの開始。
完了したらmake installコマンドを打ち、libyangのインストールを開始する。

hoge@jpmtkvmrt99:~/libyang/build$ make
Scanning dependencies of target yangobj
[  1%] Building C object CMakeFiles/yangobj.dir/src/common.c.o
[  2%] Building C object CMakeFiles/yangobj.dir/src/log.c.o
[  3%] Building C object CMakeFiles/yangobj.dir/src/hash_table.c.o
[  4%] Building C object CMakeFiles/yangobj.dir/src/set.c.o
:
Scanning dependencies of target yangre
[ 97%] Building C object tools/re/CMakeFiles/yangre.dir/main.c.o
[ 98%] Building C object tools/re/CMakeFiles/yangre.dir/__/__/compat/compat.c.o
[100%] Linking C executable ../../yangre
[100%] Built target yangre
hoge@jpmtkvmrt99:~/libyang/build$
hoge@jpmtkvmrt99:~/libyang/build$ sudo make install
[sudo] password for hoge:
[ 76%] Built target yangobj
[ 77%] Built target yang
[ 96%] Built target yanglint
[100%] Built target yangre
Install the project...
-- Install configuration: "Debug"
-- Installing: /usr/lib/x86_64-linux-gnu/libyang.so.2.0.0
:
-- Set runtime path of "/usr/bin/yanglint" to ""
-- Installing: /usr/share/man/man1/yanglint.1
-- Installing: /usr/bin/yangre
-- Set runtime path of "/usr/bin/yangre" to ""
hoge@jpmtkvmrt99:~/libyang/build$
hoge@jpmtkvmrt99:~/libyang/build$ cd
hoge@jpmtkvmrt99:~$


FRRの導入
ここでようやくFRRのインストールに取り掛かる。
libyangのインストールを終えたら、引き続きgit cloneコマンドを打ちfrrのクローンを生成する。

hoge@jpmtkvmrt99:~$ git clone https://github.com/frrouting/frr.git frr
Cloning into 'frr'...
remote: Enumerating objects: 181442, done.
remote: Counting objects: 100% (503/503), done.
remote: Compressing objects: 100% (264/264), done.
remote: Total 181442 (delta 292), reused 390 (delta 239), pack-reused 180939
Receiving objects: 100% (181442/181442), 111.83 MiB | 4.45 MiB/s, done.
Resolving deltas: 100% (143384/143384), done.
hoge@jpmtkvmrt99:~$


生成されたfrrディレクトリに移動し、bootstrap.shスクリプトを実行。

hoge@jpmtkvmrt99:~$ cd frr
hoge@jpmtkvmrt99:~/frr$ ./bootstrap.sh
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, 'm4/ac'.
libtoolize: linking file 'm4/ac/ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.
libtoolize: linking file 'm4/libtool.m4'
libtoolize: linking file 'm4/ltoptions.m4'
libtoolize: linking file 'm4/ltsugar.m4'
libtoolize: linking file 'm4/ltversion.m4'
libtoolize: linking file 'm4/lt~obsolete.m4'
configure.ac:176: installing 'm4/ac/compile'
configure.ac:26: installing 'm4/ac/config.guess'
configure.ac:26: installing 'm4/ac/config.sub'
configure.ac:108: installing 'm4/ac/install-sh'
configure.ac:108: installing 'm4/ac/missing'
Makefile.am: installing 'm4/ac/depcomp'
configure.ac: installing 'm4/ac/ylwrap'
parallel-tests: installing 'm4/ac/test-driver'
hoge@jpmtkvmrt99:~/frr$


続いてconfigureスクリプトを実行し、FRRをビルドする為の環境を確認して環境に合わせて設定したMakefileを生成。
configureだけでも動作するが、以下のようにライブラリや実行ファイルやモジュール等のファイルの保存場所をオプションとして指定する事が出来る。
指定可能なオプションは./configure -h で確認する事が出来る。
そしてconfigureスクリプトの実行が終わると、以下のFRRouting configurationの欄内のようにビルド環境が出力される。

hoge@jpmtkvmrt99:~/frr$ ./configure \
    --prefix=/usr \
    --includedir=\${prefix}/include \
    --bindir=\${prefix}/local/bin \
    --sbindir=\${prefix}/lib/frr \
    --libdir=\${prefix}/lib/frr \
    --libexecdir=\${prefix}/lib/frr \
    --localstatedir=/var/opt/frr \
    --sysconfdir=/etc/frr \
    --with-moduledir=/usr/lib/frr/modules \
    --enable-multipath=64 \
    --enable-user=frr \
    --enable-group=frr \
    --enable-vty-group=frrvty \
    --enable-configfile-mask=0640 \
    --enable-logfile-mask=0640 \
    --enable-fpm \
    --with-pkg-git-version \
    --with-pkg-extra-version=-20220212
:
:
FRRouting configuration
------------------------------
FRR version             : 8.3-dev-20220212
host operating system   : linux-gnu
source code location    : .
compiler                : gcc -std=gnu11
compiler flags          :  -g -O2   -fno-omit-frame-pointer -funwind-tables -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wpointer-arith -Wbad-function-cast -Wwrite-strings -Wundef -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -pthread
make                    : make
linker flags            :     -ljson-c -lrt -lcap -lreadline -lm
state file directory    : /var/opt/frr
config file directory   : /etc/frr
module directory        : /usr/lib/frr/modules
script directory        : /etc/frr/scripts
user to run as          : frr
group to run as         : frr
group for vty sockets   : frrvty
config file mask        : 0640
log file mask           : 0640
zebra protobuf enabled  : no
vici socket path        : /var/run/charon.vici

The above user and group must have read/write access to the state file
directory and to the config files in the config file directory.
hoge@jpmtkvmrt99:~/frr$


makeコマンドを打ち、configureスクリプトの実行結果を基にコンパイル及びビルドを開始。
ここで躓く事が無ければ、この後のインストールもほぼ問題無く完了する。

hoge@jpmtkvmrt99:~/frr$ make
git suffix: -gd10b16499
git branches: local:master, github/frrouting/frr.git/master
Files lib/gitversion.h.tmp and lib/gitversion.h are identical
/usr/bin/perl ./lib/route_types.pl --enabled babeld --enabled bfdd --enabled bgpd --enabled bgpd-vnc --enabled eigrpd --enabled isisd --enabled fabricd --enabled ldpd --enabled nhrpd --enabled ospfd --enabled ospf6d --enabled pbrd --enabled pimd --enabled ripd --enabled ripngd  --enabled zebra < ./lib/route_types.txt > lib/route_types.h
/usr/bin/perl ./vtysh/daemons.pl zebra bgpd ripd ripngd ospfd ospf6d isisd fabricd nhrpd ldpd babeld eigrpd  pimd pbrd staticd bfdd vrrpd pathd > vtysh/vtysh_daemons.h
make  all-am
make[1]: Entering directory '/home/hoge/frr'
  CC       bgpd/bgp_addpath.o
  CC       bgpd/bgp_advertise.o
:
:
  XRELFO   zebra/zebra_cumulus_mlag.la.xref
  XRELFO   zebra/dplane_fpm_nl.la.xref
  XRELFO   bgpd/bgpd_bmp.la.xref
  XRELFO   pathd/pathd_pcep.la.xref
  XRELFO   frr.xref
make[1]: Leaving directory '/home/hoge/frr'
hoge@jpmtkvmrt99:~/frr$


makeコマンドによるコンパイル及びビルドが完了して、ようやくインストールとなる。
make installコマンドを打ち、FRRをインストール。

hoge@jpmtkvmrt99:~/frr$ sudo make install
git suffix: -gd10b16499
git branches: local:master, github/frrouting/frr.git/master
Files lib/gitversion.h.tmp and lib/gitversion.h are identical
make  install-am
make[1]: Entering directory '/home/hoge/frr'
:
:
fdd.8 doc/manpages/_build/man/frr-vrrpd.8 '/usr/share/man/man8'
make[2]: Leaving directory '/home/hoge/frr'
make[1]: Leaving directory '/home/hoge/frr'
hoge@jpmtkvmrt99:~/frr$

エラーを吐く事無く、インストールが完了。

FRRの設定ファイルは自動で生成されないようで、以下のように空っぽの設定ファイルをプロトコルや機能毎に生成する。
参照したFRRのサイト内にはEIGRPの設定ファイルの生成の記載は無かったが、今後Cisco CSR1000VとEIGRPのネイバ関係を確立してみたい為、EIGRPの設定ファイルも生成した。

hoge@jpmtkvmrt99:~/frr$ sudo install -m 755 -o frr -g frr -d /var/log/frr
hoge@jpmtkvmrt99:~/frr$ sudo install -m 755 -o frr -g frr -d /var/opt/frr
hoge@jpmtkvmrt99:~/frr$ sudo install -m 775 -o frr -g frrvty -d /etc/frr
hoge@jpmtkvmrt99:~/frr$ sudo install -m 640 -o frr -g frr /dev/null /etc/frr/zebra.conf
hoge@jpmtkvmrt99:~/frr$ sudo install -m 640 -o frr -g frr /dev/null /etc/frr/bgpd.conf
hoge@jpmtkvmrt99:~/frr$ sudo install -m 640 -o frr -g frr /dev/null /etc/frr/ospfd.conf
hoge@jpmtkvmrt99:~/frr$ sudo install -m 640 -o frr -g frr /dev/null /etc/frr/ospf6d.conf
hoge@jpmtkvmrt99:~/frr$ sudo install -m 640 -o frr -g frr /dev/null /etc/frr/isisd.conf
hoge@jpmtkvmrt99:~/frr$ sudo install -m 640 -o frr -g frr /dev/null /etc/frr/ripd.conf
hoge@jpmtkvmrt99:~/frr$ sudo install -m 640 -o frr -g frr /dev/null /etc/frr/ripngd.conf
hoge@jpmtkvmrt99:~/frr$ sudo install -m 640 -o frr -g frr /dev/null /etc/frr/pimd.conf
hoge@jpmtkvmrt99:~/frr$ sudo install -m 640 -o frr -g frr /dev/null /etc/frr/ldpd.conf
hoge@jpmtkvmrt99:~/frr$ sudo install -m 640 -o frr -g frr /dev/null /etc/frr/nhrpd.conf
hoge@jpmtkvmrt99:~/frr$ sudo install -m 640 -o frr -g frrvty /dev/null /etc/frr/vtysh.conf
hoge@jpmtkvmrt99:~/frr$
hoge@jpmtkvmrt99:~/frr$ sudo install -m 640 -o frr -g frr /dev/null /etc/frr/eigrpd.conf
hoge@jpmtkvmrt99:~/frr$
hoge@jpmtkvmrt99:~/frr$ cd
hoge@jpmtkvmrt99:~$


最後に、/etc/sysctl.confファイルを開きIPv4およびIPv6のパケット転送を有効にする内容に修正する。
net.ipv4.ip_forward=1とnet.ipv6.conf.all.forwarding=1の行頭に付いているコメントアウトを削除し、内容を保存し/etc/sysctl.confファイルを閉じる。
/etc/sysctl.confファイルの内容をシステムに反映させる為sysctl -pコマンドを打つ。

hoge@jpmtkvmrt99:~$ sudo vi /etc/sysctl.conf
:
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
#  Enabling this option disables Stateless Address Autoconfiguration
#  based on Router Advertisements for this host
net.ipv6.conf.all.forwarding=1
:
hoge@jpmtkvmrt99:~$ sudo sysctl -p


vtyshの動作確認とトラブルシューティング
では、早速vtyshモードに移行しOSPFの設定に入る。
...と言いたいところだが、suコマンドを打ってrootユーザに切り替えvtyshモードへの移行を試みるがvtyshモードに移行出来ず、frr.serviceを起動させる事が出来ない旨のログを吐く。
frr.serviceファイルが有る場所を確認したところ、/lib/systemd/systemディレクトリ内ではなく、FRRをビルドした際のカレントディレクトリの下(/home/hoge/frr/tools/)に有る事が分かる。
ついでにsystemctl status frrコマンドでfrr.serviceのステータスを確認したところ、frr.serviceなんか無いよと怒られる。

hoge@jpmtkvmrt99:~$ su
Password:
root@jpmtkvmrt99:/home/hoge# vtysh
Exiting: failed to connect to any daemons.
root@jpmtkvmrt99:/home/hoge# exit
hoge@jpmtkvmrt99:~$ 
hoge@jpmtkvmrt99:~$ sudo find / -name frr.service
/home/hoge/frr/tools/frr.service
hoge@jpmtkvmrt99:~$
hoge@jpmtkvmrt99:~$ sudo systemctl status frr
Unit frr.service could not be found.
hoge@jpmtkvmrt99:~$


そう言えば、スクリプト./configureを走らせる際、frr.serviceファイルの保存先指定してなかったな...と保存先指定の確認をしたところ、frr.serviceファイルの保存先は指定出来ないようである。

hoge@jpmtkvmrt99:~$ cd frr; ./configure -h
:
Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/frr]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]
:
Program names:


ドキュメント内(https://docs.frrouting.org/en/latest/setup.html)を確認したところ、ソースファイルからFRRをインストールした際は手動でファイルを置く必要が有る旨の記載を見つける。
Systemd
Although not installed when installing from source, FRR provides a service file for use with systemd. It is located in tools/frr.service in the Git repository. If systemctl status frr.service indicates that the FRR service is not found, copy the service file from the Git repository into your preferred location.

よって、今回は/lib/systemd/systemディレクトリ内にシンボリックリンクを張って様子見。
そして再度frr.serviceのステータスを確認したところ、今度はfrr.serviceのステータスを確認する事が出来た。

hoge@jpmtkvmrt99:~$ sudo ln -s /home/hoge/frr/tools/frr.service /lib/systemd/system/frr.service
hoge@jpmtkvmrt99:~$
hoge@jpmtkvmrt99:~$ sudo systemctl status frr
● frr.service - FRRouting
   Loaded: loaded (/home/hoge/frr/tools/frr.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: https://frrouting.readthedocs.io/en/latest/setup.html
hoge@jpmtkvmrt99:~$


systemctl start frrコマンドを打ち、その後にsystemctl status frrコマンドで再度frr.serviceのステータスを確認。
Active:がfailedのままである。
frrinit.sh[776]: cannot run start: /etc/frr/daemons does not exist ... failed!のログを見つける。/etc/frr/daemonsファイルが無いという。

hoge@jpmtkvmrt99:~$ sudo systemctl start frr
hoge@jpmtkvmrt99:~$
hoge@jpmtkvmrt99:~$ sudo systemctl status frr
● frr.service - FRRouting
   Loaded: loaded (/home/hoge/frr/tools/frr.service; disabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sat 2022-02-12 22:12:32 JST; 32s ago
     Docs: https://frrouting.readthedocs.io/en/latest/setup.html
  Process: 776 ExecStart=/usr/lib/frr/frrinit.sh start (code=exited, status=1/FAILURE)

Feb 12 22:12:32 jpmtkvmrt99 systemd[1]: Starting FRRouting...
Feb 12 22:12:32 jpmtkvmrt99 frrinit.sh[776]: cannot run start: /etc/frr/daemons does not exist ... failed!
Feb 12 22:12:32 jpmtkvmrt99 systemd[1]: frr.service: Control process exited, code=exited status=1
Feb 12 22:12:32 jpmtkvmrt99 systemd[1]: Failed to start FRRouting.
Feb 12 22:12:32 jpmtkvmrt99 systemd[1]: frr.service: Unit entered failed state.
Feb 12 22:12:32 jpmtkvmrt99 systemd[1]: frr.service: Triggering OnFailure= dependencies.
Feb 12 22:12:32 jpmtkvmrt99 systemd[1]: frr.service: Failed to enqueue OnFailure= job: No such file or directory
Feb 12 22:12:32 jpmtkvmrt99 systemd[1]: frr.service: Failed with result 'exit-code'.
hoge@jpmtkvmrt99:~$


daemonsファイルを探したところ、frr.serviceファイルと同じく/home/hoge/frr/tools/ディレクトリ内に有る事が分かる。
$HOME/frr/tools/ディレクトリ配下のファイルは適宜ここから持って行って使ってね...という事か。
frr.serviceファイルと同様にシンボリックリンクを張り、再度systemctl start frrコマンドで確認。
今度はActive: active (running)となりfrr.serviceが立ち上がった事が分かる。

hoge@jpmtkvmrt99:~$ sudo find -name daemons
./frr/tools/etc/frr/daemons
hoge@jpmtkvmrt99:~$
hoge@jpmtkvmrt99:~$ sudo ln -s /home/hoge/frr/tools/etc/frr/daemons /etc/frr/daemons
hoge@jpmtkvmrt99:~$
hoge@jpmtkvmrt99:~$ sudo systemctl start frr
hoge@jpmtkvmrt99:~$ sudo systemctl status frr
● frr.service - FRRouting
   Loaded: loaded (/home/hoge/frr/tools/frr.service; disabled; vendor preset: enabled)
   Active: active (running) since Sat 2022-02-12 22:14:59 JST; 6s ago
     Docs: https://frrouting.readthedocs.io/en/latest/setup.html
  Process: 796 ExecStart=/usr/lib/frr/frrinit.sh start (code=exited, status=0/SUCCESS)
 Main PID: 809 (watchfrr)
   Status: "FRR Operational"
    Tasks: 7 (limit: 4915)
   CGroup: /system.slice/frr.service
           ├─809 /usr/lib/frr/watchfrr -d -F traditional zebra staticd
           ├─822 /usr/lib/frr/zebra -d -F traditional -A 127.0.0.1 -s 90000000
           └─827 /usr/lib/frr/staticd -d -F traditional -A 127.0.0.1

Feb 12 22:14:59 jpmtkvmrt99 watchfrr[809]: [T83RR-8SM5G] watchfrr 8.3-dev-20220212-gd10b16499 starting: vty@0
Feb 12 22:14:59 jpmtkvmrt99 watchfrr[809]: [ZCJ3S-SPH5S] zebra state -> down : initial connection attempt failed
Feb 12 22:14:59 jpmtkvmrt99 watchfrr[809]: [ZCJ3S-SPH5S] staticd state -> down : initial connection attempt failed
Feb 12 22:14:59 jpmtkvmrt99 watchfrr[809]: [YFT0P-5Q5YX] Forked background command [pid 810]: /usr/lib/frr/watchfrr.sh restart all
Feb 12 22:14:59 jpmtkvmrt99 watchfrr.sh[818]: Cannot stop staticd: pid file not found
Feb 12 22:14:59 jpmtkvmrt99 watchfrr[809]: [QDG3Y-BY5TN] zebra state -> up : connect succeeded
Feb 12 22:14:59 jpmtkvmrt99 watchfrr[809]: [QDG3Y-BY5TN] staticd state -> up : connect succeeded
Feb 12 22:14:59 jpmtkvmrt99 watchfrr[809]: [KWE5Q-QNGFC] all daemons up, doing startup-complete notify
Feb 12 22:14:59 jpmtkvmrt99 frrinit.sh[796]: Started watchfrr.
Feb 12 22:14:59 jpmtkvmrt99 systemd[1]: Started FRRouting.


そしてついにvtyshモードに移行出来るようになった。

hoge@jpmtkvmrt99:~$
hoge@jpmtkvmrt99:~$ sudo vtysh

Hello, this is FRRouting (version 8.3-dev-20220212-gd10b16499).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

This is a git build of frr-8.3-dev-65-gd10b16499
Associated branch(es):
	local:master
	github/frrouting/frr.git/master

jpmtkvmrt99#


一旦vtyshモードから離れ、/etc/frr/daemonsファイルを編集。
今回はOSPFを使用し対向先のルータとの間でOSPFのネイバ関係を確立させたい為、ospfd_instances=1,2 を追加する。
ospfd=noをospfd=yesに修正する事でOSPFを喋る事が可能になる筈だが、自分の環境ではospfd_instances=1,2を追加しないとOSPFの設定が出来なかった。

jpmtkvmrt99# exit
hoge@jpmtkvmrt99:~$ sudo vi /etc/frr/daemons
bgpd=no
ospfd=no
ospfd_instances=1,2 この行を追加
ospf6d=no
ripd=no
ripngd=no
isisd=no
pimd=no
ldpd=no
nhrpd=no
eigrpd=no
babeld=no
sharpd=no
pbrd=no
bfdd=no
fabricd=no
vrrpd=no
pathd=no

hoge@jpmtkvmrt99:~$ sudo reboot

これまでの設定内容をシステムに反映させる為、rebootコマンドを打ちDebianを再起動させた。

再起動完了後、再度jpmtkvmrt99にsshログイン開始。
そしてvtyshコマンドを打ち、vtyshモードに移行。
WAN側インタフェースenp0s17にIPアドレスとOSPFの設定投入。
上記にて実施したインタフェースenp0s17やループバックインタフェースloへのIPアドレスの設定は済んでいるものの、vtyshモードに入って改めてshow running-configコマンドを打つと、インタフェース周りの設定が無い事が分かる。その辺に関してはSONiCも同じで、vtyshモードで投入するインタフェース周りの設定はFRRが参照するものであって/etc/network/interfacesファイルには反映されない。逆も然り。
よって、vtyshモードでは/etc/network/interfacesに記載されているIPアドレスと同じアドレス、インタフェース名はip address showコマンドで出力されるものをvtyshモードで設定した。
加えてOSPFも設定。今回はOSPFのネイバ関係の確立を確認したいだけである為、OSPFの設定は最小限に留めた。

hoge@jpmtkvmrt99:~$ 
hoge@jpmtkvmrt99:~$ sudo vtysh
jpmtkvmrt99#
jpmtkvmrt99# conf t
jpmtkvmrt99(config)# interface enp0s17
jpmtkvmrt99(config-if)# ip address 192.168.3.25/24
jpmtkvmrt99(config-if)# ip ospf area 0.0.0.0
jpmtkvmrt99(config-if)# exit
jpmtkvmrt99(config)# interface enp0s8
jpmtkvmrt99(config-if)# ip address 192.168.99.1/24
jpmtkvmrt99(config-if)# exit
jpmtkvmrt99(config)# interface lo0
jpmtkvmrt99(config-if)# ip address 10.1.1.99/32
jpmtkvmrt99(config-if)# exit
jpmtkvmrt99(config)#
jpmtkvmrt99(config)# router ospf 1
jpmtkvmrt99(config-router)# ospf router-id 10.1.1.99
For this router-id change to take effect, use "clear ip ospf process" command
jpmtkvmrt99(config-router)# redistribute connected
jpmtkvmrt99(config-router)# exit
jpmtkvmrt99(config)# exit
jpmtkvmrt99#


vtyshモードでの設定内容を保存。
設定内容の保存の為のコマンドは、Ciscoのルータやスイッチと同じである。
copy running-config startup-configコマンドとwrite memoryコマンド共に、設定内容の保存先は同じである。

jpmtkvmrt99# copy running-config startup-config
Note: this version of vtysh never writes vtysh.conf
Building Configuration...
Configuration saved to /etc/frr/zebra.conf
Configuration saved to /etc/frr/ospfd-1.conf
Configuration saved to /etc/frr/ospfd-2.conf
Configuration saved to /etc/frr/staticd.conf
jpmtkvmrt99#
jpmtkvmrt99# write memory
Note: this version of vtysh never writes vtysh.conf
Building Configuration...
Configuration saved to /etc/frr/zebra.conf
Configuration saved to /etc/frr/ospfd-1.conf
Configuration saved to /etc/frr/ospfd-2.conf
Configuration saved to /etc/frr/staticd.conf
jpmtkvmrt99#



接続確認
Debian側でOSPFの簡単な設定を投入し終えた後、VyOSを立ち上げ以下の構成を組んで、DebianとVyOSとの間でOSPFのネイバ関係を確立させてみた。
※図をクリックすると拡大表示します


まずはDebian側で確認。show ip ospf neighborというどこかで聞いたようなコマンドを叩く。
OSPFのステータスはFull、対向先のVyOSのIPアドレスも見えている事から、OSPFのネイバ関係は正常に確立出来た事が分かる。

jpmtkvmrt99# show ip ospf neighbor

OSPF Instance: 1

Neighbor ID     Pri State           Up Time         Dead Time Address         Interface                        RXmtL RqstL DBsmL
10.1.1.98         1 Full/DR         21m26s            39.376s 192.168.3.98    enp0s17:192.168.3.26                 0     0     0

% OSPF instance not found
jpmtkvmrt99#


show ip routeコマンドを叩き、FRRにて掴んでいる経路情報を確認。
対向先のLAN側ネットワーク192.168.99.0/24が学習出来ている事と、WAN側ネットワーク192.168.3.0/24をOSPFでも学習出来ている事を確認。

jpmtkvmrt99# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

K>* 0.0.0.0/0 [0/0] via 192.168.3.1, enp0s17, 00:21:31
K>* 169.254.0.0/16 [0/1000] is directly connected, enp0s17, 00:21:31
O[1]   192.168.3.0/24 [110/100] is directly connected, enp0s17, weight 1, 00:21:26
C>* 192.168.3.0/24 is directly connected, enp0s17, 00:21:06
C>* 192.168.99.0/24 is directly connected, enp0s8, 00:21:04
jpmtkvmrt99#


対向先のVyOS側でも、OSPFのネイバ関係を確認。
OSPFのステータスはFull、対向先のDebian側のIPアドレスも見えている事から、OSPFのネイバ関係は正常に確立出来た事が分かる。

vyos@jpmtkvmrt98:~$ show ip ospf neighbor

Neighbor ID     Pri State           Dead Time Address         Interface                        RXmtL RqstL DBsmL
10.1.1.99         1 Full/Backup       35.058s 192.168.3.26    eth0:192.168.3.98                    0     0     0

vyos@jpmtkvmrt98:~$


show ip routeコマンドを打ち、対向先のLAN側ネットワーク192.168.98.0/24が学習出来ている事と、WAN側ネットワーク192.168.3.0/24をOSPFでも学習出来ている事を確認。

vyos@jpmtkvmrt98:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

C>* 10.1.1.98/32 is directly connected, lo, 00:37:01
O   192.168.3.0/24 [110/1] is directly connected, eth0, weight 1, 00:37:01
C>* 192.168.3.0/24 is directly connected, eth0, 00:37:08
C>* 192.168.98.0/24 is directly connected, eth1, 00:37:01
vyos@jpmtkvmrt98:~$



今回はここまで。
Debian GNU/LinuxにFRRをソースからビルドしてインストールし、OSPFを設定し対向先との間でOSPFネイバの関係を確立させる事が出来た。
VyOSみたいな事が出来たが、今は通信機器としては余計なサービスやパッケージがインストールされたままである為、今後はVyOSと比較しながら余計なサービスやパッケージを削除しソフトウェアルータに特化した仮想アプライアンスに仕上げたい...という事で、systemctl list-unit-files --type=serviceコマンドを打ってサービス一覧をVyOSと比較した。
結果、予想に反しVyOSの方が100個程多かった事に驚いた。CentOSみたいに余計なサービスが沢山入っているものと思っていたが、netinstのisoファイルでインストールした為、少なく済んだと思われる。
次回は、Cisco CSR1000vとEIGRPのネイバ関係を確立させたりDUALで代替経路を探すところを確認し、Ciscoのルータやスイッチと同等にEIGRPを喋る事が出来るか検証したい。


参照サイト
https://aurora.nox.tf/tmp/frr-doc/dev/index.html FRRouting Developer's Guide
https://aurora.nox.tf/tmp/frr-doc/dev/building.html Building FRR
https://aurora.nox.tf/tmp/frr-doc/dev/building-frr-for-debian9.html Building FRR > Debian 9
https://docs.frrouting.org/en/latest/ospfd.html OSPFv2
https://docs.frrouting.org/projects/dev-guide/en/latest/vtysh.html VTYSH
https://github.com/CESNET/libyang libyang
http://docs.frrouting.org/en/latest/overview.html#feature-matrix FRR Feature Matrix