FRRoutingとは

Free Range Routing(FRR)は、Quaggaから派生したUNIX/Linuxプラットフォーム用のフリーでオープンソースのルーティングプロトコルスイートです。BGP/OSPF/RIP/MPLSなどのさまざまなルーティングプロトコルを実装しています。Cisco独自のEIGRPもサポートしています。

リンク

FRRoutingオフィシャルサイト

GNS3サイトの以下の記事をベースにしています。 “Create a Router with Docker and Free Range Routing”

GNS3にFRRコンテナを追加して、ソフトウェアルータとして利用できます。このページでは、FRRコンテナの追加方法とCisco IOSルータとの相互接続例について解説します。

なお、以下の環境に基づいています。

ホストOSWindows10 Pro
GNS3バージョン2.2.17
GNS3 VMバージョン2.2.17
仮想化ハイパーバイザVMware Workstation 16.6.2

FRRコンテナの追加方法

GNS3でFRRコンテナを追加して、ソフトウェアルータとして利用するための手順は次のようになります。

  1. FRRコンテナテンプレートの作成
  2. プロジェクトにFRRコンテナを追加
  3. FRRコンテナの起動

FRRコンテナテンプレートの作成

GNS3でFRRコンテナを利用するためには、まず、テンプレートを作成します。[Edit]→[Preference]→[Docker Containers]から[New]をクリックします。

[Run this Docker container on the GNS3 VM]を選択して[Next]をクリックします。

[New Image]を選択して、[Image name]に「frrouting/frr:latest」と入力して[Next]をクリックします。「frrouting/frr」はDocker Hubに登録されているAlpine LinuxベースのFRRコンテナイメージです。

続いて、テンプレートの任意の表示名を入力して[Next]をクリックします。

そして、ネットワークインタフェース(Adapters)の数を決めて、[Next]をクリックします。ルータとして利用するので、2つ以上のネットワークインタフェースにします。

起動時に実行するコマンドを入力します。シェルを起動するように「sh」と入力します。

コンソールタイプを指定します。デフォルトの「telnet」のままで大丈夫です。

必要ならば環境変数を指定できます。[Finish]でテンプレートの作成終了です。

プロジェクトにFRRコンテナを追加

FRRのDockerコンテナテンプレートを作成すると、[End Device]のツールバーに表示されます。

FRRのテンプレートをワークスペースにドラッグ&ドロップします。GNS3 VM上でdocker pullのコマンドでが自動的に実行されて、指定したコンテナイメージがDocker HubからGNS3 VMにダウンロードされます。コンテナイメージのダウンロードは、初回のみです。docker pullコマンドを実行しているログがGNS3のコンソール上に表示されます。

あとは、ルータなどとFRRコンテナとのリンクを設定すればOKです。

FRRコンテナの起動

FRRコンテナをプロジェクトに配置したら起動します。そして、アイコンをダブルクリックするとコンソールに接続できます。そして、シェルから必要なルーティングデーモンを手動で起動します。FRRのライブラリは/usr/lib/frr内にあります。/usr/lib/frrに移動して、必要なルーティングデーモンを起動してください。以下のようなコマンドを入力します。

cd /usr/lib/frr
./watchfrr zebra ospfd &

上記のコマンド例は、3つのデーモンを起動しています。“watchfrr”はFRRの他のデーモンを監視します。”zebra”は基本的なIPルーティングを行います。”ospfd”は、OSPFv2のルーティングを行います。その他、必要なルーティングデーモンがあれば合わせて起動します。”&”でデーモンをバックグラウンドで動作させます。デーモンを起動したら、Enterでシェルに戻ります。

FRR-1 console is now available... Press RETURN to get started.
/ # cd /usr/lib/frr
/usr/lib/frr # ./watchfrr zebra ospfd &
/usr/lib/frr # 2022/01/26 02:00:24 WATCHFRR: [ZG9QC-QRCJZ] failed to mkdir "/var/tmp/frr/watchfrr.46": File exists
2022/01/26 02:00:24 WATCHFRR: [M1DC0-ZDNYJ] crashlog and per-thread log buffering unavailable!
2022/01/26 02:00:24 WATCHFRR: [T83RR-8SM5G] watchfrr 8.1_git starting: [email protected]
2022/01/26 02:00:24 WATCHFRR: [ZCJ3S-SPH5S] zebra state -> down : initial connection attempt failed
2022/01/26 02:00:24 WATCHFRR: [ZCJ3S-SPH5S] ospfd state -> down : initial connection attempt failed
2022/01/26 02:00:24 WATCHFRR: [YFT0P-5Q5YX] Forked background command [pid 47]: /usr/lib/frr/watchfrr.sh restart all
Cannot stop staticd: pid 65 not running
Cannot stop zebra: pid 60 not running
2022/01/26 02:00:24 ZEBRA: [ZG9QC-QRCJZ] failed to mkdir "/var/tmp/frr/zebra.59": File exists
2022/01/26 02:00:24 ZEBRA: [M1DC0-ZDNYJ] crashlog and per-thread log buffering unavailable!
2022/01/26 02:00:24 ZEBRA: [NNACN-54BDA][EC 4043309110] Disabling MPLS support (no kernel support)
2022/01/26 02:00:24 STATIC: [ZG9QC-QRCJZ] failed to mkdir "/var/tmp/frr/staticd.64": File exists
2022/01/26 02:00:24 STATIC: [M1DC0-ZDNYJ] crashlog and per-thread log buffering unavailable!
2022/01/26 02:00:24 WATCHFRR: [QDG3Y-BY5TN] zebra state -> up : connect succeeded
2022/01/26 02:00:29 WATCHFRR: [YFT0P-5Q5YX] Forked background command [pid 67]: /usr/lib/frr/watchfrr.sh restart ospfd
Cannot stop ospfd: pid 88 not running
2022/01/26 02:00:29 WATCHFRR: [QDG3Y-BY5TN] ospfd state -> up : connect succeeded
2022/01/26 02:00:29 WATCHFRR: [KWE5Q-QNGFC] all daemons up, doing startup-complete notify

/usr/lib/frr #

そして、vtyshコマンドでCisco IOSライクなインタラクティブシェルを起動できます。

vtysh

vtyshコマンドを入力した際のログは次のようになります。

/usr/lib/frr # vtysh
% Can't open configuration file /etc/frr/vtysh.conf due to 'No such file or directory'.

Hello, this is FRRouting (version 8.1_git).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

FRR-1#

あとは、Cisco IOSと同じようなコマンドでルータの設定が可能です。

リンク

FRRoutingの詳しい設定方法や各デーモンのコマンドは、オフィシャルサイトをご覧ください。

FRRとCisco IOSの相互接続

次のシンプルなネットワーク構成で、FRRとCisco IOSの相互接続を行います。ルーティングプロトコルとしてOSPFv2を利用します。

私の環境ではEIGRPがうまく動作しませんでした。そのため、OSPFv2を利用した相互接続の確認を行っています。

FRR-1の設定

interface eth0
 ip address 192.168.0.1/24
exit
!
interface eth1
 ip address 192.168.1.254/24
exit
!
router ospf
 network 192.168.0.0/24 area 0
 network 192.168.1.0/24 area 0
exit

IOS-1の設定

interface FastEthernet0/0
 ip address 192.168.0.2 255.255.255.0
 no shutdown
!
interface FastEthernet0/1
 ip address 192.168.2.254 255.255.255.0
 no shutdown
!
router ospf 1
 log-adjacency-changes
 network 192.168.0.0 0.0.255.255 area 0

ルーティングテーブルと通信の確認

FRR-1のルーティングテーブルは次のようになります。

FRR-1# 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

O   192.168.0.0/24 [110/10000] is directly connected, eth0, weight 1, 00:01:05
C>* 192.168.0.0/24 is directly connected, eth0, 00:01:53
O   192.168.1.0/24 [110/10000] is directly connected, eth1, weight 1, 00:01:48
C>* 192.168.1.0/24 is directly connected, eth1, 00:01:53
O>* 192.168.2.0/24 [110/10010] via 192.168.0.2, eth0, weight 1, 00:01:00

IOS-1のルーティングテーブルは次のようになります。

IOS-1#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

C    192.168.0.0/24 is directly connected, FastEthernet0/0
O    192.168.1.0/24 [110/10010] via 192.168.0.1, 00:01:44, FastEthernet0/0
C    192.168.2.0/24 is directly connected, FastEthernet0/1

FRR-1とIOS-1のルーティングテーブルに必要なOSPFルートが登録されているので、PC1-PC2間の通信ができます。PC1からPC2へPingを実行すると、応答が返ってきます。

PC1> ping 192.168.2.100
84 bytes from 192.168.2.100 icmp_seq=1 ttl=62 time=31.817 ms
84 bytes from 192.168.2.100 icmp_seq=2 ttl=62 time=32.801 ms
84 bytes from 192.168.2.100 icmp_seq=3 ttl=62 time=31.506 ms
84 bytes from 192.168.2.100 icmp_seq=4 ttl=62 time=31.073 ms
84 bytes from 192.168.2.100 icmp_seq=5 ttl=62 time=30.563 ms